如何设置jQuery的文档
在Firefox / Chrome扩展程序开发中,更改jQuery使用的文档非常重要。 它需要使用$(...)
或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不会起作用)。 对我有用:)
jQuery在很大程度上依赖于document
变量的使用。 在Firefox扩展中,您经常处于未定义变量document
和window
等的上下文中,或者未定义为您期望它们的
或
。 您通常可以通过适当地定义window
和document
来解决此类问题。
如果没有其他信息,则无法提供保证适合您的信息。 您尚未说明您的工作范围,也没有描述您希望操作的
。 因此,下面的代码提供了一个通用的解决方案,它将找到一个在大多数情况下都可以工作的
和
,但是你可能希望它们成为别的东西。
Firefox附加组件通常在一个范围内运行,其中有多个对象可以由window
和document
变量合理地引用。 如果定义了这些变量,并且如果定义了它们实际引用的对象,则取决于如何输入当前正在运行的代码部分。 即使它们被定义,它们通常也不被定义为jQuery期望的
或
(当前选项卡的内容的
/
)。 您可能需要获取最近访问的窗口/选项卡的两个对象的引用。
如果存在浏览器窗口(在某些情况下,您可以在没有浏览器窗口的情况下运行,例如在启动时),您可以获得对最新浏览器window
, 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
事件),则可以使用以下command
获取当前window
:
var window = event.view
缺少可用的全局window
和document
变量,或者让它们不是您期望的引用对象,这是许多人在编写Firefox附加组件时遇到的问题。
注意:如果您希望与多进程Firefox (电解或e10s)本机兼容,那么访问当前文档的内容会更复杂。 有垫片可以让你的代码继续使用多进程Firefox一段时间,但它们可能/ 最终会消失。 如果您正在编写新的附加代码并且想要访问与网页内容相关联的
或
,那么您应该使用某种内容脚本(有各种各样的内容脚本)类型)。 您应该使用哪种类型的内容脚本取决于您正在编写的Firefox加载项的类型以及您使用脚本执行的操作。
参考文献:
-
nsIWindowMediator
- 在chrome代码中使用windows
- SDK: window / utils
- SDK: windows
这个答案的很大一部分是从我之前的答案中复制过来的,包括这个链接和这里 。
你可以尝试使用
jQuery(content.document,function( $ ) { // Your code using failsafe $ alias here... });