[JavaScript]submitとbeforeunload

2016-05-13


某有名jQuery Plugin、DataTablesにて、入力フォームを作ったのですが、お客様から「フィルタしたまま確定すると、フィルタされた情報が送信されない」とのお叱りをいただいてしまいました・・・。

原因はDataTablesの仕様を理解してなかったことで、フィルタ中、display: none的な非表示になってるだけかと思いきや、要素ごと消えちゃうんですね。これでポストしても情報は送れないのはしょうがない。

今回とった対応は、「画面遷移前にフィルタをクリアしちゃえばいいじゃないか」というもの。今回のシステムでは、DataTablesを呼び出す部分はライブラリ化してあり、フィルタ使ってる部分は全部、そのライブラリ経由になってる。では、このライブラリだけで済むような修正方法を、ということで、画面遷移時に発生するイベントにリスナーを登録する処理をライブラリに埋め込むことにしました。

ようやっと本題です。では、どのイベントに登録すればよいか?結論は「submit」です。
例えば、function hogehoge()ってリスナーを登録するのであれば、


// falseはuseCapture。falseで利用しない。
window.addEventListener("submit", hogehoge, false);

になります。

「そりゃ、ポスト前なんだからsubmitに決まってるじゃん」と言われればそうなんですが、、、(個人的に)似たようなイベントとして「beforeunload」というイベントがあるんですね。これは、画面遷移前に発火するイベントで、今回は「画面遷移前に」という発想から入っちゃったので、最初、こっちを試したんです。ところが、このbeforeunload、どうやらsubmitより後に呼ばれるみたいで。このタイミングでDataTablesのフィルタをクリアしてもポストされない、なんだこりゃ?と思った次第です。

画面遷移前にこちょこちょJavaScript動かすことはよくある要件かと思いますが、イベントの種類に注意!という投稿でしたー