Steed Malbranque struck twice to sink the club who hope to land him during the January transfer window.
He tapped home Luis Boa Morte's pass to put Fulham ahead after six minutes.
Lee Croft quickly levelled against the run of play as Fulham threatened to make a mockery of City's impressive progress this season.
Malbranque, who rejected a £5m summer move to City but is expected to become a target again, rounded David James to score the winner after 44 minutes.
Fulham took advantage of a nightmare defensive display from City early on to take the lead through Malbranque.
Richard Dunne's clumsy attempt at a clearance let Boa Morte in, and he crossed invitingly for Malbranque to sidefoot home from close range.
And with City in disarray, Tomasz Radzinski was only inches away from adding a second three minutes later when he stretched but just failed to connect from six yards.
Joey Barton was then fortunate to escape a straight red card for a dreadful challenge on the touchline that left Malbranque writhing in agony, referee Rob Styles choosing to only show yellow.
City, almost unbelievably given the standard of their performance, were level after 20 minutes when Stephen Ireland played in Croft for a cool finish over the advancing Tony Warner.
Stuart Pearce's side lost Kiki Musampa shortly before half-time, when he limped off with a hamstring injury to be replaced by Antoine Sibierski.
It was the signal for Fulham to regain the lead, with the partnership between Boa Morte and Malbranque combining perfectly again.
The Portugal star was again the creator, releasing Malbranque to round James and score.
City opened the second half with greater purpose, and Andy Cole twice posed a threat to his former club.
He miskicked when well placed on the edge of the area, then headed Ireland's free-kick just wide.
Radzinski then almost extended Fulham's lead with a shot that beat James at the near post, but struck the woodwork.
James then kept City in the game with a stunning double save, first from Collins John's volley then at the feet of the incoming Brian McBride.
Substitute Bradley Wright-Phillips thought he had levelled for City in the dying seconds, but the goal was ruled out for offside.
Then amid farcical scenes, goalkeeper James - up for a free-kick - lost possession on the edge of the Fulham penalty area.
Fulham swept forward, but when the unselfish Malbranque sacrificed a hat-trick to set up Radzinski in front of an unattended goal, the striker fumbled the chance hopelessly to allow Sun Jihai to clear.
Fulham manager Chris Coleman:
"It was a great performance. I'm really delighted. We have had a lot more purpose about our play this season and showed it again.
"We have not always got the results we have deserved, but we did here against a very good, strong, well-organised City team.
"We picked up where we left off against Liverpool here at home, and I was delighted for Steed Malbranque to get two goals as well because his attitude and performance was excellent.
"I don't know anything about transfer speculation regarding Steed. We never want to sell our best players.
"I'm looking forward to discussing a new contract with him and I'm confident we can sort something out."
Manchester City manager Stuart Pearce:
"The result was down to the first 45 minutes. You've got to start right and we didn't.
"You don't get second chances in the Premiership. Mistakes or slackness will be punished and that is what happened here.
"I've told the players we have got to be at it day in and day out otherwise we will be on the wrong end of results. Fulham deserved to win and we are disappointed."
Fulham: Warner, Volz, Bocanegra, Goma, Niclas Jensen, Radzinski, Diop, Malbranque, Boa Morte, McBride (Helguson 77), John.
Subs Not Used: Knight, Batista, Rosenior, Elrich.
Booked: Boa Morte.
Goals: Malbranque 6, 44.
Man City: James, Mills (Jihai 68), Dunne, Distin, Ireland, Jordan (Wright-Phillips 80), Croft, Musampa (Sibierski 43), Barton, Cole, Vassell.
Subs Not Used: Thatcher, De Vlieger.
Booked: Barton, Croft, Jordan.
Goals: Croft 20.
Ref: R Styles (Hampshire).