The third-placed Cottagers moved five points behind Cardiff in second after midfielder McDonald scored off his backside before in-form Aleksandar Mitrovic added a second.
Fulham, who have won six of their last seven matches, extended their record-breaking unbeaten league run to 18 matches.
The hosts opted to restore Ryan Sessegnon to their line-up after resting him for Friday’s 2-0 victory at Norwich.
And it was the Cottagers who had the first significant chance of the game as Mitrovic fired wide from Matt Targett’s cross from the left.
Fulham went even closer shortly afterwards as Floyd Ayite hit a post from another cross from the left, this time from Sessegnon.
Mitrovic was then denied by visiting goalkeeper Bailey Peacock-Farrell following his header from Tom Cairney’s corner.
Leeds lost midfielder Eunan O’Kane, who was forced off through injury after just 23 minutes.
Fulham continued to offer the main threat with Ayite’s shot deflecting wide and from the resulting 33rd-minute Targett corner took the lead in freak fashion.
Mitrovic’s header down hit a stationary McDonald and trickled past a stranded Bailey Peacock-Farrell.
Leeds offered a response just before the break with captain Gaetano Berardi shooting wide on the volley from Pablo Hernandez’s corner.
Fulham started the second half well with Stuart Dallas heading straight over his own crossbar from Ryan Fredericks’ threatening cross.
They went close again as Mitrovic inadvertently blocked a shot from team-mate Sessegnon, who then was denied by Peacock-Farrell after he had exchanged passes with Stefan Johansen.
Leeds offered the occasional scare for the hosts on the break with Ronaldo Vieira’s 30-yard shot going wide.
They then missed an even better one after 63 minutes as Caleb Ekuban was denied by Marcus Bettinelli in a one-on-one - and Fulham went straight down the other end to score on the break.
On-loan Newcastle striker Mitrovic made it eight goals in as many games as he slotted home after exchanging passes with Cairney.
The hosts continued to attack, with Fredericks firing into the side netting, while Leeds had a penalty appeal waved away after Dallas went down under a challenge from Bettinelli.
And the visitors’ evening was summed up when substitute Jay-Roy Grot headed over with the goal at his mercy following Samuel Saiz’s late cross.
Fulham: Bettinelli, Fredericks, Odoi, Ream, Targett, Johansen, McDonald (Kalas 88), Cairney, Ayite (Norwood 67), Mitrovic, Sessegnon. Subs Not Used: Kebano,Piazon,Christie,Button,Kamara.
Leeds United: Peacock-Farrell,Dallas, Jansson, Pennington, Berardi, O’Kane (Phillips 23), Vieira, Alioski (Grot 72), Saiz, Hernandez, Ekuban (Lasogga 72). Subs Not Used: Lonergan,Anita,Cibicki,Pearce.
Referee: Peter Bankes (Merseyside).