14

Tôi đã tìm kiếm một chức năng chọn CSS ngoài Sizzle và tôi đã xem qua this function.document.evaluate - Trình duyệt chéo?

function SparkEn(xpath,root) { 
    xpath = xpath 
    .replace(/((^|\|)\s*)([^/|\s]+)/g,'$2.//$3') 
    .replace(/\.([\w-]+)(?!([^\]]*]))/g, '[@class="$1" or @class$=" $1" or @class^="$1 " or @class~=" $1 "]') 
    .replace(/#([\w-]+)/g, '[@id="$1"]') 
    .replace(/\/\[/g,'/*['); 
    str = '(@\\w+|"[^"]*"|\'[^\']*\')'; 
    xpath = xpath 
    .replace(new RegExp(str+'\\s*~=\\s*'+str,'g'), 'contains($1,$2)') 
    .replace(new RegExp(str+'\\s*\\^=\\s*'+str,'g'), 'starts-with($1,$2)') 
    .replace(new RegExp(str+'\\s*\\$=\\s*'+str,'g'), 'substring($1,string-length($1)-string-length($2)+1)=$2'); 
    var got = document.evaluate(xpath, root||document, null, 5, null); 
    var result=[]; 
    while (next = got.iterateNext()) 
    result.push(next); 
    return result; 
} 

Tôi chỉ cảm thấy nó quá tốt là đúng, đây có phải là chức năng chỉ có firefox (xpath?) Hay chậm? Về cơ bản tại sao tôi sẽ sử dụng Sizzle hơn này?

+0

Tôi nghĩ đó chỉ là firefox, thật đáng thất vọng. Rõ ràng IE có thể làm điều đó trên các tài liệu XML. – Olical

+0

o my god cuối cùng tôi tìm thấy một người nào đó suy nghĩ theo cùng một cách như iam :)))))))))))))))))))))) http://stackoverflow.com/questions/15310502/how-to-create-a- javascript-selector-engine – Marwan

Trả lời

10

Tôi tin rằng no stable version of IE supports document.evaluate, vì vậy, bạn bị giới hạn ở mọi trình duyệt khác. Nó không chậm vì nó là một bản cài đặt gốc của XPath.

Sizzle rất hữu ích vì nó sử dụng các trình duyệt hỗ trợ gốc khi có sẵn (chẳng hạn như document.getElementsByClassName), nhưng lại tự làm khi không có (IE). Nó cũng được sử dụng bởi jQueryPrototype, do đó, nó được kiểm tra rất nhiều, rất khó và không có khả năng gây ra rắc rối cho bạn. Sizzle cũng được kiểm tra và tối ưu hóa với tốc độ cao (họ có toàn bộ speed test suite), đó là công việc bạn không phải làm.

Tôi muốn nói với jQuery, Prototype hoặc chỉ Sizzle trừ khi bạn đang làm điều gì đó cực kỳ hiệu suất nhạy cảm (điều này có thể là một chỉ báo cho thấy bạn đã cấu trúc ứng dụng của mình kém).

+0

Câu trả lời hay, chỉ còn một câu hỏi nữa. Do 'querySelectorAll()' là native, nó nhanh hơn Sizzle. Tôi biết IE không hỗ trợ điều này, nhưng trong các trình duyệt được hỗ trợ, bạn nên truy cập 'querySelectorAll()'? – Olical

+1

Có rất ít lý do để sử dụng 'querySelectorAll()' trực tiếp, vì [Sizzle sử dụng nó nếu nó có sẵn] (https://github.com/jeresig/sizzle/blob/master/sizzle.js#L1077). Nó cũng bình thường hóa tính kỳ quặc xung quanh chức năng đó trong các trình duyệt khác nhau, do đó bạn chỉ có thể lo lắng về việc viết mã ứng dụng của bạn chứ không phải về việc liệu việc thực thi IE 8 có hơi bị lỗi hay không. –

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