14

Szukałem funkcji selektora CSS innej niż Sizzle i natknąłem się na this function.document.evaluate - Cross browser?

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; 
} 

czuję się jak to jest zbyt piękne, aby mogło być prawdziwe, czy jest to tylko funkcja firefox (XPath?) Czy jest to powoli? Zasadniczo dlaczego miałbym używać Sizzle?

+0

Myślę, że to tylko firefox, jakże rozczarowujące. Najwyraźniej IE może to zrobić na dokumentach XML. – Olical

+0

o mój Boże w końcu znalazłem kogoś myślącego tak samo jak iam :))))))))))))) http://stackoverflow.com/questions/15310502/how-to-createa-a- javascript-selector-engine – Marwan

Odpowiedz

10

Wierzę, no stable version of IE supports document.evaluate, więc jesteś ograniczony do każdej innej przeglądarki. Nie jest powolny, ponieważ jest natywną implementacją XPath.

Sizzle jest przydatny, ponieważ wykorzystuje natywną przeglądarkę przeglądarek, gdy jest dostępna (na przykład document.getElementsByClassName), ale wraca do robienia tego samego, gdy jest niedostępna (IE). Jest również używany przez jQuery i Prototype, więc jest mocno przetestowany i prawdopodobnie nie sprawi Ci żadnych kłopotów. Sizzle jest również mocno przetestowany i zoptymalizowany (mają cały speed test suite), co jest więcej pracy, której nie musisz robić.

Powiedziałbym, żebym używał jQuery, Prototype lub po prostu Sizzle sam, chyba że robisz coś niesamowicie zależnego od wydajności (co, szczerze mówiąc, jest prawdopodobnie wskaźnikiem, że źle skonstruowałeś swoją aplikację).

+0

Świetna odpowiedź, jeszcze jedno pytanie. Z uwagi na to, że 'querySelectorAll()' ma natywną właściwość, jest szybsze niż Sizzle. Wiem, że IE też tego nie obsługuje, ale w obsługiwanych przeglądarkach powinieneś użyć 'querySelectorAll()'? – Olical

+1

Nie ma powodu, aby używać 'querySelectorAll()' bezpośrednio, ponieważ [Sizzle używa go, jeśli jest dostępny] (https://github.com/jeresig/sizzle/blob/master/sizzle.js#L1077). Normalizuje również dziwactwa wokół tej funkcji w różnych przeglądarkach, więc możesz po prostu martwić się o kodowanie aplikacji, a nie o to, czy implementacja IE 8 jest nieco błędna. –