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 呢?

4

3 回答 3

10

我相信没有稳定版本的 IE 支持document.evaluate,因此您仅限于其他所有浏览器。它并不慢,因为它是 XPath 的本机实现。

Sizzle 很有用,因为它在可用时使用浏览器提供的本机支持(例如document.getElementsByClassName),但在不可用时(IE)回退到自己做。jQueryPrototype也使用它,因此它经过大量、大量测试,不太可能给您带来任何麻烦。Sizzle 也经过了严格的速度测试和优化(他们有一个完整的速度测试套件),这是您不必做的更多工作。

我会说使用 jQuery、Prototype 或仅使用 Sizzle 本身,除非您正在做一些对性能非常敏感的事情(老实说,这可能表明您的应用程序结构不佳)。

于 2011-01-13T16:00:37.773 回答
2

我刚刚找到http://sourceforge.net/projects/js-xpath/,它声称是

Internet Explorer 5+ 的 DOM Level 3 XPath 的实现

在http://nchc.dl.sourceforge.net/project/js-xpath/js-xpath/1.0.0/xpath.js查看他们的实现

于 2013-01-30T23:07:44.547 回答
0

它是一个 DOM3 W3C 工作组注:http ://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226/xpath.html#XPathEvaluator-evaluate

实施状态:https ://developer.mozilla.org/en-US/docs/Web/API/document.evaluate#Browser_compatibility今天仅不在最新稳定桌面浏览器上的 IE 10 中。

于 2014-07-05T10:51:44.637 回答