Переопределить контекст селектора 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?
Ответы
Ответ 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);
};