一、发现bug的过程
今天同事在使用我做的js表单验证控件时,发现当表单中存在一个name为nodeType的input时,验证组件就不好用了。经简单测试发现$('form :input')根本选择不到一个元素,心想这肯定是jquery的bug了。
二、分析bug
然后就打开jquery的源码粗略看了一下,发现里里边好多好多的代码都关系着nodeType的属性,这让我如何下手呢?这可是将近一万行的代码。泪奔呀。。。
随便打几个断点试试吧,无效无效。。。。心中那个纠结那个郁闷。。。
无意间发现了代码里这样一行注释。
/*! * Sizzle CSS Selector Engine v1.9.4-pre * http://sizzlejs.com/ * * Copyright 2013 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2013-05-27 */
心想我的这个问题肯定就是css选择器的问题,从这里下手肯定是对的。
然后去这个地址下载了sizzle.js,发现这个选择器问题在这里也是存在的。心中窃喜。然后就一点点调试找到了问题的根源。
发现的问题是什么呢?
就是当form表单里如果有一个 nodeType这样的一个input时,$('form')[0].nodeType 不等于1了,他的值是这个input对象。
三、解决bug
最后修改代码
把
if ( elem.nodeType === 1 || checkNonElements ) {
修改为
if ( (elem.nodeType === 1 || typeof elem.nodeType != "number") || checkNonElements ) {
(共有三处)
修改后发现Sizzle('form :input')好用了,对应地修改jquery里的 ,$('form :input')好用了。
但是悲催的是我的验证控件还是不好用。测试发现是因为$('form').find(':input')不好用造成的。心想难道还必须调试jquery的源码吗?心灰意冷了。真的想放弃了。刚才的喜悦与成就感没了。。。。。。
上网上又随便地查一些资料,查一些别人对jquery源码的剖析等,发现问题肯定还是出在Sizzle里,并悟出了find的方法应该就是Sizzle(':input',Sizzle( 'form ')[0]) ,测试发现我修改后的代码使用这种表达式依然不好用。(Sizzle中没有find的方法)
然后基于这个表达式进行测试,修改了另一处代码:
把
if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
替换为:
if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 && (typeof context.nodeType === "number")) {
大功告成。
以上修改方案仅为个人修改意见,并不能保证不会引发其它bug, 如君真要使用,请慎重。
本文为作者原创,转载请注明出处,与你分享我的快乐
http://www.cnblogs.com/weirhp
相关推荐
jQuery的基本选择器包括CSS选择器,它们与CSS语法兼容,例如: - 标签选择器:如`$("ul")`选取所有的无序列表元素。 - ID选择器:如`$("#myID")`选取ID为`myID`的元素。 - 类选择器:如`$(".myClass")`选取具有`...
addCombinator函数是jQuery选择器引擎中的一部分,主要用于生成基于给定关系选择器的执行函数。选择器引擎是jQuery用于解析和执行CSS选择器的部分,它能够将CSS选择器转换为能够匹配DOM元素的函数。 在详细解读...
jQuery的选择器基于CSS选择器,允许开发者以简洁的方式选取页面上的元素。例如,`$("#myID")`会选择ID为"myID"的元素,`$(".myClass")`会选择所有class包含"myClass"的元素。通过结合不同的选择器,我们可以精确地...
接下来是name属性选择器,这通常用于选择具有特定name属性的元素,特别是处理表单数据时。同样,我们可以编写一个函数来实现这一功能: ```javascript function getElementsByName(name) { var nameArr = []; var...
源码中定义了相关的功能函数,并利用jQuery的选择器和方法来实现功能。 #### 总结 这篇文章详细介绍了如何利用jQuery实现一个自定义的Placeholder属性插件,解决了老旧浏览器不支持HTML5 Placeholder属性的问题。...
此外,`jQuery-zTree`的API非常丰富,包括节点的增删改查、展开/折叠、选中/取消选中、获取选中节点、获取当前焦点节点等方法,为开发者提供了极大的灵活性。 在实际应用中,你可能需要结合后端接口动态加载数据,...
通过上述介绍可以看出,在使用 PhoneGap 和 jQuery Mobile 进行开发时,需要注意一些细节问题。例如,点击响应速度可以通过引入外部库来优化;页面滚动效果可以通过结合 iScroll 实现更好的体验;而原生的 alert 则...
jQuery通过$符号作为其主要接口,允许我们轻松地选择DOM元素,如`$("#id")`选择ID为"id"的元素,`$(".class")`选择所有class为"class"的元素,`$("tag")`选择所有特定类型的标签,如`$("p")`选择所有段落。...
此外,还有组合选择器(如 `$(‘div .class’)`,同时选择`div`内的所有`.class`元素)和基于属性的选择器(如 `$('input[type="text"]')`,选择所有文本输入框)。 ### 1.2 DOM操作 - `$(selector).html()`:设置...
* 参考: jquery css选择器 * 目前实现 * #id 根据给定的ID匹配一个元素 * tagName 匹配给定的元素名的所有元素 * .class 匹配class=class的所有元素 //非IE下,可以直接find * selector1,selector2 将每一个...
在JavaScript的世界里,jQuery库以其简洁的API和强大的功能深受开发者喜爱。在网页开发中,有时我们需要实现一种功能,即动态地高亮显示页面中的关键字,以帮助用户快速找到他们关心的信息。本教程将深入讲解如何...
总结一下,`:nth-child(an+b)`选择器在jQuery中是基于元素在父元素子元素列表中的位置来选取元素的,而不是基于全局或已过滤元素的位置。在编写这类选择器时,必须考虑到当前上下文和过滤操作对选择结果的影响,确保...
首先,我们需要理解基本的jQuery选择器和方法。jQuery的选择器类似于CSS,可以方便地选取DOM元素。在实现搜索高亮功能时,通常会使用`$('selector')`来选取包含待高亮文本的元素。例如,如果要高亮所有段落中的...
构造函数接受两个参数 `a` 和 `c`,它们分别代表选择器或 DOM 元素以及可选的上下文元素。构造函数内部包含了多种逻辑分支来处理不同类型的输入,并最终返回一个 jQuery 对象实例。 #### 三、构造函数分析 接下来...
总结,jQuery高亮显示关键词的实现主要依赖于jQuery的选择器和DOM操作功能,结合正则表达式进行文本替换,再配合自定义CSS样式,以达到视觉上突出显示关键词的效果。这个功能提高了用户体验,使搜索结果更易于阅读和...
- **事件委托与绑定**:当在元素`a`上发现事件数据时,`bD(a,b)`函数负责将事件监听器从`a`复制到`b`。这涉及到事件处理程序的复制和事件绑定逻辑,确保事件可以在克隆或移动的元素上正确触发。 #### 其他功能 - **...
// Will speed up references to window, and allows munging its name. window = this, // Will speed up references to undefined, and allows munging its name. undefined, // Map over jQuery in case of ...
以上只是JavaScript、jQuery和Ajax部分知识点的概述,实际上,每个主题都包含更深入的内容和细节,如jQuery的选择器、动画效果、Ajax请求的使用,以及更高级的JavaScript特性如Promise、async/await等,都需要通过...
在使用jQuery选择器时,除了class选择器外,还可以使用id选择器、属性选择器、伪类选择器等多种方式。不同的选择器能帮助我们更精确地定位到页面上的元素。获取到jQuery对象后,可以通过多种方式访问或操作这些对象...
根据描述,“使用 jQuery 和 Ajax 技术时需要导入该文件”,这意味着在使用这些技术之前,必须先将 jQuery 文件引入到项目中。通常,在 HTML 文件的 `<head>` 部分通过 `<script>` 标签引用 jQuery 文件: ```html ...