2017-09-20 11 views
0

私は新しいwebextension標準を使ってFirefox拡張機能を構築しています。javascript addEventListenerとruntime.onMessage.addListener

ユーザーがページの任意の場所をクリックすると、別の機能がバックグラウンドスクリプトでタスクを実行している間に、クリックを数ミリ秒間スタンバイ状態にします。ここで

は、私のコードの一部です:

コンテンツスクリプト:

var CanContinue = false; 
browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(request, sender, sendResponse) 
{ 
    if (request.msg == 'can_continue') 
     CanContinue = true; 
} 

function ClickDetected(event) 
{ 
    browser.runtime.sendMessage({"msg": "doWork"}); 
    while (! CanContinue); 
} 

window.addEventListener("click", function(event) { 
    ClickDetected(event); 
}, true); 

背景スクリプト:

browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(msg) 
{ 
    if (msg.msg == 'doWork') 
    { 
     ... 
     browser.tabs.sendMessage(TheTabId, {msg: 'can_continue'}); 
    } 
} 

問題は、コンテンツスクリプトが受信していないということですクリックイベントが保留されている間にcan_continueメッセージが表示されるため、while (! CanContinue)は決して解放しない。

クリックイベントプロセスからテストすると、メッセージが正しく受信されることに注意してください。

答えて

2

JavaScriptはシングルスレッドであり、メッセージングは​​非同期です。

while (! CanContinue);を意味するすべてコードがハングするだけです。応答は準備が整っていて、イベントキューに入っていますが、現在のコードが終了するまで処理されません。

このように実行を「遅延」することはできません。非同期応答を待つことはできません。

イベントをキャンセルして確認した後、新しいイベントを発生させて回避することもできます。私はそれが "ユーザージェスチャー"の面ではうまくいくかどうかはわかりません。

+0

ありがとう、私はこの方法を試してみる – user3429139

関連する問題