Tottenham made the short trip to east London knowing they could heap pressure on Chelsea before their game against Middlesbrough on Monday.
Mauricio Pochettino's side were going for a 10th straight Premier League win, and headed into the game boosted by a 2-0 win against arch-rivals Arsenal last weekend.
But they lacked invention against a well-drilled West Ham side, who won against one of the top eight sides for the first time in 15 attempts this season.
Spurs had scored 71 goals in their previous 34 league games, a tally bettered only by Chelsea, but only briefly tested Adrian with two quick-fire efforts in the first half.
Kane's long-range shot was diverted wide by the Spaniard's left boot, before the home keeper showed quick reactions to block Dier's near-post header from the resulting corner.
Once the Hammers went ahead through Lanzini, the confidence of the visitors appeared to sap.
Spurs trailed 2-1 against the Hammers after 89 minutes at White Hart Lane earlier in the season, only to win 3-2. That never looked like happening at a raucous London Stadium.
Their attacks lacked conviction, only Christian Eriksen going close with a 25-yard effort which flew past the right-hand post, as West Ham saw out the final few minutes to seemingly ruin Spurs' quest for a first title since 1961.
"We are still fighting," said Pochettino. "We must wait but it is now more difficult."
Antonio Conte's side will secure the title on Friday, 12 May if they beat both Middlesbrough and West Brom.