Program Tip

Firefox Extension에서 jQuery를 사용하는 방법

programtip 2020. 12. 27. 19:55
반응형

Firefox Extension에서 jQuery를 사용하는 방법


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

또한 다음과 같이 jQuery 함수에 컨텍스트 매개 변수로 'content.document'개체 ( '문서'개체를 참조 함)를 전달하려고 시도했습니다.

$('img',content.document);

하지만 여전히 작동하지 않습니다. 이전에이 문제를 겪은 사람이 있습니까?


다음을 사용합니다 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);

})();

다음 솔루션은 contentScriptFile (Targetting 1.5 Addon-sdk)에서 jQuery를 사용할 수 있도록합니다.

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을 넣지 마십시오 (작동하지 않음)!
  • 모든 자바 스크립트 파일은 데이터 폴더에 있어야합니다. (main.js 만 lib 폴더에 있어야 함)

mozillaZine 포럼에는이 단계를 단계별로 설명하는 훌륭한 기사가 있습니다. http://forums.mozillazine.org/viewtopic.php?f=19&t=2105087

나는 아직 그것을 시도하지 않았으므로 여기에 정보를 복제하는 것을 주저합니다.


나는 이것이 Eric이 말한 것이라고 생각하지만 URL에서 직접 Javascript를로드 할 수 있습니다.

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

Im assuming you want your extension to load JQuery so you can manipulate the page elements easily? My company's labs has something that does this using Javascript directly here: http://parkerfox.co.uk/labs/pixelperfect


Turns out the current top-answer by @sunsean does not work as expected when it comes to handling multiple loads. The function should properly close over the document and avoid global state.

Also, you have to call jQuery.noConflict(true) to really avoid conflicts with other add-ons!

This is who I would write it (then again, I would avoid jquery (in add-ons) like the plague...). First the overlay 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>

And then the overlay script:

// 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);
})();

Here is a complete add-on as a gist. Just drop in a copy of jquery and it should be good to go.


It may be bad practice, but have you considered including it inline?


Instead of

$('img',content.document);

you can try

$('img',window.content.document);

In my case it works.

ReferenceURL : https://stackoverflow.com/questions/491490/how-to-use-jquery-in-firefox-extension

반응형