2016-09-13 6 views
2

私は、AJAX呼び出しがあるプロジェクトで作業しています。このAJAX呼び出しでは、Excelファイルを含むBLOBで応答します。私は、コードをダウンロードしてファイルを開き、応答を取得します。Firefox a.clickはブレークポイントなしで起動しません

var blob = new Blob([response.data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}); 
var objectUrl = URL.createObjectURL(blob); 
var a = document.createElement("a"); 
var header = response.headers("Content-Disposition"); 
a.download = header.substring(header.indexOf("filename=") + "filename=".length); 
a.href = objectUrl; 
document.body.appendChild(a); 
console.debug("Clicking a tag"); 
a.click(); 
document.body.removeChild(a); 
window.URL.revokeObjectURL(objectUrl); 

このコードはchromeではうまく動作しますが、firefoxではa.click()が起動しても何も起こりません。コールバックが起こっていることを知っているので、デバッグステートメントが表示されます。また、何らかの理由で、私がa.click()にブレークポイントを置くと、それは完全に動作します。

クリックがデバッグモードでのみ機能する理由を説明できますか?

答えて

2

Firefoxは、このようなことを回避するために、いくつかのセーフガードや奇妙な動作があります。私は導出を知っているが、クリックを行う前に一瞬のために戻ってブラウザに降伏することは、通常、それをクリアしていない:setTimeout次のコードは、setTimeout前に内容を実行することを

// ... 
a.href = objectUrl; 
document.body.appendChild(a); 
setTimeout(function() { 
    a.click(); 
    document.body.removeChild(a); 
    window.URL.revokeObjectURL(objectUrl); 
}, 0); 
// ... 

注意し。

あなたも、2を必要としない場合があります

// ... 
a.href = objectUrl; 
document.body.appendChild(a); 
setTimeout(function() { 
    a.click(); 
    setTimeout(function() { 
     document.body.removeChild(a); 
     window.URL.revokeObjectURL(objectUrl); 
    }, 0); 
}, 0); 
// ... 
+0

ませサイコロを。私は結果を出さずにそれを試しました。 – user2752635

+0

@ user2752635:私は間違っているかもしれません、あなたは*クリック*の後にそれを必要とするかもしれません。上記の両方の場所に例を追加しました。私はまた、約1年前にFirefoxで何かを覚えていることを覚えています。ここで '0'タイムアウトは動作しませんでしたが、' 10'タイムアウトはありませんでした。 (その時点で私は全面的な考え方を再考することにしました。私はそれに慣れていませんでしたので...-)) –

+1

これは私の問題を解決します。私は 'setTimeout(fn、0)'を自分のコード(特に入れ子になっている)に置いても大丈夫ですが、うまくいけば動作します。 – user2752635

関連する問題