The Dockers extended their unbeaten run to eight matches, winning 10.7 (67) to 4.5 (29), in front of 31,637 fans who braved the weather.
The wet conditions played into the Dockers' hands. Neither side managed a goal until Michael Barlow soccered a goal from the goalsquare in the dying seconds of the opening term to give Fremantle a seven-point lead at the first change.
It was the class of Nathan Fyfe that separated the two sides in the second. After Aaron Mullet produced a fabulous running goal to start the term, Fyfe's brilliance shone brightly on a dull day.
He took a clutch contested mark and converted from a tight angle. His skills and poise in the wet stood out and Fremantle's pressure suffocated the Kangaroos who managed just 1.3 for the first half, trailing by 27 points at the long break.
Fremantle's pressure dropped off in the third term and opened the door for North Melbourne.
Brent Harvey took a courageous mark going back with the flight and converted the set shot to cut the margin to 21.
Harvey gave that goal back immediately with an ill-disciplined act.
Frustrated with the close attention of tagger Ryan Crowley, Harvey struck Crowley in the throat leading to a 50m penalty and a goal to Michael Johnson.
The Kangaroos stuck to their task admirably but couldn't make significant inroads into the Dockers' lead.
The Dockers' 25-point margin at three-quarter time was cut to 19 when Aaron Black kicked a goal early in the final term to give North Melbourne hope.
But the glimmer was snuffed out with a steadying set shot from Hayden Crozier who had been subbed in for Jack Hannath at the last change.
Michael Walters added to a burgeoning highlight reel with a sublime snap from hard against the boundary line to seal the Dockers' ninth win of the year.
Lindsay Thomas was subbed out during the third term with a left-hamstring injury. The leader in the Coleman Medal race coming into round 13 was held goalless for just the second time this season before he was substituted.
Freo's Stephen Hill ran to the bench in the final term after hurting his shoulder in an innocuous-looking clash.
Fremantle: Suban 2, Barlow, Crozier, de Boer, Fyfe, Johnson, Mayne, Hannath, Walters
North Melbourne: Black, Macmillan, Mullett, Harvey
Fremantle: Fyfe, Barlow, Crowley, Clarke, Ibbotson, de Boer
North Melbourne: Swallow, Bastinac, Atley, Gibson, Mullett
Fremantle: Mundy (calf) replaced in selected side by Hayden Crozier, Hill (shoulder)
North Melbourne: Thomas (left hamstring)
Fremantle: Hayden Crozier replaced Jack Hannath at three-quarter time
North Melbourne: Brad McKenzie replaced Lindsay Thomas during the third quarter
Umpires: Rosebury, Stevic, Mollison
Official crowd: 31,637 at the Patersons Stadium