このソリューションを使用してみました:
- ページに非表示の iframe を追加する
- target 属性を使用してフォームを iframe に投稿する
- iframe の onLoad イベント (フォーム ポストによってトリガーされる) を使用して、ボタンをリセットします。
これは Firefox では機能しますが、サーバーの応答がファイルの場合、Chrome では onLoad イベントがトリガーされません。
私が解決した解決策は、Cookie を使用し、すべてのブラウザーで動作します。
- ユーザーがダウンロード ボタンをクリックすると、ランダムな値を含む非表示フィールドがフォームに追加されます。
- サーバーで、ランダムな値を含むフォーム フィールドを探し、同じ値で Cookie を設定します。Cookie は、次のサーバー応答で設定されるため、ダウンロードが開始されます。
- クライアントで、約 1 秒ごとに Cookie のポーリングを開始して、手順 1 のランダムな値を探します。
- クライアントが値を見つけたら、ボタンをリセットします。
これは、ダウンロード ボタンのイベント ハンドラーからの関連コードで#nonce
、ランダムな値を配置する隠しフィールドです。
var nonce = Math.random(); // generate random number
$("#nonce").val(nonce); // set number as field value
$("#downloadDataset").button('loading'); // set button to loading state
var downloadTimer = setInterval(function () { // start polling the cookies
if (document.cookie.indexOf(nonce) != -1) {
$("#downloadDataset").button('reset'); // reset button
clearInterval(downloadTimer); // stop polling the cookies
}
}, 1000); // check every 1000ms