更改文档,jQuery使用,在Firefox / Chrome扩展开发中非常重要。它需要使用$(...)
或jQuery(...)
来电。现在我被迫以这种方式使用jQuery:
var jQDoc = jQuery(content.document);
var someElements = jQDoc.find('.some-selector');
我想要这样的东西
jQuery.setActiveDocument(content.document);
var someElements = jQuery('.some-selector');
没有jQuery代码更改是否可能?
更新
我需要的所有内容:将以jQuery(...)
函数的重载方式工作:
(function(){
/*overloading of jQuery(...) function*/
var _$ = jQuery;
$ = jQuery = function(){
var args = Array.prototype.slice.call(arguments);
if (arguments.length == 1){
args.push(_$._defaultRoot);
}
return _$.apply(_$, args);
}
jQuery.setDefaultRoot = function(element){_$._defaultRoot = element;}
for(var key in _$) {
if (_$.hasOwnProperty(key)) {
jQuery[key] = _$[key];
}
}
})();
例如,你可以在firebug中,在stackoverflow问题页面中执行它(执行第一个代码块之后):
$.setDefaultRoot('.post-text:first');
$('span');
但我不确定这是最好的方法(例如noConflict不起作用)。对我有用:))
答案 0 :(得分:2)
jQuery在很大程度上依赖于document
变量的使用。在Firefox扩展程序中,您经常处于未定义变量document
和window
等,或未定义为<document>
或<window>
的上下文中你期待他们。您通常可以通过恰当地定义window
和document
来解决此类问题。
如果没有其他信息,则无法提供保证适合您的内容。您尚未说明您的工作范围,也没有描述您希望操作的<document>
。因此,下面的代码提供了一个通用解决方案,可以找到适用于大多数情况的<window>
和<document>
,但您可能希望它们是其他内容。
Firefox附加组件通常在有多个对象的范围内运行,window
和document
变量可以合理地引用这些对象。如果定义了这些变量,并且如果定义了它们实际引用的对象,则取决于当前运行的代码部分是如何输入的。即使它们已定义,它们通常也不会被定义为jQuery期望的<window>
或<document>
(当前标签的内容的<window>
/ <document>
)。您可能需要获取对最近访问的窗口/选项卡的两个对象的引用。
如果存在浏览器窗口(在某些情况下,您可以在没有浏览器窗口的情况下运行,例如在启动时),您可以获得对最新浏览器window
的引用,{{1 }和document
与:
gBrowser
如果您正在运行代码以响应某个事件(例如按钮if (window === null || typeof window !== "object") {
//If you do not already have a window reference, you need to obtain one:
// Add/remove a "/" to comment/un-comment the code appropriate for your add-on type.
/* Add-on SDK:
var window = require('sdk/window/utils').getMostRecentBrowserWindow();
//*/
//* Overlay and bootstrap (from almost any context/scope):
var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
//*/
}
if (typeof document === "undefined") {
//If there is no document defined, get it
var document = window.content.document;
}
if (typeof gBrowser === "undefined") {
//If there is no gBrowser defined, get it
var gBrowser = window.gBrowser;
}
事件),则可以使用以下内容获取当前command
window
缺少全局var window = event.view
和window
变量,或者让它们引用除了您期望之外的其他对象,这是许多人在编写Firefox附加组件时遇到的问题
注意:如果您希望与multi-process Firefox(电解或e10s)本机兼容,那么获取对当前文档内容的访问权限会更复杂。有垫片可以使你的代码继续使用多进程Firefox一段时间,但它们可能最终消失。如果您正在编写新的附加代码并且想要访问与网页内容相关联的document
或<document>
,那么您应该使用某种内容脚本(那里)有各种类型)。您应该使用哪种类型的内容脚本取决于您正在编写的Firefox加载项的类型以及您使用该脚本执行的操作。
参考文献:
答案 1 :(得分:-2)
您可以尝试使用
jQuery(content.document,function( $ ) {
// Your code using failsafe $ alias here...
});