document.evaluate - 跨浏览器兼容性?

14

我一直在寻找一个除了 Sizzle 以外的 CSS 选择器函数,然后我发现了 这个函数

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

我只是觉得这太好了,可能只在Firefox上有效(xpath?),还是很慢吗?基本上为什么要使用Sizzle而不是这个?


我认为这只适用于Firefox,真是令人失望。显然IE可以在XML文档上实现此功能。 - Olical
哦,我的天啊,终于找到有人与我想法相同了:)))))))))))))http://stackoverflow.com/questions/15310502/how-to-create-a-javascript-selector-engine - Marwan
3个回答

10

我认为没有稳定版本的IE支持document.evaluate, 所以你只能使用其他浏览器。它不慢,因为它是XPath的本地实现。

Sizzle很有用,因为它在浏览器提供原生支持时使用(例如document.getElementsByClassName),但在不可用时会自己完成(IE)。它还被jQueryPrototype使用,因此经过了大量测试,不太可能出现问题。 Sizzle还经过了大量速度测试和优化(他们有一个完整的speed test suite),这是您无需做的更多工作。

我建议使用jQuery,Prototype或仅使用Sizzle,除非您正在进行极其性能敏感的操作(老实说,这可能表明您的应用程序结构不良)。


一个很好的回答,只有一个问题。由于querySelectorAll()是本地的,所以它比Sizzle更快吗?我知道IE也不支持这个,但在支持的浏览器中,你应该选择querySelectorAll()吗? - Olical
1
直接使用 querySelectorAll() 也没有太多的原因,因为 Sizzle 如果可用就会使用它。 它还规范化了不同浏览器中该函数的奇怪行为,因此您只需要关心编写应用程序,而不必担心 IE 8 的实现略有缺陷。 - Brian Donovan

2

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接