Firefox扩展中的jQuery,全局命名空间没有冲突

时间:2012-12-04 18:01:38

标签: jquery firefox firefox-addon add-on browser-extension

我已经阅读了很多关于此事的帖子,并尝试了所有方法来包含jQuery。

如果我在xul文件中加载jQuery并将其存储在变量中,它可以工作。 (如How to use jQuery in Firefox Extension

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

但是,我怀疑这里的建议解决方案要好得多: http://forums.mozillazine.org/viewtopic.php?f=19&t=2105087

loadjQuery: function(wnd){
  var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
 .getService(Components.interfaces.mozIJSSubScriptLoader);
  loader.loadSubScript("chrome://clhelper/content/jquery/jquery-1.5.js",wnd);
  var jQuery = wnd.jQuery.noConflict(true);
  loader.loadSubScript("chrome://clhelper/content/jquery/jquery.hoverIntent.js", jQuery);
  return jQuery;
 },
页面加载事件处理程序中的

var doc = event.originalTarget;
var wnd = doc.defaultView;
// load jQuery and save it as a property of the window
myprivatejQuery = loadjQuery(wnd)

但是我一直得到wnd.jQuery未定义..(链接中很少有人说这是问题)

我该怎么办? 我如何使用jQuery而不用担心Firefox扩展中的冲突?

1 个答案:

答案 0 :(得分:1)

经过更多的调查,感谢Omri Baumer的无情工作......

我们现在明白为什么会收到错误。

正确的方法不是在xul文件中作为include(我怀疑),而是通过调用unwrapped js对象:

// correct function to load jQuery
var loadjQuery = function(wnd){
  var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
   .getService(Components.interfaces.mozIJSSubScriptLoader);
   loader.loadSubScript("chrome://sbshsafewallet/content/jquery-1.8.3.js", wnd);
   var jQuery = XPCNativeWrapper.unwrap(wnd).$;
   jQuery.noConflict(true);
  return jQuery;
};


// field to store the jQuery for the current document window (as there can be multiple tabs)
var jQueryForWindow = null;

// event to call on window load (didn't include the code, left for reader to do)
windowLoad = function (event)
{
    var appcontent = document.getElementById("appcontent"); // browser  
    appcontent.addEventListener("DOMContentLoaded", pageLoadedInit, false);
}

// load jQuery on DOMContentLoaded event
pageLoad = function (event) {
      var doc = event.originalTarget;
      var wnd = doc.defaultView;
      jQueryForWindow = loadjQuery(wnd);
}


//example of function using the jQuery
function usesjQuery()
{
   var $ = jQueryForWindow;
   //do something with jquery here
}

希望这可以帮助所有被困的人!!

再次感谢Omri Baumer!