Подтвердить что ты не робот

Переопределить контекст селектора jQuery по умолчанию

Я пытаюсь использовать jQuery внутри расширения Firefox и на самом деле хочу использовать jQuery для управления DOM текущей страницы, в отличие от контекста XUL файла. Таким образом, я загружаю jQuery в свой XUL файл и передаю его некоторым моим скриптам в песочнице (используя компилятор расширения Greasemonkey http://arantius.com/misc/greasemonkey/script-compiler). Поскольку jQuery не был загружен страницей DOM, я хочу установить его контекст селектора на страницу DOM вместо того, чтобы всегда передавать ее в вызовы jQuery.

Я выполнил решение как использовать jQuery в расширении Firefox, и он почти достигает того, что я хочу.

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

Я могу совершать вызовы функции jQuery(), а DOM страницы будет использоваться в качестве контекста. Однако я не могу использовать такие функции, как jQuery.trim, поскольку они не определены.

Я думал, что эта строка из решения

$.fn = $.prototype = jQuery.fn;

позволит моему собственному объекту jQuery наследовать все свойства прототипа jQuery, но, по-видимому, это не так.

Дайте объект vanilla jQuery, как переопределить его для использования определенного элемента в качестве контекста селектора, сохраняя при этом все функции jQuery?

4b9b3361

Ответ 1

.trim(),.ajax() и т.д. являются статическими методами, то есть они связаны с конструктором jQuery, а не с прототипом.

jQuery.noConflict();
$ = function(selector,context){ return new jQuery.fn.init(selector,context||example.doc); };
$.fn = $.prototype = jQuery.fn;
jQuery.extend($, jQuery); // copy trim, extend etc to $

Однако, возможно, хороший способ оставить jQuery неповрежденным и сделать следующее:

var fromDoc = $(document);
// and if you want to find stuff:
fromDoc.find('div').doSomething();
fromDoc.find('.someClass').doSomethingElse();

Это также оптимизация, так как контекст не должен устанавливаться вручную с каждым запросом.

Ответ 2

var jQueryInit = $.fn.init;

$.fn.init = function(arg1, arg2, rootjQuery){
    arg2 = arg2 || window.document;
    return new jQueryInit(arg1, arg2, rootjQuery);
};

Ответ 3

Другой способ сделать это - переопределить конструктор:

var initjQuery = jQuery.fn.init;
$.fn.init = function(s,c,r) {
    c = c || window.document;
    return new initjQuery(s,c,r);
};