`

部分浏览器中querySelector和querySelectorAll的错误实现

阅读更多

querySelector和querySelectorAll是W3C提供的新的查询接口

module dom {
	[Supplemental, NoInterfaceObject]
	interface NodeSelector {
		Element querySelector(in DOMString selectors);
		NodeList querySelectorAll(in DOMString selectors);
	};
	Document implements NodeSelector;
	DocumentFragment implements NodeSelector;
	Element implements NodeSelector;
};
 

 

从接口定义可以看到Document、DocumentFragment、Element都实现了NodeSelector接口。即这三种类型的元素都拥有者两个方法。querySelector和querySelectorAll的参数须是符合 css selector 的字符串。不同的是querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已经支持它们。

如想获取页面class属性为"red"的元素,除了使用document.getElementsByClassName('red')还可以使用document.querySelector('.red')和document.querySelectorAll('.red')。

但Element.querySelector和Element.querySelectorAll的实现有错误,如下:

<div id="d1">
    <p>
        <a href="http://www.sina.com.cn">
            SINA
        </a>
    </p>
</div>
<script type="text/javascript">
    function $(id) {
        return document.getElementById(id);
    }

    var d1 = $('d1');

    var obj1 = d1.querySelector('div a');

    var obj2 = d1.querySelectorAll('div a');

    alert(obj1); // -> http://www.sina.com.cn/ 
    alert(obj2.length); // -> 1   
    
</script>
 

在支持这两个方法的浏览器可以看到分别弹出了“http://www.sina.com.cn/”,和 “1”。说明查询到了想要的元素或元素集合。这与W3C的定义却是不合的,根据定义应该是在元素d1范围内查找"div a",而d1内压根没有div。因此应该分别返回null,空集合。

jQuery1.4.2 及之前版本中只使用了document.querySelectorAll,没有使用Element.querySelectorAll。 jQuery1.4.3 后使用了Element.querySelectorAll,但做了修复。在选择器前加了"#__sizzle__"以强制其在指定元素内查找(3903-3918行)。简化下:

function $(id) {
    return document.getElementById(id);
}

var d1 = $('d1');

var obj1 = d1.querySelector('div a');

var obj2 = d1.querySelectorAll('div a');

var old = d1.id,
id = d1.id = "__sizzle__";

try {

    var query = '#' + id + ' div a';

    alert(d1.querySelector(query));

    alert(d1.querySelectorAll(query).length);

} catch(e) {

} finally {

    old ? d1.id = old: d1.removeAttribute("id");

}

实现很巧妙,指定范围的元素如果有id,将其保留在old,"__sizzle__"赋值其作为临时id,在选择器"div a"前指定查找范围为"#__sizzle__",即d1。finally语句来最后清理,如果指定范围的元素本身有id将其恢复为old,没有则去掉临 时的id属性"__sizzle__"。

 

[转自 :http://www.jzxue.com/wangzhankaifa/javascript-ajax/201103/30-6951.html ]

分享到:
评论

相关推荐

    IE8下关于querySelectorAll()的问题

    querySelectorAll()方法是W3C标准的一部分,用于返回文档中匹配指定CSS选择器的所有元素。在IE8中,这个方法被引入作为对现代浏览器特性的追赶,但在实际使用中可能需要注意一些兼容性问题。 首先,问题在于当属性...

    浏览器兼容性问题

    这往往是由于浏览器内核对CSS规则的解析和实现差异造成的。常见的内核有Trident(IE)、Gecko(Firefox)、Blink(Chrome、Opera)和WebKit(Safari)等,它们对CSS的支持程度和解析方式各有特点。 脚本相关问题...

    winfrom_cefSharp实现淘宝模拟点击实例

    总的来说,"winfrom_cefSharp实现淘宝模拟点击实例"是一个综合了C#、Winforms和CefSharp技术的实战项目,它展示了如何在桌面应用中实现对网页的自动化控制,对于学习Web自动化和了解浏览器内核的交互有极大的帮助。...

    javascript积累

    这包括选择元素(querySelector、querySelectorAll)、创建和修改元素、添加和删除元素等。 2. 动画效果:JavaScript可以用于创建各种动画,例如平滑滚动、淡入淡出、滑动门、轮播图等。这通常涉及到定时器...

    javaScript 300例

    JavaScript是Web开发中不可或缺的一部分,它是一种轻量级的脚本语言,主要应用于浏览器端,用于实现动态交互和丰富的用户体验。"JavaScript 300例"这个资源集合提供了一个全面的学习平台,帮助开发者深入理解和实践...

    JavaScript教程--从入门到精通.zip

    学会选择元素(如getElementById、querySelector、querySelectorAll等)、修改元素属性、插入和删除节点,是进行网页动态更新的基础。 异步编程是JavaScript的另一大特色,主要涉及回调函数、Promise和async/await...

    html中js点击一键复制功能,兼容各大浏览器

    在HTML页面中,JavaScript(JS)常常被用来增强用户体验,其中一种常见的应用场景就是实现“一键复制”功能。...记得在实际使用中,根据浏览器版本和用户需求,适当地进行错误处理和用户体验优化。

    JavaScript核心技术开发解密随书源码

    6. **DOM操作**:JavaScript可以直接操作文档对象模型(DOM),通过选择元素(querySelector, querySelectorAll等)、添加和移除元素、修改属性和样式来改变网页内容。 7. **AJAX与Fetch API**:用于向服务器发送...

    JavaScript速查手册

    在JavaScript中,错误处理是不可或缺的一部分,手册可能会列出常见的Error类型,如TypeError、ReferenceError、SyntaxError等,并给出如何捕获和处理这些错误的方法。 总的来说,这个“JavaScript速查手册”是...

    js技巧大全,一看就明白

    使用querySelector和querySelectorAll选择元素,innerHTML和textContent属性处理元素内容,addEventListener和removeEventListener管理事件。 9. **错误处理**:try...catch语句用于捕获并处理运行时错误。throw...

    JavaScript中文帮助文档

    6. **AJAX和Fetch API**:介绍异步编程,包括XMLHttpRequest对象的使用和现代浏览器支持的Fetch API,用于在后台与服务器交换数据并更新部分网页内容。 7. **闭包和作用域**:解析JavaScript中的作用域规则,特别是...

    Javascript高级教程1d

    学习如何选择元素(如通过getElementById、querySelector或querySelectorAll)、修改元素属性、添加或删除元素,以及如何监听和处理事件,是提升Web交互性的关键。 ES6(ECMAScript 2015)及后续版本引入了许多新...

    Jay Skript and the Domsters

    7. **错误处理与调试**:学习如何捕获和处理运行时错误,以及利用浏览器开发者工具进行有效的代码调试。 8. **图片素材与代码源码**:项目中包含的图片素材和源码文件,为读者提供了实际操作的机会,可以通过阅读和...

    JS.tar.gz_5J8

    此外,CSS选择器在JavaScript中的应用,如querySelector和querySelectorAll,也是实现页面交互的重要工具。 数组的方法,如map、filter、reduce、forEach等,能帮助你对数据进行处理和转换。而Array.prototype对象...

    javascript对象参考手册

    在DOM(文档对象模型)部分,手册会讲解如何使用JavaScript操作HTML元素,如选择元素(getElementById、querySelector、querySelectorAll等)、添加和删除元素、改变元素内容和样式等。事件处理也是DOM编程的关键,...

    javascript笔记

    11. **DOM遍历与选择**:包括getElementById、getElementsByClassName、getElementsByTagName、querySelector和querySelectorAll等方法,用于查找DOM树中的特定元素。 12. **定时器**:setTimeout和setInterval用于...

    简单的chrome插件,实现自动登录.

    3. **自动填充表单** - 当检测到特定页面时,插件会查找登录表单,使用`document.querySelector()`或`document.querySelectorAll()`选择相应的输入字段,然后用`value`属性设置用户名和密码。 4. **模拟点击** - ...

    Javascript技术技巧大全

    以上只是JavaScript技术体系中的一部分,通过深入理解和实践这些技巧,可以极大地提升JavaScript编程能力。在"Javascript技术技巧大全"这个压缩包中,你可能会找到关于这些话题的实例代码和详细解释,帮助你在实际...

    ppk谈JavaScript.pdf

    5. **AJAX**:异步JavaScript和XML,用于实现页面的无刷新更新,涉及XMLHttpRequest对象的使用、请求和响应处理、跨域问题以及现代浏览器中的fetch API。 6. **ES6及以后的新特性**:如解构赋值、模板字符串、let和...

    JacaScript试题

    - 元素选择:掌握getElementById、getElementsByClassName、getElementsByTagName、querySelector和querySelectorAll等方法。 - 属性操作:改变元素的属性值,如innerHTML、innerText、style等。 - 事件绑定:...

Global site tag (gtag.js) - Google Analytics