jQuery中的未记录的行为?

时间:2014-02-13 17:16:19

标签: jquery

是否记录了以下行为(即我应该依赖它)?

由于错误,我有一个对话框,并在javascript中使用一个简单的单词引用它的id。令人惊讶的是,我没有收到错误,代码按预期工作,

示例(在JSFiddle.net here上)有2个简单的对话框

<div id="Hello">
   <input id="box1" name="box1" type="text" value="not change">
</div>
<div id="Goodbye">
   <input id="box1" name="box1" type="text" value="not change">
</div>

javascript缺少第Hello = $("#Hello");行。

$("#Hello").dialog({
    autoOpen:false, 
    modal:true, 
    width:"auto"}
);
$("#Hello").dialog("open");
$("#Goodbye").dialog("open");
$('[name="box1"]',Hello).val("test");  

令人惊讶的是,最后一行更新了Hello div中的文本框,但我找不到记录此行为的任何地方。它只是一个模糊的副作用,不是依赖,或者这是一个有效的jQuery选择器样式?

仅供参考,我使用的是Chrome版本32.0.1700.107 m。

4 个答案:

答案 0 :(得分:4)

是的,这是预期的行为。由于您的页面上有一个ID为“Hello”的元素,因此在窗口上自动定义一个指向该元素的属性,相当于:

window.Hello = document.getElementById("Hello");

这已经在所有浏览器中存在了很长一段时间,我不确定在哪里,甚至是否记录在案。 jQuery没有这样做。

http://jsfiddle.net/w4YJw/

通常建议不要依赖于此,因为通过定义名称与id相同的变量可以轻松地将其打破。它还会破坏某些功能,例如,提交提交按钮id="submit"将无法拨打form.submit()

答案 1 :(得分:1)

$('[name="box1"]',Hello)向DOM查询属性name等于box1的元素,因此您的小提琴起作用。第二个参数是上下文,但是undefined,jQuery将其解析为整个document

Anyways, the behaviour is documented here

答案 2 :(得分:0)

jQuery构造函数仍然可以工作,你刚刚传入undefined上下文,它仍然可以在文档范围内找到名为“box1”的元素。

答案 3 :(得分:-1)

在同样的小提琴例子中试试这个:

$(text).val("test");

它输入了输入字段的值,因为它在属性和属性中找到它匹配它