14

Ho cercato una funzione selettore CSS diversa da Sizzle e ho trovato 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; 
} 

mi sento come che sia troppo bello per essere vero, questo è un firefox unica funzione (XPath?) O è lento? Fondamentalmente perché dovrei usare Sizzle su questo?

+0

Penso che sia solo Firefox, che delusione. Apparentemente IE può farlo su documenti XML. – Olical

+0

o mio dio finalmente ho trovato qualcuno che pensa allo stesso modo di iam :))))))))))))) http://stackoverflow.com/questions/15310502/how-to-create-a- javascript-selector-engine – Marwan

risposta

10

Credo in no stable version of IE supports document.evaluate, quindi sei limitato a tutti gli altri browser. Non è lento poiché è un'implementazione nativa di XPath.

Sizzle è utile perché utilizza l'offerta di browser di supporto nativo quando disponibile (come ad esempio document.getElementsByClassName), ma torna a farlo da solo quando non disponibile (IE). Viene anche utilizzato da jQuery e Prototype, quindi è pesantemente testato, ed è improbabile che ti dia qualche problema. Sizzle è anche fortemente testato e ottimizzato per la velocità (hanno un intero speed test suite), che è più lavoro che non devi fare.

Direi di andare con jQuery, Prototype o semplicemente Sizzle da solo a meno che non si stia facendo qualcosa di incredibilmente sensibile alle prestazioni (che, onestamente, è probabilmente un indicatore del fatto che hai strutturato male la tua applicazione).

+0

Un'ottima risposta, solo un'altra domanda. Dato che 'querySelectorAll()' è nativo, è più veloce di Sizzle. So che anche IE non supporta questo, ma nei browser supportati dovresti usare 'querySelectorAll()'? – Olical

+1

Ci sono pochi motivi per usare 'querySelectorAll()' direttamente, poiché [Sizzle lo usa se è disponibile] (https://github.com/jeresig/sizzle/blob/master/sizzle.js#L1077). Normalizza anche le stranezze attorno a quella funzione in diversi browser, quindi puoi semplicemente preoccuparti di codificare la tua applicazione e non sapere se l'implementazione di IE 8 è un po 'buggata. –