2013-05-22 58 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

相关问题