如何设置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扩展中,您经常处于未定义变量documentwindow等的上下文中,或者未定义为您期望它们的 。 您通常可以通过适当地定义windowdocument来解决此类问题。

如果没有其他信息,则无法提供保证适合您的信息。 您尚未说明您的工作范围,也没有描述您希望操作的 。 因此,下面的代码提供了一个通用的解决方案,它将找到一个在大多数情况下都可以工作的 ,但是你可能希望它们成为别的东西。

Firefox附加组件通常在一个范围内运行,其中有多个对象可以由windowdocument变量合理地引用。 如果定义了这些变量,并且如果定义了它们实际引用的对象,则取决于如何输入当前正在运行的代码部分。 即使它们被定义,它们通常也不被定义为jQuery期望的 (当前选项卡的内容的 / )。 您可能需要获取最近访问的窗口/选项卡的两个对象的引用。

如果存在浏览器窗口(在某些情况下,您可以在没有浏览器窗口的情况下运行,例如在启动时),您可以获得对最新浏览器windowdocumentgBrowser

 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 

缺少可用的全局windowdocument变量,或者让它们不是您期望的引用对象,这是许多人在编写Firefox附加组件时遇到的问题。

注意:如果您希望与多进程Firefox (电解或e10s)本机兼容,那么访问当前文档的内容会更复杂。 有垫片可以让你的代码继续使用多进程Firefox一段时间,但它们可能/ 最终会消失。 如果您正在编写新的附加代码并且想要访问与网页内容相关联的 ,那么您应该使用某种内容脚本(有各种各样的内容脚本)类型)。 您应该使用哪种类型的内容脚本取决于您正在编写的Firefox加载项的类型以及您使用脚本执行的操作。

参考文献:

  1. nsIWindowMediator
  2. 在chrome代码中使用windows
  3. SDK: window / utils
  4. SDK: windows

这个答案的很大一部分是从我之前的答案中复制过来的,包括这个链接和这里 。

你可以尝试使用

 jQuery(content.document,function( $ ) { // Your code using failsafe $ alias here... });