记一次jQuery id选择器返回不一致问题

jQuery版本:1.9.1

先看代码:

<head>
    <title>测试页面</title>
    <script type="application/javascript" src="jquery-1.9.1.js"></script>
</head>
<body>
<div id="test">我是id为”test”的div1</div>
<div id="test">我是id为”test”的div2</div>
<button onclick="changeColor(test)">jq改变id为”test”的颜色</button>
<br/>
<br/>
<div id="test测试">我是id为“test测试”的div1</div>
<div id="test测试">我是id为”test测试”的div2</div>
<button onclick="changeColor(test测试)">jq改变id为”test测试”的颜色</button>
</body>
<script>
    function changeColor(divId){
        var color = $(this).attr("customColor") || #000;
        color = color === #000 ? #f00 : #000;
        $(this).attr("customColor", color);
        $("#" + divId).css("color", color);
    }
</script>

上面代码都是通过id找到对应元素并修改其字体颜色,通过实测

我们发现id为“test”的元素只有第一个元素的颜色发生了改变;但是id为“test测试”的确是两个都发生了改变。

带着这个疑问我跟踪了jQuery的源码,发现jQuery在查找元素前正则“/^(?:#([w-]+)|(w+)|.([w-]+))$/”检测该选择器是id、标签【tag】还是类【class】选择器。

从正则分析我们发现id选择器实则是通过本地方法getElementById进行获取【该方法仅会返回匹配的第一个元素】;不匹配的则用本地方法querySelectorAll进行获取【该方法会找出所有匹配的节点并返回数组】。

jQuery部分源码:

至此我们了解到了为什么同样使用jQuery为什么有时返回一个元素有时又返回所有匹配的元素。

总结:

通过上面分析所以大家在命名id、class或者自定义tag时按照数字、字母、中划线和下划线命名规则命名。

jQuery版本:1.9.1 先看代码: 测试页面
我是id为”test”的div1
我是id为”test”的div2


我是id为“test测试”的div1
我是id为”test测试”的div2
上面代码都是通过id找到对应元素并修改其字体颜色,通过实测 我们发现id为“test”的元素只有第一个元素的颜色发生了改变;但是id为“test测试”的确是两个都发生了改变。 带着这个疑问我跟踪了jQuery的源码,发现jQuery在查找元素前正则“/^(?:#([w-]+)|(w+)|.([w-]+))$/”检测该选择器是id、标签【tag】还是类【class】选择器。 从正则分析我们发现id选择器实则是通过本地方法getElementById进行获取【该方法仅会返回匹配的第一个元素】;不匹配的则用本地方法querySelectorAll进行获取【该方法会找出所有匹配的节点并返回数组】。 jQuery部分源码: 至此我们了解到了为什么同样使用jQuery为什么有时返回一个元素有时又返回所有匹配的元素。 总结: 通过上面分析所以大家在命名id、class或者自定义tag时按照数字、字母、中划线和下划线命名规则命名。
经验分享 程序员 微信小程序 职场和发展