【问题标题】:Best way to find DOM elements with css selectors使用 CSS 选择器查找 DOM 元素的最佳方法
【发布时间】:2010-10-27 13:50:09
【问题描述】:

在不使用库的情况下,使用 css 选择器查找 Dom 元素的最简单方法是什么?

function select( selector ) {
 return [ /* some magic here please :) */ ]
};

select('body')[0] // body;

select('.foo' ) // [div,td,div,a]

select('a[rel=ajax]') // [a,a,a,a]

这个问题纯属学术性的。我有兴趣了解这是如何实现的以及“障碍”是什么。这个函数的预期行为是什么? (返回数组,或返回第一个 Dom 元素等)。

【问题讨论】:

标签: javascript css-selectors


【解决方案1】:

除了自定义hacks,在最近的浏览器中你可以使用W3C Selectors API Level 1中定义的原生方法,即document.querySelector()document.querySelectorAll()

var cells = document.querySelectorAll("#score > tbody > tr > td:nth-of-type(2)");

【讨论】:

  • 这现在应该是选择的答案 - 除了 IE7 之外的所有现代浏览器都受支持? 2013 年 8 月,这对我来说已经足够了!
  • 使用 querySelectorAll 时,您将获得一个元素数组,因此,如果您期望一个元素,则应在末尾添加 [0]。或者你可以简单地使用 document.querySelector()
【解决方案2】:

这是我用过几次的不错的 sn-p。它真的很小很整洁。它支持所有常见的 css 选择器。

http://www.openjs.com/scripts/dom/css_selector/

【讨论】:

    【解决方案3】:

    如今,在没有图书馆的情况下做这种事情是疯狂的。但是,我假设您想了解这些东西是如何工作的。我建议您查看 jQuery 或其他 javascript 库之一的源代码。

    考虑到这一点,选择器函数必须包含大量 if/else/else if 或 switch case 语句,以便处理所有不同的选择器。示例:

    function select( selector ) {
     if(selector.indexOf('.') > 0) //this might be a css class
       return document.getElementsByClassName(selector);
     else if(selector.indexOf('#') > 0) // this might be an id
       return document.getElementById(selector);
     else //this might be a tag name
       return document.getElementsByTagName(selector);
     //this is not taking all the different cases into account, but you get the idea.
    };
    

    【讨论】:

    • 不一定——看看 Sizzle(jQuery 的引擎),你不会看到任何这些。
    • 这在现代浏览器中是不必要的。 querySelectedAll() 是更好的解决方案。
    【解决方案4】:

    创建选择器引擎并非易事。我建议从已经存在的东西中学习:

    • Sizzle(由 Resig 创建,用于 jQuery)
    • Peppy(由 James Donaghue 创建)
    • Sly(由 Harald Kirschner 创建)

    【讨论】:

    • 很棒的链接!非常有意思。特别是那个性能测试运行器。
    【解决方案5】:

    不,没有内置的方式。本质上,如果您决定不使用 jQuery,您将在代码中复制它的错误版本。

    【讨论】:

    • 公平地说,JQuery 并不是唯一提供选择器风格功能的库,只是最突出的。
    • 是的,当然。 “没有 jQuery”,我的意思是没有选择的外部库。
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2011-01-10
    • 1970-01-01
    • 2012-09-03
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多