内容脚本和背景通信

时间:2012-01-28 08:41:44

标签: javascript jquery google-chrome-extension

我希望为特定网站创建扩展程序,以提供他们目前没有的其他格式和共享选项。

我遇到了正确沟通的问题,似乎没有一个明确的例子。

清单:

{
    "name": "Test",
    "description": "Testing.",
    "version": "1.0",
    "background_page": "background.html",
    "permissions": [
        "tabs", "http://www.sitedomain.com/*"
    ],
    "content_scripts": [
        {
            "matches": ["*://*.sitedomain.com/*"],
            "js": ["jquery.min.js", "test.js"],
            "css": ["test.css"]
        }
    ]
}

内容脚本:

$(document).ready(function () {
    alert('test js fired');
    $("#ColumnContainer div.item").each(function () {
        $(this).css("background-color", "skyBlue");
        var itemId = $(this).children("a.itemImage").attr("href");
        $(this).children(".details").append("<a href=\"javscript:void(false);\"  onclick=\"gotoItem('" + itemId + "');\">Goto Item</a>");

    });
});
chrome.extension.onRequest.addListener(function (request, sender, sendResponse) {
    alert('listener request');
    alert(request);
}); 

背景HTML的JavaScript:

    chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
        if (changeInfo.status == "complete") {
            if (tab.url.indexOf("sitedomain.com") > -1) {

                chrome.tabs.executeScript(null, {file: "test.js"});
            }

        }
    });
    chrome.tabs.sendRequest(tabId, request, responseCallback);
    function responseCallback() {
        alert('response callback');
    }
    function gotoItem(itemId) {
        alert('goto Item - ' + itemId);
    }

上面的代码会在加载sitedomain.com时附加链接并更改客户端页面上的样式。但是,我没有幸运获得gotoItem方法,Chrome开发工具显示未定义。我尝试了各种组合,但还不能完全掌握听众和请求。

我真的很想看到一个干净的样本,它只是展示了如何从每个站点调用方法。

1 个答案:

答案 0 :(得分:1)

我发现您的代码存在两个问题。 1)gotoItem函数在后台页面中定义,content_scripts无法访问那里的函数。 2)content_scripts和他们注入的网页上的javascript无法互动,因此您的onclick不能成为链接html的一部分。

修复#1就像将gotoItem函数移到content_script中一样简单。

要修复#2,以下内容应该有效。

$("#ColumnContainer div.item").each(function(){
    $(this).css("background-color","skyBlue");
    var itemId = $(this).children("a.itemImage").attr("href");
    var $link = $('<a href="javscript:void(false);">Goto Item</a>');
    $link.click(function() {
      gotoItem(itemId);
    }
    $(this).children(".details").append($link);
});

您可能需要修改itemId的传递方式。