Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery eq函数的意外行为_Javascript_Jquery - Fatal编程技术网

Javascript jQuery eq函数的意外行为

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 =

我在自己编写的程序中发现了一个bug,但错误的行为让我无法解释:

如果我有:

<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)");