<form onsubmit='foo();return false'>
またはfoo()がfalseを返すようにしておいて
<form onsubmit='return foo()'>
ただし、foo()内でfalseを返しているだけではダメなので注意。
関数内でのreturn falseとイベントハンドラ内のreturn falseはよく考えると別物ですね。
自分で作った関数のリターン値なんて、誰もみてくれないんですよね。
しかし、イベントハンドラ方はブラウザがみてくれる...。
結論からいうと、onClickでの処理そのものをreturn falseしないといけないんです。