2010-09-11 37 views
17

Tôi đang cố gắng sử dụng jQuery bên trong phần mở rộng của Firefox và thực sự muốn sử dụng jQuery để thao tác DOM của trang hiện tại, trái ngược với ngữ cảnh của tệp XUL. Vì vậy, tôi tải jQuery trong tệp XUL của tôi và chuyển nó cho một số tập lệnh của tôi trong một hộp cát (sử dụng trình biên dịch mở rộng Greasemonkey http://arantius.com/misc/greasemonkey/script-compiler). Vì jQuery không được nạp với DOM trang, tôi muốn đặt ngữ cảnh chọn của nó thành DOM trang thay vì luôn chuyển nó vào các cuộc gọi jQuery.Ghi đè ngữ cảnh chọn jQuery mặc định

Tôi đã làm theo giải pháp tại How to use jQuery in Firefox Extension và nó gần như đạt được những gì tôi muốn.

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

Tôi có thể thực hiện cuộc gọi đến hàm jQuery() và DOM trang sẽ được sử dụng làm ngữ cảnh. Tuy nhiên, tôi không thể sử dụng các hàm như jQuery.trim vì chúng không được định nghĩa.

Tôi nghĩ dòng này từ dung dịch

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

sẽ cho phép đối tượng jQuery riêng tôi thừa hưởng tất cả các đặc tính nguyên mẫu jQuery, nhưng nó dường như không.

Cho đối tượng jQuery vanilla, làm thế nào để xác định lại nó để sử dụng một phần tử nhất định làm ngữ cảnh chọn, trong khi vẫn giữ lại tất cả các hàm jQuery?

+0

Tôi hy vọng nó làm việc cho bạn. Khi tôi cố gắng sử dụng jQuery trong một phần mở rộng và tải nó trong một lớp phủ XUL, nó bằng cách nào đó đã phá vỡ lớp phủ của các plugin khác như thanh công cụ Webdeveloper. Có lẽ nó hoạt động tốt hơn bây giờ. Chỉ cần xem ra cho điều này! –

Trả lời

11

.trim(), .ajax() vv là các phương thức tĩnh, có nghĩa là chúng được liên kết với hàm tạo jQuery chứ không phải nguyên mẫu của nó.

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 $ 

Tuy nhiên một cách có lẽ đẹp là để lại jQuery còn nguyên vẹn và làm như sau:

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

Đây cũng là một tối ưu hóa từ bối cảnh doesnt phải được thiết lập bằng tay nữa với mỗi truy vấn.

+0

Hoạt động như một sự quyến rũ. Cảm ơn! – pmc255

+0

Đẹp nhất! Tôi đã đấu tranh hàng giờ và hoàn toàn quên mất '$ .extend'. Tôi sẽ tìm ra một giải pháp khác. – BrunoLM

1

Một cách khác để làm việc đó là trọng các nhà xây dựng:

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

Thông số cuối cùng "r" là viết tắt của "rootjQuery" và nếu bạn không bao gồm nó, bạn sẽ tiếp tục nhận được lỗi nói "rootjQuery is undefined". Tôi đã học được rằng một cách khó khăn. Hai thông số đầu tiên là linh hoạt, do đó, không thực sự là một tên tốt cho chúng. – Gerry

4
var jQueryInit = $.fn.init; 

$.fn.init = function(arg1, arg2, rootjQuery){ 
    arg2 = arg2 || window.document; 
    return new jQueryInit(arg1, arg2, rootjQuery); 
}; 
Các vấn đề liên quan