6

ユーザーがページを閲覧する時間を測定するコンテンツスクリプトがあります。これを行うには、コンテンツスクリプトを各ページに挿入し、タイマーを開始して、onbeforeunloadイベントがトリガーされたときにアドオンにメッセージを戻します。コンテンツスクリプトからアドオンへメッセージを送信onbeforeunload?

しかし、メッセージはバックグラウンドスクリプトに渡されることはありません。

main.jsはこのようになっていることを考える:

var pageMod = require('page-mod'), 
    self = require("self"); 

pageMod.PageMod({ 
    include: "http://*", 
    contentScriptFile: [self.data.url('jquery.min.js'), 
         self.data.url('content.js')], 
    onAttach: function(worker) { 
    worker.port.on('pageView', function(request) { 
     console.log("Request received"); 
    }); 
    } 
}); 

私は、次のコードには問題を使用していないmain.jsにメッセージを送ることができます。

self.port.emit('pageView', { visitTime: time }); 

ただし、ユーザーがページを離れるときに問題が発生します。私はこのようにそれを行うと、メッセージが受信されることはありません:

$(window).bind('onbeforeunload', function(e) { 
    self.port.emit('pageView', { visitTime: time }); 
    // This should prevent the user from seeing a dialog. 
    return undefined; 
}); 

私はどちらか動作しませんので、あまりにもbeforeunloadのために聞いてみました。何が問題なの?

+0

文書の準備が整った後に 'onbeforeunload'をバインドしていますか?第二に、あなたは直接イベントを添付しようとしましたか? 'window.onbeforeunload = function(e){ self.port.emit( 'pageView'、{visitTime:time}); //これにより、ユーザーはダイアログが表示されなくなります。 戻り値は未定義です。 }; 'jQueryでjQueryでjQueryをバインドするとjQueryが機能しません。直接的な方法では動作します –

+0

私は直接的な方法(数日前に質問をしました)を試みたと確信していますが、あなたに戻ってください。バインディングはjQueryの準備が整った後に行われます。 –

+0

[このフィドルを試してください](http://jsfiddle.net/CD6DV/1/)、jqueryとjavascriptの順序を入れてください。私がjQueryに 'onbeforeunload'を置くと、私は100%javascriptによる処理とjQueryによる処理を見ることになります。 'beforeunload'がjQueryで使用されると、私は断続的な動作を見ます。したがって、私はjavascriptが最も安定したものだと思っています。あなたが跳ね返るかもしれない別のこと:すべてのコードが実行されているとは限りません。コード内に 'alert(" something ");'を追加しようとすると、実行されていません。 'return undefined'を文字列に置き換えると、少なくともページを残すことを確認するダイアログが表示されます。 –

答えて

2

window Firefoxブラウザアドオンでコンテンツスクリプトにアクセスするオブジェクトは、プロキシオブジェクトであり、少し気になることがあります。 window.addEventListenerを使用すると動作します。

window.addEventListener('beforeunload', function(e) { 
    # Do stuff then return undefined so no dialog pops up. 
    return undefined 
}); 
1

onbeforeUnloadイベントはsynchronousではないため、ページが終了する前にブラウザのガベージコレクションが行われます。代替として

function Data() 
{ 
var client = new XMLHttpRequest(); 
client.open("GET", "/request", false); // third paramater indicates sync xhr 
client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
client.send({ visitTime: time }); 
client.onreadystatechange = emitter; 
} 

function emitter() 
{ 
self.port.emit('pageView', { visitTime: time }); 
} 

またはreturn a stringsynchronous AJAX requestを使用してください。

関連する問題