2010-09-11 3 views
17

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

Я следовал за решением по адресу How to use jQuery in Firefox Extension, и он почти достигает того, чего я хочу.

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?

+0

Я надеюсь, что это работает для вас. Когда я попытался использовать jQuery в расширении и загрузил его в наложение XUL, он каким-то образом сломал наложения других плагинов, таких как панель инструментов Webdeveloper. Возможно, теперь он работает лучше. Просто следите за этим! –

ответ

11

.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's trim, extend etc to $ 

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

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

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

+0

Работает как шарм. Благодаря! – pmc255

+0

Хороший! Я боролся часами и полностью забыл о '$ .extend'. В итоге я нашел другое решение. – BrunoLM

1

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

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

Этот последний параметр «r» означает «rootjQuery», и если вы его не включите, вы будете продолжать получать ошибки, говоря: «rootjQuery не определен». Я узнал, что это трудный путь. Первые два параметра являются гибкими, поэтому для них нет хорошего имени. – Gerry

4
var jQueryInit = $.fn.init; 

$.fn.init = function(arg1, arg2, rootjQuery){ 
    arg2 = arg2 || window.document; 
    return new jQueryInit(arg1, arg2, rootjQuery); 
}; 
Смежные вопросы