2013-05-22 82 views
0

我知道這裏已經存在這個問題的很多變體,但它們都不適合我。Chrome擴展中的腳本之間的通信

詳情:

我正在寫就會從您在Gmail中發送郵件的一些電子郵件數據的擴展。爲了實現這一點,我正在使用這個版本的Gmailr https://github.com/joscha/gmailr

實際上,我有三個內容腳本:Gmailr.js和main.js(這是幾乎等同於那些在上面的鏈接)讓我拉出來,我尋找的信息。然後我用content.js發送消息到擴展的後臺頁面。

問題是,從gmailr.js和main.js我不能使用任何的Chrome API,我不知道爲什麼,所以我不能發送消息從這些回到後臺頁面。

這就是爲什麼我能與背景頁面通信content.js。但是,它似乎無法看到其他內容腳本所做的任何事情。例如,main.js在頁面的頂部插入一個div。當我嘗試從content.js將一個事件監聽器附加到此div中的按鈕時,我被告知不存在這樣的元素。

我怎樣才能獲得通過main.js數據拉出通過content.js可以看到? (我也嘗試將數據放在本地存儲中,然後觸發自定義事件偵聽器來告訴content.js讀取本地存儲,但沒有運氣,因爲它們似乎無法聽到對方的事件被觸發)。

任何瞭解或備選的大加讚賞。

(我可以在必要時發佈的代碼,但它是零散和長)

我的清單文件:

{ 
    "manifest_version": 2, 
    "name": "Email extractor", 
    "description": "Extracts data from emails", 
    "version": "1.0", 
    "background": { 
    "script": "background.js" 
    }, 
    "content_scripts": [ 
    { 
     "matches": [ 
     "*://mail.google.com/*", 
     "*://*/*" 
     ], 
     "js": [ 
     "lib/yepnope.js/yepnope.1.5.4-min.js", 
     "lib/bootstrap.js", 
     "main.js", 
     "gmailr.js", 
     "content.js" 

     ], 
     "css": [ 
     "main.css" 
     ], 
     "run_at": "document_end" 
    } 
    ], 
    "permissions": [ 
    "tabs", 
    "storage", 
    "background", 
    "*://mail.google.com/*", 
    "*://*/*" 
    ], 

    "browser_action": { 
    "default_icon": "img/icon.png", 
    "default_popup": "popup.html" 
    }, 

    "web_accessible_resources" : [ 
    "writeForm.js", 
    "disp.js", 
    "/calendar/jsDatePick.min.1.3.js", 
    "/calendar/jsDatePick_ltr.min.css", 
    "lib/gmailr.js", 
    "lib/jquery-bbq/jquery.ba-bbq.min.js", 
    "content.js", 
    "main.js", 
    "background.js" 
    ] 
} 

這是main.js:

Gmailr.init(function(G) { 
    sender = G.emailAddress(); 
    G.insertTop($("<div id='gmailr'><span></span> <span id='status'></span>)"); 
    el = document.getElementById("testid"); 
    el.addEventListener('click', mg, false); 
    var status = function(msg) { 
     G.$('#gmailr #status').html(msg); };  
     G.observe(Gmailr.EVENT_COMPOSE, function(details) {   
     .... 
     status(" user: " + user); 
     console.log('user:', user); 
     //now try to send a message to the background page 
     //this always returns the error that method sendMessage does not exist for  undefined 
     chrome.runtime.sendMessage({greeting: "test from gmailr"}, function(response) { 
     console.log("did it send?"); 
     }); 
    }); 


}); 

gmailr.js是很長,也不是我自己的代碼,但它可以看這裏:perhap http://pastebin.com/pK4EG9vh

+0

我們能否看到您的擴展程序的清單文件?你的所有權限設置正確嗎? – sffc

回答

0

喜第3條可能的原因,您的問題:

  1. 您發送郵件從main.js和gmailr.js到BGP的方式也許是錯誤的,因爲你必須到達任何內容腳本您BGP進行通信。 (在您的清單內容腳本鍵中缺少gmailr.js)。告訴我們你的代碼,它會幫助。

  2. 你似乎與當下一個問題,你從content.js搜索訪問到main.js.創建的元素你嘗試用jQuery $(「」)。on()方法訪問你的元素嗎?一個簡單的測試必須是在一個cs中聲明一個函數,並在另一個cs中使用它。如果不起作用,這是一個明顯的問題。您在清單內容腳本鍵中聲明.js文件的順序也很重要。

  3. 嘗試清單中的內容腳本陣列 「run_at」: 「document_end」

希望它能幫助!

+0

嗨,羅姆,感謝您的幫助。關於你的第一點,包括gmailr.js在內容腳本中的關鍵排序工作。現在發生的事情是它可以發送消息給後臺腳本,但只有在它被注入gmail之前。一旦注入,它就不能再訪問chrome API。點2和3我也嘗試過,但沒有運氣。我會在上面發佈更多我的代碼。謝謝 :) – skaern

相關問題