イベントキャンセル

<form onsubmit='foo();return false'>

またはfoo()がfalseを返すようにしておいて

<form onsubmit='return foo()'>

ただし、foo()内でfalseを返しているだけではダメなので注意。

関数内でのreturn falseとイベントハンドラ内のreturn falseはよく考えると別物ですね。
自分で作った関数のリターン値なんて、誰もみてくれないんですよね。
しかし、イベントハンドラ方はブラウザがみてくれる...。
結論からいうと、onClickでの処理そのものをreturn falseしないといけないんです。