Iowa's players wore all-black helmets in memory of three Iowa professors and a graduate student shot to death Friday by another graduate student, who later killed himself.
Rodgers completed 20 of 27 passes for 258 yards before leaving the game with a sprained ankle late in the third quarter.
Ohio State, which came in averaging 255 yards rushing a game, was limited to 124 yards on the ground and 97 more passing. Meanwhile, Iowa totaled 443 yards, including 283 passing.
Iowa, which had beaten the Buckeyes at Ohio Stadium only once since 1960, moved to 7-1 and remained tied for second place in the Big Ten with Indiana with a conference record of 4-1.
Trailing 16-9 late in the game, Ohio State (6-2, 3-2) twice drove into Iowa territory. But after a first down at the Iowa 48 with six minutes remaining, Graham was called for intentional grounding while being pressured by Leroy Smith and Brian Wise and Ohio State was eventually forced to punt.
The Buckeyes' last possession began with 3:23 left and they drove to a first down at the Iowa 41 with two minutes remaining. Graham's pass on first down was dropped by Bernard Edwards. On second down, Leroy Smith and Ron Geater sacked him for a 9-yard loss. On third down, linebacker John Derby batted down a pass for Joey Galloway. Then on fourth and 19 at midfield with 1:37 left, Graham's pass in the end zone for Galloway was knocked down by Gary Clark.
Rodgers had opened the scoring on a 1-yard plunge, with Ohio State answering on a run-only drive from midfield.
Carlos Snow rushed on all eight plays of the 50-yard drive, scoring on a 2-yard run, to draw Ohio State even at 7 midway through the second quarter. Snow did not carry again, however, because of a head injury.
Late in the first half, Rodgers flipped a short pass to wide-open tight end Alan Cross in the right flat, Cross lumbering 61 yards for the touchdown and a 13-7 lead.
On the extra-point attempt, however, Ohio State's Greg Smith blocked the kick by Jeff Skillett and outside linebacker Jason Simmons picked up the loose ball and returned it 85 yards for a defensive safety to cut the lead to 13-9.
Skillett, who had earlier missed on a 32-yard attempt, added the only points of the second half on a 30-yard field goal late in the third quarter.
The game was played before 95,357, the largest crowd ever in the expanded Ohio Stadium.