2012-04-22 9 views
0

私はcontext-menuアイテムを使用しています。ユーザーが選択したテキストをWebサービスに送信するダイアログを表示します(JQuery/Bootstrapを使用)。 AJAX(これはすべて完璧に動作します)。提出されたら、私はアドオンSDK notificationを表示して、「あなたの提出をありがとう」と言うつもりです。アドオンスクリプトによって受け取られない関数/コールバックによって送信されたコンテンツスクリプトイベント

今、通知を表示するためにコンテンツスクリプトからアドオンスクリプトにメッセージを送信する必要があることはわかっていますが、コールバック関数から送信されたメッセージは届きません。

私のアドオンコード(抜粋):

var pageMod = require("page-mod"); 
pageMod.PageMod({ 
    include: ['*'], 
    contentScriptWhen: "end", 
    contentScriptFile: [ data.url("js/content.js") ], 

    onAttach: function onAttach(worker, mod) { 
    worker.port.on("submittedNotif", function(msg) { 
     console.log('Hello'); 
     notifications.notify({ ... }); 
    }) 
    } 
}); 

コンテンツのスクリプトは次のとおりです。私は、メッセージが到着した状況、および到着しなかった状況を示しました。

// Handle the context-menu Item's click and show the dialog 

self.on("click", function(node,data) { 
    self.port.emit("submittedNotif", '*** DOES NOT ARRIVE ***'); 
    showDialog('DialogName', function (response) { /* Do stuff */ }); 
}) 

self.port.emit("submittedNotif", '*** Arrives OK ***'); 

function showDialog(str, response) { 
    // Dialog stuff 
    self.port.emit("submittedNotif", '*** DOES NOT ARRIVE ***'); 
} 

は私がselfがグローバルオブジェクトであると聞いていたので、私は確かに、それをパラメータとして渡す必要はありません。 self.port.emitで送信しようとすると、コンテンツスクリプト内のどこで使用されているかによって、動作がどう違うのかが分かりません。私はどのようなスレッド問題も認識していません。おそらく、これは私のJavaScript知識のギャップですが、誰かが私が間違っていることを教えてくれますか?

答えて

0

私は自分の問題を解決しました。ここではどのように、私が学んだことがあります。

はまず、コンテンツ・スクリプト、およびcontext-menu項目のクリックハンドラ:今すぐ

self.on("click", function(node,data) { 
    self.postMessage({ kind:'submittedNotif', msg: 'Just clicked'}) 
    showDialog(self, 'DialogName', function (response) { /* Do stuff */ }); 
}) 

、古いself.port.emitはどこにも私を得ませんが、self.postMessageに切り替えて、context-menu項目にonMessage()を追加すると、最終的に私に与えます私が欲しいイベント。

、パラメータ 'なeventHandler' として[I約selfいるグローバル...言われていたものに反する?!]私は今もshowDialog()方法にselfを渡す:再び

function showDialog(eventHandler, str, response) { 
    // Dialog stuff 
    eventHandler.postMessage({ kind:'submittedNotif', msg: 'Thank you for your submission'}); 
} 

、私がドロップself.port.emitself.postMessageに切り替え、渡されたハンドラでその呼び出しを行います。

最後に、notifications.notify({ ... });コールがPageModonAttach()からメニュー項目のonMessage()に移動します。要するに、そのクリックに応答して起こることはすべて、メニュー項目の範囲内で発生します。

すべての作品は現在です。はおそらく、このすべては、振り返ってみると明らかに思える - 間違いなく混乱してドキュメントではなくは `コンテキストメニュー項目から発射された(「クリック」)、portpostMessage()

1

クリックイベントがあなたの代わりに行うために必要なもの

self.on('click') 

でから来る場所それはあなた例えば、クリックになるだろうページのDOMで何かにクリックハンドラをバインドしている私には明確ではありませんダイアログあなたは言及します。確認ダイアログが表示されたときにイベントを放出することによってこれをすることによって行い、この非常に単純なビルダーの例をチェックアウト:

https://builder.addons.mozilla.org/addon/1049875/latest/

main.js:

var data = require("self").data; 
var notifications = require("notifications"); 
var pageMod = require("page-mod"); 
pageMod.PageMod({ 
    include: ['*'], 
    contentScriptWhen: "end", 
    contentScriptFile: [ data.url("jquery.js"), data.url("content.js") ], 

    onAttach: function onAttach(worker, mod) { 
    worker.port.on("submittedNotif", function(msg) { 
     notifications.notify({ 
      title: 'Notification!', 
      text: 'This is the notification: '+ msg 
     }); 
    }) 
    } 
}); 

content.js:

$(function() { 
    if(confirm("send submitted event?")) { 
     self.port.emit("submittedNotif", '*** DOES NOT ARRIVE ***'); 
     showDialog('DialogName', function (response) { /* Do stuff */ }); 
    } 
}); 


//self.port.emit("submittedNotif", '*** Arrives OK ***'); 

function showDialog(str, response) { 
    // Dialog stuff 
    self.port.emit("submittedNotif", '*** DOES NOT ARRIVE ***'); 
} 
+0

' self.on間、特に違いを明らかに - それがありませんダイアログが表示されます(私は添付のコードからこれらのビットを削除しました - それが間違っていれば申し訳ありません)。私が示したかったのは、そのハンドラから 'self.port.emit(" submittedNotif "、...);を実行しようとすると、メッセージが受信されないということでした。 *私がそれを行うときに、トップレベルからemit()を実行すると、メッセージが到着します(ログエントリは 'cfx'コンソールまたはError Consoleに表示されます)。だから、私にはある種のスコープ*問題が起こっているように見えます... –

関連する問題