【问题标题】:How to use jquery in google chrome extension page action background.js?如何在 google chrome 扩展页面操作 background.js 中使用 jquery?
【发布时间】:2012-10-25 08:52:38
【问题描述】:

我正在开发一个“页面操作”谷歌浏览器扩展。我的清单有:

...
"background": { "scripts": ["background.js"] },
...

在我的 background.js 文件中,我有:

function doSomething() {
     alert("I was clicked!");
}

chrome.pageAction.onClicked.addListener(doSomething);

这行得通。现在在我的doSomething 函数中,我想读取当前页面上的一些数据。使用 jquery 读取数据对我来说会容易得多,这样我就可以轻松地定位我想要的确切数据。如何合并 jquery(最好从 google 的 CDN 提供)以便我的 doSomething 函数可以访问它?

【问题讨论】:

    标签: jquery google-chrome-extension content-script


    【解决方案1】:

    manifest.json 中的"background" 规范应指定jquery.js,以便在background.js 之前加载:

    ...
    "background": { "scripts": ["jquery.js","background.js"] },
    ...
    

    这应该可以完成工作。
    记住js文件是按照指定的顺序加载的。

    测试是否加载了 jquery。

    在 background.js 中

    if (jQuery) {  
        // jQuery loaded
    } else {
        // jQuery not loaded
    }
    

    【讨论】:

    • stackoverflow.com/questions/27542186/…你能告诉我我做错了什么吗?
    • 这告诉您如何使用后台脚本加载 JQuery,但请注意其他答案......您无法访问活动网页的 DOM。您可以访问 $(document),但那是背景 HTML 页面。
    • 当我在我的 content_script(不是背景)中使用你的测试时,我会得到一个异常,说 jQuery 没有定义。我必须更改为 if (typeof jQuery !== 'undefined') 才能实际检查是否定义了 jQuery。
    • 为什么你的答案不在顶部?
    • 有趣的是我也在 background.js 中使用了 jquery,但似乎 $.get() 不像 content.js 那样工作
    【解决方案2】:

    我不知道这是否是理想的方式,但我能够通过以下问题的帮助使其正常工作:Google Chrome Extensions: How to include jQuery in programatically injected content script?

    显然,“后台”javascript 页面无法在浏览器中访问网页的 DOM,因此在后台脚本中加载 jquery 并没有真正意义。相反,我有后台脚本programmatically inject jQuery 库,然后将内容脚本放入当前网页。内容脚本(与后台脚本不同)可以访问网页上的信息。

    background.js:

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

    content.js

    var text = jQuery('h1').text();
    alert('inside content! ' + text);
    

    【讨论】:

    • 你仍然可以使用 JQuery 进行 Ajax 调用等。在 background.js 上使用 JQuery 没有必要
    【解决方案3】:

    我的理解是没有必要使用 background.js。您可以将代码放在 popup.js 中。因此,您也不需要在清单文件中包含任何内容。

    我建议在你的 popup.html 中包含 jQuery JS 和你的 popup.js:

    <script src="/js/jquery-1.8.1.min.js"></script>
    <script src="/js/popup.js"></script>
    

    然后在 popup.js 中你应该可以访问 jQuery,所以你的 eventHandler 应该是这样的:

    $(document).ready(function(){
     $('#anyelement').on('click', doSomething);
    
     function doSomething(){
       alert ('do something');
     };
    })
    

    我不认为你为什么要 jQuery 的 CDN,所有文件都将托管在用户的机器上。

    希望对你有帮助 抢

    【讨论】:

    • 关于不需要 CDN 的好处。 popup.html 是什么?我不知道那是什么。澄清一下,当用户点击页面操作的图标时会触发 onclick。
    • popup.html 是当您在 Chrome 中单击扩展程序图标时“弹出”的 html 内容。
    • 好吧,试试上面@Archer 的解决方案,这对你来说可能更好。
    • 这在 chrome 扩展中是不允许的。
    【解决方案4】:

    在清单文件中,确保您在 content_scripts 块中引用了本地 jquery.js 文件(不管它叫什么):

    "content_scripts": [{
        "js": ["jquery.js"]
    }]
    

    这将确保它嵌入在 crx 文件中,并且可供您的其他脚本访问。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 2011-03-03
      • 2014-10-19
      • 2013-02-18
      • 2013-03-02
      相关资源
      最近更新 更多