搞清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')

 

 

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值