Fifth-placed Cardiff, who won 2-0 at The Hawthorns in December, took the lead in the eighth minute when Jonas Olsson fouled Jay Bothroyd and Peter Whittingham netted his 19th goal of the season from the spot.
West Brom's Andwele Slory hit a post in the 24th minute before Gianni Zuiverloon restored parity on the stroke of half-time, and the point was secured when Cardiff's Chris Burke missed a late chance.
Robert Earnshaw's 150th career league goal earned third-placed Nottingham Forest a 1-0 win over Sheffield United at the City Ground, where the Blades had striker Darius Henderson sent off following an off-the-ball incident.
Bottom club Peterborough deservedly came from behind to beat Ipswich 3-1.
Daryl Murphy headed his third goal in as many matches for Ipswich from Grant Leadbitter's cross but Liam Dickinson equalised from long range shortly after half-time.
Dickinson was involved again as Lee Frecklington started and finished an excellent move to put Posh in front and Frecklington's corner was then headed in by Craig Morgan.
Rob Hulse scored twice as a second-half onslaught saw Derby beat Preston 5-3.
Jon Parkin put North End ahead on his 300th league appearance but a Billy Jones own goal and Kris Commons' strike put the Rams 2-1 up.
Preston levelled as Chris Sedgwick finished off a neat move - only for Hulse to immediately volley Derby back into the lead.
Shaun Barker headed their fourth and Hulse made it five after goalkeeper Andy Lonergan's error, rendering Chris Brown's late goal irrelevant.
Brett Ormerod's 30th-minute strike set Blackpool on their way to a home victory which ended Middlesbrough's six-game unbeaten streak. Matthew Gilks saved Boro striker Scott MacDonald's second-half penalty before DJ Campbell made it 2-0.
On-loan Elliott Ward marked his Doncaster debut with a goal as he superbly converted Billy Sharp's cross five minutes before the break at Sheffield Wednesday.
Sharp's shot was deflected in by defender James O'Connor in the second half to seal a 2-0 win.
Paul Hayes' last-minute goal for Scunthorpe saw Barnsley suffer a third successive defeat for the first time under Mark Robins' management.
Gary Hooper's deft finish had put Scunthorpe ahead five minutes after half-time before Daniel Bogdanovic seized on Rob Jones' howler to equalise.
Damien Johnson scored after a twice-taken penalty to earn Plymouth a draw with Swansea. Angel Rangel set up Darren Pratley to put Swansea ahead before Argyle's dramatic leveller.
Jamie Mackie's spot-kick was saved but goalkeeper Dorus De Vries was adjudged to have moved off his line. De Vries also saved Johnson's effort, but the midfielder followed up to secure a 1-1 draw.
Bristol City were dramatically denied by Leicester at Ashton Gate. David Clarkson put the Robins ahead in injury time, only for Lloyd Dyer to earn the visitors a 1-1 draw.
QPR's clash with Watford at Loftus Road was postponed due to a waterlogged pitch.