2016-10-14 15 views
3

navigator.sendBeaconをコンソールで直接呼び出すと、Chrome devツールのネットワークペインでリクエストがすぐに正常に表示されます。sendBeaconリクエストがアンロードイベントにアタッチされたときに「(保留中)」と表示される

beforeunloadイベントにsendBeaconを添付してページから移動すると、ネットワークペインに追加された行が表示されますが、ステータスは「(保留中)」に止まっていて送信されません。

私は間違っていますか?

window.addEventListener('beforeunload', function() { 
    navigator.sendBeacon(
     'https://www.example.com/sendBeacon-data-collector', 
     'Sent by a beacon!'); 
    }, false); 
+0

私にとっても同じ問題です。あなたは答えを見つけましたか? – vtk13

答えて

1

あなたは接続が「保留中」で止まっていて、送信しないと言います。送信しなかった場合、ネットワークペインに接続が全く表示されないので、が実際に送信することが確認されます。

期待されている行動(観測のみで経験的に確立した主張)と思われる「保留中」に固執している状態については、定義上、sendBeaconコマンドは答えを期待していないので、サーバーからの可能な応答(私の部分の純粋な推測)を決して読んでいないので、ブラウザが接続が機能しているかどうかを表示していないのが普通です。

とにかく私はウェブアプリケーションにsendBeaconを持っています。これは、 "保留中"のステータスにもかかわらず正常に動作しているデータベースに最後のデータを保存します。したがって、データが届かない場合は、問題が他の場所にある可能性があります。

たとえば、適切な形式でデータを送信する必要があります。 HTMLフォームからデータを読み取るスクリプトと互換性を持たせるには、単純にJSON文字列を送信するだけではなく、文字列をformdataに配置する必要があります(そうでなければ、サーバ側の生の投稿データから取得できます)

例:

var fd = new FormData(); 
    fd.append('data', JSON.stringify(beaconData)); 
    navigator.sendBeacon("inc/php/saveData.php", fd); 

また、あなたはsendBeaconは常にPOSTパラメータを介してデータを送信することを認識する必要があります。 GETを使用する場合は、自分でURLにデータを追加する必要があります。

+0

あなたが言及したようにデータが送信されているのかどうか分かりません。同じ問題があり、ネットワークログには次のようなメッセージがあります。ステータス:(保留中);サイズ:0B;保留中の時間; 0でキューに入れられた; 0で開始された;接続開始:ストールした 'これは接続が開始しないことを意味すると思います。 –

+0

私の場合、それは確かに送信しました:私はPHPスクリプトがテキストファイルにデータを書き出していたので、それがサーバによって受信されたことを確認することができました。 –

+0

私はangular4 SPAで使用している可能性がありますか? –

関連する問題