The visitors led by 26 points at the first break, but the Roos clawed that back in the second, extended in the third and hung on in the fourth to record their fourth win of the season, 14.14 (98) to 12.13 (85).
The loss snaps a three-game winning streak for Fremantle, and leaves both teams caught in the morass that is the middle of the ladder.
David Hale kicked five to lead all-comers in the game, while for Fremantle, Luke McPharlin managed four.
A tiny crowd of just 15,436 means that while North won the four points, they will have lost a considerable sum on the gate.
North's disposal and decision-making in the first term was awful, leading to Fremantle grabbing its best-ever first term against North, and at Docklands.
North got the first, but Fremantle replied from the bounce, then added a couple more. The Roos got another after a terrific run down the wing from Petrie, but three more to the visitors saw them lead by 26 at the first break.
Whatever coach Dean Laidley said to his troops at quarter time worked a treat, with a vastly different attitude leading to the first two goals from marks to talls before Daniel Wells turned on the dodge and weave magic for the third.
Some good work from Michael Johnson led to McPharlin's second, but two more to North got the game back to evens.
Fremantle then got out to a 12-point lead after some poor decision-making and skills from North, but a gimme goal to Hale just before the siren – an infringement in the centre by Chris Tarrant getting him the ball at the top of the goal square – meant just a five-point deficit at the long break.
The third term began like the first, with plenty of errors from both sides, but the ball was spending most of the time in the Roos forward line, and Hale got the first before Des Headland replied.
But then North kicked the final three of the term – the last one from a shocking Tarrant kicking/decision error, and the Roos led by 13 at the last change.
In the last, two goals to each team saw no change to the eventual margin, although each squandered chances either to seal the match, in North's case, or make a late charge for victory.
For North, Hale was terrific up forward, while Drew Petrie was good on the wing in a Matthew Richardson-style role.
Through the midfield, Brady Rawlings played wide of Paul Hasleby and gathered 24 disposals, Adam Simpson won 23, Gavin Urquhart was classy and hard-working with 19 possessions, while Wells recovered from a poor first term to have a good influence.
Hasleby was his usual hard-working self in the Fremantle midfield, Matthew Pavlich was good either in the midfield or forward late in the game, youngster Garrick Ibbotson combined hard work with class, and Aaron Sandilands easily won the hit-outs with 43, although the Roos won the clearances 30-26.
Jack Ziebell had a scare in the last when he went off with a shoulder injury, but he was declared okay by the Roos medical staff, unlike Roger Hayden, who tweaked a calf in the second term forcing him from the field.
The game was notable for just the second ever free kick paid for a deliberately rushed behind – Steven Dodd was nearly 10m clear when he punched the ball over the line, leaving the umpire with a simple decision, and Aaron Edwards completed the conversion to get the Roos back to level late in the third term
Next week, the Kangaroos take on the Lions at Docklands, while Fremantle is up against Richmond at Subiaco.
North Melbourne 2.3 8.8 12.11 14.14 (98)
Fremantle 6.5 9.7 10.10 12.13 (85)
GOALS
North Melbourne: Hale 5, Warren 2, Goldstein, Edwards, Wright, Petrie, Harding, Wells, Rawlings
Fremantle: McPharlin 4, Pavlich 3, Hasleby 2, Hayden, Headland, Peake
BEST
North Melbourne: Petrie, Hale, Gibson, Rawlings, Harding, Firrito, Urquhart.
Fremantle: Hasleby, Pavlich, Ibbotson, Sandilands, McPharlin, Hill, Dodd.
INJURIES
North Melbourne: TBA
Fremantle: Hayden (calf).
Reports: Nil
Umpires: McBurney, Stewart, Nicholls
Official crowd: 15,436 at Docklands
The views expressed in this article are those of the author and not necessarily those of the club