【问题标题】:document.evaluate - Cross browser?document.evaluate - 跨浏览器?
【发布时间】:2011-06-08 14:14:05
【问题描述】:

我一直在寻找 Sizzle 以外的 CSS 选择器功能,我遇到了 this function

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 文档上做到这一点。
  • 天哪,我终于发现有人和我有同样的想法:))))))))))))stackoverflow.com/questions/15310502/…

标签: javascript internet-explorer dom cross-browser document.evaluate


【解决方案1】:

我相信no stable version of IE supports document.evaluate,因此您只能使用其他所有浏览器。它并不慢,因为它是 XPath 的本机实现。

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

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

【讨论】:

  • 一个很好的答案,还有一个问题。由于querySelectorAll() 是本地人,它是否比 Sizzle 快。我知道 IE 也不支持这个,但是在支持的浏览器中你应该去querySelectorAll() 吗?
  • 也没有理由直接使用querySelectorAll(),因为Sizzle uses it if it's available。它还规范了在不同浏览器中围绕该功能的怪异之处,因此您只需担心对应用程序进行编码,而不用担心 IE 8 的实现是否有轻微错误。
【解决方案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查看他们的实现

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2011-11-15
      • 2011-03-03
      • 2012-09-30
      • 2013-05-12
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多