`
achun
  • 浏览: 313854 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

搞清w3 selectors-api的工作方式

阅读更多

w3 2006 年就推出了w3 selectors-api 标准,目前支持的浏览器还不多.

今天在chrome和Firefox 3.1下做了一个测试,结果让我很迷惑

 

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Selectors API Example</title>
  </head>
  <body>
    <span>body span1</span>
    <span>body span2</span>
    <div id='bar'>
      <span>span1</span>
      <div>
          <span>span2</span>
      </div>
    </div>
  </body>
</html>

 

alert(document.getElementById('bar').querySelectorAll('div span').length);//2

 而目前常用的javascript框架中的选择器使用:jQuery举例

alert($('div span','#bar').length);//1

很明显w3的标准在匹配选择符的时候首先把查询范围的Element也包括进去了,而目前的框架是在查询范围的Element的子节点查找的.可是这样的话如果按w3的标准想要剔除这个范围的Element的话,上面的例子就要写成

alert(document.getElementById('bar').querySelectorAll('div div span').length);//1

也许还有其他的写法.

如果只想选择span1的话

//第一种情况,范围没有确定,也就是一个selector表达式下
document.querySelectorAll('#bar>span').length;//1
$('#bar>span').length;//1
//第二种情况,范围已经确定,
$('>span','#bar').length;//1
document.querySelectorAll('span',document.querySelector('#bar').length;//2
document.querySelectorAll('>span',document.querySelector('#bar').length;//出错了,不能这样写

我不知道是否是chrome 和Firefox 3.1 的实现有问题.还是他们都太按标准来了.

从某种程度上讲,w3把查询范围的Element也包括进去不是什么大问题,毕竟这是标准,大家习惯了就行了,可是

不支持 '>span'

这种写法就有问题了.如果其他的浏览器在实现上也这样做的话,那么这个标准就形同虚设了.

更进一步的测试:

document.getElementById('bar').querySelectorAll('*').length;//3,这次不包括查询范围了.
document.getElementById('bar').querySelectorAll('* div span').length;//2,又包括了
document.getElementById('bar').querySelectorAll('#bar').length;//0,又不包括了

事情更复杂了,选择器可以很复杂,但是对于范围的确定不应该有二义性.
======PS======
经过思考和hax的回复,终于搞清楚了,w3 设计的这个selectors-api是个
纯支持CSS selectors
同时标题也应该改改了
他要达到的是和在样式表里面写的css选择到的 elements 完全一致的结果。
而我们在写程序的时候和这个情形不一样,因为写css的时候是一次完成的,初始范围是整个document的所有节点.
写程序的时候,是有中间过程的,一次选择后的结果会被再一次做为初始范围。这和上面的就不同了。
用hax的描述说就是

写道
但现在浏览器中的CSS是没有局部化的selector 概念的,所以不支持也是情有可原

这样看来,还是要依靠像jQuery 这样的选择器一阵子了
===来自hax的测试代码===

document.querySelectorAll('span').length;//4
bar.querySelectorAll('span').length;//2
document.querySelectorAll('body span').length;//4
bar.querySelectorAll('body span').length;//仍然是2而
$('body span', bar);//则返回 null

所以 bar.querySelectorAll('body span') 的意思是
符合 body span 并且属于 bar 的子树的节点。
而 $('body span', bar) 表示的是
以bar为context,匹配 body span ,也就是相当于:
document.querySelectorAll('#bar body span')

 

 

 

5
1
分享到:
评论
3 楼 hax 2008-11-16  
补充一点,如果要搞清楚,可以把楼主的例子稍作改动,即在bar之外再加两个span,变成:

<body>
<div>
<span>...</span>
<span>...</span>
</div>
<div id="bar">
...
</div>
</body>

此时,

document.querySelectorAll('span')
应该返回4个span。

bar.querySelectorAll('span')
应该返回2个span。

但是注意,后者的意思和 $('span', bar) 不是一回事情。

我们换成下面这样就知道了:

document.querySelectorAll('body span')
应该返回4个span。

bar.querySelectorAll('body span')
还是返回2个span。

而 $('body span', bar) 则返回 null。


所以 bar.querySelectorAll('body span') 的意思是

符合 body span 并且属于 bar 的子树的节点。

而 $('body span', bar) 表示的是

以bar为context,匹配 body span ,也就是相当于:

document.querySelectorAll('#bar body span')

2 楼 hax 2008-11-16  
话说回来,将来也许会对类似jquery语义的方法进行标准化,因为HTML5会增加局部style的概念(如article元素下的style元素中的css只作用于article的子树),这就和jquery的context概念一致了。但现在浏览器中的CSS是没有局部化的selector概念的,所以不支持也是情有可原。
1 楼 hax 2008-11-15  
是你理解错误。

W3C的Selectors API的两个方法始终都是针对整个document的。

elem.querySelectorAll(s)

等价于(按JS 1.7的写法)

[node for each (node in document.querySelectorAll(s))
if (elem.compareDocumentPosistion(node) & Node.DOCUMENT_POSITION_CONTAINS)]

表示所有match的节点中属于elem的subtree的节点。

它与jquery的函数的第二个参数指定context的语义是不同的。

相关推荐

    Jquery,CSS,W3school等API

    在前端开发领域,jQuery、CSS和W3School是学习和工作中的重要工具。这些技术的API和电子书提供了丰富的资源,帮助开发者理解和掌握它们的功能与用法。 **jQuery API** jQuery是一个广泛使用的JavaScript库,它简化...

    jdk-7u17-apidocs

    Java的XML处理能力主要体现在`javax.xml`和`org.w3c.dom`等包中,包括了DOM、SAX、StAX等多种解析方式,以及XPath和XSLT等转换工具。 综上所述,Java JDK 1.7版本的API文档(jdk-7u17-apidocs)是一个全面的开发者...

    jQuery-1.6-api-en

    为了深入学习jQuery,可以访问官方文档(https://api.jquery.com/)和jQuery教程网站,如W3Schools(https://www.w3schools.com/jquery/)。此外,实践是提高技能的关键,通过编写实际项目来巩固理论知识。 总之,...

    css-selectors:W3C选择器3级规范的实现

    对于简单的一次关闭选择器匹配,最简单的方法是将选择器指定为字符串: Selectors selectors = new Selectors ( new W3CNode (document));List&lt; Node&gt; result = selectors . querySelectorAll( " head &gt; :not(meta)...

    java各种常用的API

    API包含了类库、接口、枚举、异常等,为开发者提供了大量的预先编写好的代码,使得开发工作更加高效和便捷。以下是一些重要的Java API及其相关知识点: 1. **基础API**: - `java.lang`:所有Java程序都会自动导入...

    通用dom api

    此外,CSS Selectors API允许我们使用CSS选择器选择元素,如`element.matches()`判断元素是否匹配某个选择器。 在学习和使用通用DOM API时,理解文档的节点树结构至关重要,因为所有操作都是基于这个树形结构进行的...

    02-CSS工具箱.rar

    名称 IE兼容速查表 ?css 2 W3C参考文档(英文版) .chm?css 2 W3C参考文档(中文版) .chmcss 2.0参考...SELECTORS API Level 2.txt w3C css selectorCSS1,CSS2,CSS3.txt阿里妈妈网页字体平台.txt 查询浏览器支持状态.txt

    CSS样式表中文API

    盒模型的类型有两种:标准盒模型(W3C标准)和IE盒模型,它们对边框和内边距的计算方式不同。 **三、定位(Positioning)** 1. **静态定位(Static)**:元素遵循正常文档流。 2. **相对定位(Relative)**:元素相...

    jquery经典中文手册

    - **在线教程**:W3School、MDN Web Docs等网站有详细的jQuery教程。 - **开源项目**:参与GitHub上的jQuery相关项目,提升实践能力。 - **社区论坛**:Stack Overflow、jQuery Forum等社区可以解答疑惑,交流经验。...

    jquery1.8.3API

    jQuery是JavaScript库中的一款经典...虽然这个版本相对较旧,但很多基础概念和API在新版本中依然适用,是理解jQuery工作原理的良好起点。随着学习的深入,开发者将能够熟练运用jQuery构建响应式、高性能的网页应用。

    jQuery入门指南教程

    1. **选择器(Selectors)**:jQuery支持CSS选择器,如`id`、`class`、`tag`等,以及更复杂的选择器组合。例如,选取ID为"example"的元素: ```javascript $("#example"); ``` 2. **DOM操作(DOM Manipulation)...

    JavaScript APIs HTML5

    The Selectors API provides a set of functions for selecting elements from the DOM using CSS selectors. This is an alternative to the traditional DOM traversal methods and can be more efficient in ...

    ie8自动设置 兼容性代码

    5. **IE8Mode**:提供了最高的标准支持,包括W3C CSS Level 2.1 Specification、W3C Selectors API,并部分支持W3C CSS Level 3 Specification。 6. **EdgeMode**:指示IE以当前可获得的最高模式显示内容。在IE8中...

    DOM文档对象中文手册

    DOM是W3C(World Wide Web Consortium)组织制定的标准,使得开发人员可以使用各种编程语言(如JavaScript、Java、Python等)对网页内容进行动态操作。 DOM将网页视为一个树形结构,其中每个节点代表文档的一部分。...

    jquery学习笔记

    - **事件处理(Event Handling)**: jQuery提供了一种统一的方式来绑定和触发事件。如`$("button").click(function() { alert("Button clicked!"); });`。 - **动画(Animation)**: jQuery的`.fadeIn()`, `....

    jquery-JavaScript框架

    - **选择器(Selectors)**: jQuery支持CSS1到CSS3的选择器,以及一些特有的选择器,如`:eq()`, `:gt()`, `:lt()`, `:first`, `:last`等,使得元素选取变得非常便捷。 - **链式调用(Chaining)**: 由于jQuery对象...

    davidrivers.name:弗吉尼亚州阿灵顿的前端工程师 David Rivers 的个人博客和作品集

    )来过滤匹配的博客文章、作品集和我的简历部分按时间顺序过滤项目(博客文章、作品集、工作经历) 加载 Sizzle 以填充对 W3C Selectors API 的支持? (如此处所述: : ) 一旦我得到以下答案,将 Mongoose 实现为...

    jquery初学者必读

    - **选择器(Selectors)**:jQuery的选择器与CSS选择器相似,但提供了更强大的功能,如`$("#id")`选择ID为id的元素,`$(".class")`选择所有class为class的元素。 - **DOM操作(DOM Manipulation)**:包括元素的...

    jquery 中文教程

    jQuery的核心特性包括选择器(Selectors)、DOM操作、事件处理、动画效果和Ajax交互。 ### 二、jQuery选择器 jQuery选择器是基于CSS选择器的扩展,使得选取DOM元素变得简单。例如,`$("#id")`用于选取ID为"id"的...

    jquery中文手册

    - 在线示例和教程:网上有大量免费资源,如W3Schools、Mozilla Developer Network等,提供互动式的jQuery教程。 ### 7. 结合实际应用 在实际项目中,jQuery常用于页面交互增强、数据异步加载和页面组件的构建。...

Global site tag (gtag.js) - Google Analytics