14

Я искал функцию выбора CSS, отличную от Sizzle, и я столкнулся с this function.document.evaluate - Перекрестный браузер?

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

Я просто чувствую, что это слишком хорошо, чтобы быть правдой, является ли это светлячок только функция (XPath?) Или это медленно? В принципе, почему я должен использовать Sizzle над этим?

+0

Я думаю, что это только firefox, как неутешительно. Очевидно, IE может сделать это на XML-документах. – Olical

+0

o мой бог, наконец, я нашел, что кто-то думает так же, как и я :))))))))))))) http://stackoverflow.com/questions/15310502/how-to-create-a- javascript-selector-engine – Marwan

ответ

10

Я считаю no stable version of IE supports document.evaluate, поэтому вы ограничены обоими браузерами. Это не так медленно, поскольку это встроенная реализация XPath.

Sizzle полезен, потому что он использует встроенные браузеры поддержки, когда они доступны (например, document.getElementsByClassName), но возвращается к тому, чтобы делать это сам, когда недоступен (IE). Он также используется jQuery и Prototype, поэтому он сильно, сильно тестируется и вряд ли даст вам какие-либо проблемы. Sizzle также сильно проверен на скорость и оптимизирован (у них есть целый speed test suite), что больше не нужно делать.

Я бы сказал, что я использую jQuery, Prototype или просто Sizzle, если вы не делаете что-то невероятно чувствительное к производительности (что, честно говоря, вероятно, является индикатором того, что вы плохо структурировали ваше приложение).

+0

Отличный ответ, еще один вопрос. Из-за 'querySelectorAll()' является родным, это быстрее, чем Sizzle. Я знаю, что IE тоже не поддерживает это, но в поддерживаемых браузерах вы должны искать 'querySelectorAll()'? – Olical

+1

Существует мало причин использовать 'querySelectorAll()' непосредственно либо, так как [Sizzle использует его, если он доступен] (https://github.com/jeresig/sizzle/blob/master/sizzle.js#L1077). Он также нормализует странности вокруг этой функции в разных браузерах, поэтому вы можете просто беспокоиться о кодировании своего приложения, а не о том, является ли реализация IE 8 немного ошибкой. –

 Смежные вопросы

  • Нет связанных вопросов^_^