Javascript jQuery eq函数的意外行为
我在自己编写的程序中发现了一个bug,但错误的行为让我无法解释: 如果我有:Javascript jQuery eq函数的意外行为,javascript,jquery,Javascript,Jquery,我在自己编写的程序中发现了一个bug,但错误的行为让我无法解释: 如果我有: <input type="text" name="cust_id" value="666" /> <input type="text" name="phone[]" value="666" /> 我看到: 令我惊讶的是,eq(0)选择了第一个输入,尽管我明确告诉它只查找带有name=phone[] 这是一把小提琴: 这是预期的行为吗?eq选择器是否忽略属性选择器?使用 var test =
<input type="text" name="cust_id" value="666" />
<input type="text" name="phone[]" value="666" />
我看到:
令我惊讶的是,eq(0)
选择了第一个输入,尽管我明确告诉它只查找带有name=phone[]
这是一把小提琴:
这是预期的行为吗?eq选择器是否忽略属性选择器?使用
var test = $("input[name='phone[]']:eq(0)");
在美国
jQuery(“[attribute='value']”)
属性:属性名称
值:属性值可以是不带引号的单个单词或带引号的字符串。
属性值周围缺少引号。试试这个-
var test=$('input[name=“phone[]”]:eq(0)')代码>选择器中的方括号会混淆属性选择部分,因为它没有被引用。请注意,如果您将第二个输入的名称更改为phone
,则:
或者,将属性选择器用引号括起来:
$("input[name='phone']:eq(0)")
您需要引用名称属性:
var test = $("input[name='phone[]']:eq(0)");
因为phone[]
是没有引号的无效名称。所以jQuery解析器(或DOM)只是忽略所有无效的内容,并将选择器视为简单的input[name='phone']:eq(0)
。同样值得注意的是,这种行为似乎在jQuery的最新版本中得到了修复。您在演示中使用了非常旧的1.6.4,但如果您使用1.8.x
及更高版本进行检查,它将正常工作并抛出错误
例如,如果您尝试
试试看{
document.querySelector(“输入[name=phone[]”)
}
捕获(e){
警报(e.message)
}
引用name属性的值并不是严格要求的(大多数情况下,jQuery不使用它们也可以正常工作),正如您注意到的,当涉及到非字母数字字符时,jQuery会将它们解释为CSS符号,您可能会遇到不寻常的情况
解决方案是按照jQuery的建议,始终正确转义这些字符(:
,
,[
,]
,等等),并使用两个反斜杠:
为了告诉jQuery按照字面意思处理这些字符,而不是
而作为CSS符号,它们必须通过放置两个
他们前面的反斜杠
因此,根据jQuery文档,您应该使用var test=$(“input[name='phone\\[\\]']:eq(0)”
作为选择器(尽管在您的案例中简单地正确引用字符串也可以)
Ref:链接到选择器文档并解释您更改的内容可能会很有用。请记住花点时间解释为什么您的答案可以解决问题。啊,需要引号?测试选择器var test=$(“输入[name=phone[])代码>显示它不工作。请参阅以了解原因。@dgig:是的,如果要测试的属性值不符合属性的定义,则需要这些属性值。(jQuery文档对此有点含糊其辞,最好转到规范:-)如果它符合标识符的定义,则引号是可选的。根据发生的情况,我认为解析器会忽略无效的选择器,而不是将其视为name='phone'
。否则,我不明白为什么会选择第一个input
元素:input:eq(0)
或input[name]
。感谢您的详细回答,非常有用。感谢您提供了需要注意的特殊字符列表,非常有用。
$("input[name='phone']:eq(0)")
var test = $("input[name='phone[]']:eq(0)");