【问题标题】:chrome extension's content script not working in google, youtube pageschrome 扩展内容脚本在 google、youtube 页面中不起作用
【发布时间】:2012-10-23 18:50:19
【问题描述】:

我正在尝试创建一个 chrome 扩展程序。当用户单击我的扩展程序的图标(browserAction)时,内容脚本会在打开的页面(当前选项卡)的正文中附加一个额外的 div。它在除 google 的搜索页面和 youtube 之外的所有网站上都可以正常工作。我没有收到任何错误消息或任何东西。它根本不会给出任何回应。

这是我在 content.js 中的代码:

alert('sdsd');
$('body').append("<div id='popup'>My extension name</div>");

我已将警报用于测试目的。因此,当切换扩展时,它应该显示一条警报消息,然后将 div 附加到正文,理想情况下!但它不适用于这 2 个网站。

知道这里可能出了什么问题吗?

清单

{
    "name": "My first extension",
    "version": "1.0",
    "background": { "scripts": ["background.js"] },
    "content_scripts": [{
            "all_frames": true,
            "css": ["style.css"],
            "matches": ["http://*/*","https://*/*"]
        }],
    "permissions": [ "tabs","http://*/*" ],
    "browser_action": { "name": "test" },
    "manifest_version": 2
}

background.js

chrome.browserAction.onClicked.addListener(function(tab){
chrome.tabs.executeScript(null,{file:"jquery.min.js"},function(){
    chrome.tabs.executeScript(null,{file:"content.js"});
});

});

【问题讨论】:

    标签: javascript jquery google-chrome-extension


    【解决方案1】:

    在 Youtube 的页面中,$ 被覆盖并且不是 jQuery。这是

    bound: function ()
    {
        return document.getElementById.apply(document, arguments)
    }
    

    所以你的代码会出现异常,因为document.getElementById('body')undefined

    您应该尝试使用noConflict()

    编辑:

    你为什么不简单地在content_scripts 中列出jQuery.min.js 和你的content.js 而不是以编程方式注入它们。这样可以避免冲突。

    编辑 2:

    现在您使用内容脚本,您应该使用communication as described herebackground.js 向内容脚本发送显示警报的指令。

    编辑 3:

    另一种解决方案是使用编程注入(就像您最初所做的那样)而不使用 jquery,$('body').append("&lt;div id='popup'&gt;My extension name&lt;/div&gt;"); 在 vanilla JS 中被翻译为

    var div = document.createElement('div');
    div.id = 'popup';
    document.body.appendChild(div);
    document.getElementById('popup').innerHTML = "My extension name"​;​
    

    但它通常更简洁(并且需要更少的权限)以避免程序注入。

    【讨论】:

    • 我试过 jQuery.noConflict();但是没有用。另外为什么简单的js警报不起作用?
    • 你是如何执行你的脚本的?你在注射吗?你能在问题中写下你的清单吗?
    • 现在 jquery.min.js 和 content.js 都列在清单的 content_scripts 部分下。但是现在 content.js 正在页面加载时执行。应该如何编辑 background.js 以使 content.js 仅在 onClicked 事件上运行?你能帮我解决这个问题吗?
    • 仍然可以从内容脚本访问 DOM。见编辑(未测试)。
    • 我不知道我的陈述是否不够清楚。我希望在调用 background.js 的 onClicked eventHandler 时运行警报和附加。也就是说,当用户单击扩展图标时。不是身体点击。我希望电话应该放在这里的某个地方:chrome.browserAction.onClicked.addListener。不是吗?
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2015-04-23
    • 2015-06-21
    • 2013-09-01
    相关资源
    最近更新 更多