如何设置jQuery文档

时间:2016-03-17 14:12:00

标签: jquery google-chrome-extension firefox-addon

更改文档,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不起作用)。对我有用:))

2 个答案:

答案 0 :(得分:2)

jQuery在很大程度上依赖于document变量的使用。在Firefox扩展程序中,您经常处于未定义变量documentwindow等,或未定义为<document><window>的上下文中你期待他们。您通常可以通过恰当地定义windowdocument来解决此类问题。

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

Firefox附加组件通常在有多个对象的范围内运行,windowdocument变量可以合理地引用这些对象。如果定义了这些变量,并且如果定义了它们实际引用的对象,则取决于当前运行的代码部分是如何输入的。即使它们已定义,它们通常也不会被定义为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. nsIWindowMediator
  2. Working with windows in chrome code
  3. SDK:window/utils
  4. SDK:windows
  5. 此答案的大部分内容均来自我之前的答案,包括this linkhere

答案 1 :(得分:-2)

您可以尝试使用

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