如何在 Firefox 扩展中使用 jQuery

IT技术 javascript jquery firefox firefox-addon
2021-01-30 09:09:39

我想在 firefox 扩展中使用 jQuery,我在 xul 文件中导入了这个库,如下所示:

<script type="application/x-javascript" src="chrome://myExtension/content/jquery.js"> </script>

但是 $() 函数在 xul 文件中无法识别,jQuery() 也无法识别。

我用谷歌搜索了这个问题并找到了一些解决方案,但没有人与我合作:http : //gluei.com/blog/view/using-jquery-inside-your-firefox-extension http://forums.mozillazine.org/ viewtopic.php?f=19&t=989465

我还尝试将 'content.document' 对象(它引用了 'document' 对象)作为上下文参数传递给 jQuery 函数,如下所示:

$('img',content.document);

但仍然无法正常工作,以前有人遇到过这个问题吗?

6个回答

我使用以下内容example.xul

<?xml version="1.0"?>
<overlay id="example" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<head></head>
<script type="application/x-javascript" src="jquery.js"></script>
<script type="application/x-javascript" src="example.js"></script>
</overlay>

这是一个 example.js

(function() {
    jQuery.noConflict();
    $ = function(selector,context) { 
        return new jQuery.fn.init(selector,context||example.doc); 
    };
    $.fn = $.prototype = jQuery.fn;

    example = new function(){};
    example.log = function() { 
        Firebug.Console.logFormatted(arguments,null,"log"); 
    };
    example.run = function(doc,aEvent) {
        // Check for website
        if (!doc.location.href.match(/^http:\/\/(.*\.)?stackoverflow\.com(\/.*)?$/i))  
            return;

        // Check if already loaded
        if (doc.getElementById("plugin-example")) return;

        // Setup
        this.win = aEvent.target.defaultView.wrappedJSObject;
        this.doc = doc;

        // Hello World
        this.main = main = $('<div id="plugin-example">').appendTo(doc.body).html('Example Loaded!');
        main.css({ 
            background:'#FFF',color:'#000',position:'absolute',top:0,left:0,padding:8
        });
        main.html(main.html() + ' - jQuery <b>' + $.fn.jquery + '</b>');
    };

    // Bind Plugin
    var delay = function(aEvent) { 
        var doc = aEvent.originalTarget; setTimeout(function() { 
            example.run(doc,aEvent); 
        }, 1); 
     };
    var load = function() { 
        gBrowser.addEventListener("DOMContentLoaded", delay, true); 
    };
    window.addEventListener("pageshow", load, false);

})();
我添加了一个更完整的例子。检查并看看这是否适合您。
2021-03-13 09:09:39
这也不起作用,如果您知道任何使用 jQuery 的扩展,请给我它的名称以检查代码。
2021-03-14 09:09:39
这种方法绝对不合适,因为当您从溢出加载 jquery 时,为整个窗口定义了 2 个对象 jQuery 和 $,并且可能会导致与其他扩展的冲突。虽然您可以使用 jquery.noconflict 和函数作用域来隐藏它,但可以异步加载叠加层。在我可以使用 jquery.noconflict 之前,仍然有可能已经定义了另一个 firefox 的扩展并在窗口上使用了 jQuery 和 $
2021-03-26 09:09:39
这个答案有很多缺陷。但是我觉得编辑它来修复它太激进了。相反,stackoverflow.com/a/23776848/484441
2021-04-04 09:09:39
延迟函数的目的是什么?
2021-04-07 09:09:39

以下解决方案可以在 contentScriptFile 中使用 jQuery(目标 1.5 Addon-sdk)

在你的 main.js 中:

exports.main = function() {
    var pageMod = require("page-mod");

    pageMod.PageMod({
          include: "*",
          contentScriptWhen: 'end',
          contentScriptFile: [data.url("jquery-1.7.1-min.js") , data.url("notifier.js") ,   data.url("message.js")],
          onAttach: function onAttach(worker) {
             //show the message
             worker.postMessage("Hello World");
          }
    });

};

在你的 message.js 中:

self.on("message", function(message){
    if(message !== "undefined"){
       Notifier.info(message); 
    }
});

您需要注意的一些陷阱:

  • contentScriptFile 数组的顺序。如果首先放置 message.js:jQuery 将不会被重新调整。
  • 不要在data.url 中放置 http:// url (这不起作用)!
  • 你所有的 javascript 文件都应该在 data 文件夹中。(只有 main.js 应该在 lib 文件夹中)

mozillaZine 论坛中有一篇很好的文章,详细介绍了这一点:http ://forums.mozillazine.org/viewtopic.php?f=19&t=2105087

我还没有尝试过,所以我犹豫要在这里复制信息。

事实证明,@sunsean 当前的最佳答案在处理多个负载时没有按预期工作该函数应该正确关闭文档并避免全局状态。

此外,您必须调用jQuery.noConflict(true)才能真正避免与其他附加组件发生冲突!

这就是我要写的人(再说一次,我会像瘟疫一样避免 jquery(在附加组件中)......)。首先覆盖 XUL

<?xml version="1.0"?>
<overlay id="test-addon-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="text/javascript" src="jquery.js"/>
  <script type="text/javascript" src="overlay.js"/>
</overlay>

然后是覆盖脚本:

// Use strict mode in particular to avoid implicitly var declarations
(function() {
  "use strict";

  // Main runner function for each content window.
  // Similar to SDK page-mod, but without the security boundaries.
  function run(window, document) {
    // jquery setup. per https://stackoverflow.com/a/496970/484441
    $ = function(selector,context) {
      return new jq.fn.init(selector,context || document); 
    };
    $.fn = $.prototype = jq.fn;

    if (document.getElementById("my-example-addon-container"))  {
      return;
    }
    let main = $('<div id="my-example-addon-container">');
    main.appendTo(document.body).text('Example Loaded!');
    main.click(function() { //<--- added this function
      main.text(document.location.href);
    });
    main.css({
      background:'#FFF',color:'#000',position:'absolute',top:0,left:0,padding:8
    });
  };

  const log = Components.utils.reportError.bind(Components.utils);

  // Do not conflict with other add-ons using jquery.
  const jq = jQuery.noConflict(true);

  gBrowser.addEventListener("DOMContentLoaded", function load(evt) {
    try {
      // Call run with this == window ;)
      let doc = evt.target.ownerDocument || evt.target;
      if (!doc.location.href.startsWith("http")) {
        // Do not even attempt to interact with non-http(s)? sites.
        return;
      }
      run.call(doc.defaultView, doc.defaultView, doc);
    }
    catch (ex) {
      log(ex);
    }
  }, true);
})();

这是一个完整的附加组件作为要点只需放入一份 jquery 就可以了。

我认为这就是 Eric 所说的,但是您可以直接从 URL 加载 Javascript。

javascript:var%20s=document.createElement('script');s.setAttribute('src','http://YOURJAVASCRIPTFILE.js');document.getElementsByTagName('body')[0].appendChild(s);void(s);

我假设您希望您的扩展程序加载 JQuery 以便您可以轻松地操作页面元素?我公司的实验室可以直接在此处使用 Javascript 执行此操作:http : //parkerfox.co.uk/labs/pixelperfect

我知道如何将库注入到页面的 DOM 中,但问题是我无法在加载页面时将扩展的所有功能注入到 DOM 中。这就是为什么我希望所有功能都在扩展文件夹中
2021-03-30 09:09:39