Ten-man Fulham equalized in the 88th minute to claim a dramatic point after a thrilling afternoon at the Emirates.
The visitors took a surprise lead in the first minute when a poor back-pass from Bukayo Saka sent Andreas Pereira across goal before he slipped past Aaron Ramsdale at his near post.
Mikel Arteta’s side poked and prodded for an equalizer from then on, with Kai Havertz going close and Martin Ødegaard seeing a shot denied by Bernd Leno.
It looked set to be a frustrating afternoon for the Gunners until substitute Fabio Vieira’s sensational save turned the game on its head.
The Portuguese midfielder won a penalty for his side after being brought down in the box by Kenny Tete, who made no mistake with Saka from 12 yards and sent Leno the wrong way.
Arsenal completed the turnaround minutes later when Vieira was involved again, this time providing a tantalizing low cross that was headed home by fellow substitute Eddie Nketiah, who got ahead of his keeper at the near post.
It looked like it would be the afternoon when Calvin Bassey was sent off for a second bookable offence, but there was one final sting to the story.
Harrison Reed’s corner found the feet of João Palhinha, who curled a right-footed volley into the bottom corner to earn a rare and surprise point for Marco Silva’s men.
Arsenal’s 100% winning start was ended by Fulham, who shook off last weekend’s defeat to Brentford to stun at the Emirates.
Arsenal player ratings (4-3-3)
GK: Aaron Ramsdale – 5/10 – Caught off his goal line for the very early opener but the keeper was hardly to blame.
RB: Thomas Partey – 3/10 – Reluctantly trundled back into defence when Arsenal lost the ball, repeatedly leaving Arsenal’s awkward rearguard exposed.
CB: Ben White – 3/10 – Skittish when lured into a physical duel with Raul Jimenez and too transfixed with playing a defence-splitting pass every time he had possession.
CB: William Saliba – 6/10 – Had to rely upon his supreme physicality to make a number of last-ditch interventions.
LB: Jakub Kiwior – 5/10 – Unfussy off the ball but offered little in possession.
CM: Martin Odegaard – 7/10 – Peppered the match with some wondrously silky touches that inspired gasps from the crowd.
CM: Declan Rice – 5/10 – Invariably collected the ball in front of Fulham’s block, rather than within the opposition’s shape from where his passes could cause more damage.
CM: Kai Havertz – 4/10 – Burst into the right places, regularly at the right time. Yet, all too often, Havertz didn’t prove to be the right player.
RW: Bukayo Saka – 8/10 – Hell-bent on rectifying his first-minute fumble, Saka ran around, behind and through Fulham’s Antonee Robinson.
ST: Leandro Trossard – 4/10 – Hooked at half-time after he was repeatedly let down by a heavy first touch.
LW: Gabriel Martinelli – 6/10 – Unrelenting in his fervour on and off the ball.
SUB: Eddie Nketiah (46′ for Trossard) – 7/10 – Offered a more fixed focal point than Trossard, as evidenced by his simple tap-in from point-blank range.
SUB: Oleksandr Zinchenko (56′ for Partey) – 7/10 – Immediately caught up to the break-neck pace of the contest, adding another link in the chain of Arsenal’s passing network.
SUB: Fabio Vieira (56′ for Havertz) – 8/10 – Bursting beyond Fulham’s backline, Fulham couldn’t contain Vieira’s dynamism.
SUB: Jorginho (84′ for Odegaard) – 5/10
SUB: Gabriel Jesus (90′ for Rice) – N/A
Subs not used: Raya (GK), Nelson, Smith Rowe, Gabriel