2010-10-17 15 views
19

Có ai có kinh nghiệm/cái nhìn sâu sắc lại: tách jquery/sizzle?tách jquery, sizzle?

này là dành cho lợi ích chung, nhưng đây là kịch bản đã làm hiển thị câu hỏi của tôi:

..Tôi đã có jquery trong dự án. muốn thử ra http://ecsstender.org/, yêu cầu công cụ chọn Sizzle. Tôi không thực sự muốn bao gồm một bản sao thứ 2 của sizzle - nó đã là một phần của jquery ..

  • thà làm một cái gì đó như thế này: http://forum.jquery.com/topic/further-decoupling-sizzle-and-jquery
  • ví dụ tạo một bản dựng jquery phụ thuộc vào phiên bản Sizzle bên ngoài, chứ không phải nhúng, vì vậy cùng một sizzle lib có thể được sử dụng bởi jquery, eccstender hoặc các tập lệnh khác.

Có vẻ là một ý tưởng hay. Mặc dù tôi đoán nó có thể làm tổn thương performace, và tôi muốn xem so sánh điểm chuẩn so với bản phát hành sản xuất jQuery ..

Có ai biết nếu điều này đã được thực hiện? (Github ngã ba?) Hoặc là có một lý do chính đáng chống lại cách tiếp cận này? .

Trả lời

30

Không cần Sizzle được đưa vào trong bản dựng jQuery. Nó có thể được gỡ bỏ ... mã jQuery all references Sizzle., bạn có thể chỉ cần lấy/biên dịch jQuery (bao gồm cả Sizzle trước) và để nó tiếp xúc với bất kỳ thư viện nào khác (không thực sự bao gồm nó trong phiên bản đã biên dịch). trình biên dịch).


Dưới đây là tùy chọn để lại nó nhúng, nhưng tiếp xúc với sizzle để sử dụng bên ngoài:

Nếu bạn biết jQuery sẽ được sử dụng (phụ thuộc), chỉ cần thêm này sau khi jQuery:

​window.Sizzle = jQuery.find; 

Thao tác này sẽ hiển thị lại Sizzle là thuộc tính mà bạn có thể sử dụng.


Dưới đây là phiên bản bằng tay để loại bỏ sizzle khỏi bị nhúng:

Trong jQuery (version 1.4.3 link), bạn sẽ thấy điều này:

/*! 
* Sizzle CSS Selector Engine - v1.0 
* Copyright 2009, The Dojo Foundation 
* Released under the MIT, BSD, and GPL Licenses. 
* More information: http://sizzlejs.com/ 
*/ 
(function(){ 
//... 
//lots of code! 
//... 

// EXPOSE 
jQuery.find = Sizzle; 
jQuery.expr = Sizzle.selectors; 
jQuery.expr[":"] = jQuery.expr.filters; 
jQuery.unique = Sizzle.uniqueSort; 
jQuery.text = Sizzle.getText; 
jQuery.isXMLDoc = Sizzle.isXML; 
jQuery.contains = Sizzle.contains; 

})(); 

Thay thế phần đó với chỉ:

(function(){  
// EXPOSE 
jQuery.find = Sizzle; 
jQuery.expr = Sizzle.selectors; 
jQuery.expr[":"] = jQuery.expr.filters; 
jQuery.unique = Sizzle.uniqueSort; 
jQuery.text = Sizzle.getText; 
jQuery.isXMLDoc = Sizzle.isXML; 
jQuery.contains = Sizzle.contains;  
})(); 

Sau đó, tất cả những gì bạn cần làm trong bao gồm Sizzletrước jQuery và nó sẽ hoạt động tốt.

Here's a fiddle showing it working, bao gồm Sizzle trực tiếp từ github, không được nhúng trong jQuery.

+0

tuyệt vời! cảm ơn nhiều Nick :) – zack

+0

@zack - welcome :) –

+2

Câu trả lời nghiêm túc tuyệt vời. – weisjohn

2

Nếu bạn muốn sử dụng các mô-đun với sizzle gói trong jQuery eCSStender CSS3 Selectors, bạn có thể làm điều đó:

eCSStender.addMethod('findBySelector',function(selector){ 
    var els = []; 
    jQuery(selector).each(function(){ 
    els.push(this); 
    }); 
    return els; 
}); 

Có thể có một cách dễ dàng hơn để trực tiếp nhận được một bộ sưu tập yếu tố thực tế (chứ không phải là một giả mạo bằng cách sử dụng một mảng), nhưng nó sớm và bộ não của tôi không hoạt động được.

Các vấn đề liên quan