事实证明,@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 就可以了。