Javascript focus()和select()quirk

chr*_*ris 5 javascript forms select focus

我正在处理一个表单并获取null或不是对象错误ie.

<form action="#" method="post" name="adv_search">

<input class="inputbox" type="text" name="keyword1" value="none" id="keyword1"/>
</form>

<script>
document.adv_search.keyword1.focus();
document.adv_search.keyword1.select();
</script>
Run Code Online (Sandbox Code Playgroud)

//如果我使用

<script>
var key1 = document.getElementById('keyword1');
   key1.focus();
   key1.select();
</script>
Run Code Online (Sandbox Code Playgroud)

//一切都好

我想明白为什么.我希望它没有输入字段的id标签

提前致谢


不应该是document.formname.fieldname.focus(); 和document.formname.fieldname.select(); 工作?

bob*_*nce 9

您的特定示例适用于我,但如果我添加另一个具有相同名称的字段:

<input type="text" name="keyword1" />
<input type="text" name="keyword1" />
Run Code Online (Sandbox Code Playgroud)

然后document.adv_search.keyword1.focus()将失败并显示您指定的错误.

原因是:

document.adv_search.keyword1
Run Code Online (Sandbox Code Playgroud)

是这种语法的快捷方式(可以追溯到DOM级别0和Netscape 2天!):

document.forms.adv_search.elements.keyword1
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这是更好地使用这个完整的语法,而不是依靠"文档"和"形式"的对象被索引的名称的行为:如果一个新的方法添加到HTMLDocument的或HTMLFormElement,可能与控制冲突命名您正在使用,这是不成问题的,当您使用document.forms或form.elements集合.此外,IE错误地转储所有名称和ID为"文件",所以如果你有一个元素与id="adv_search"除以此作为名称的表单document.adv_search将返回错误的表单.)

无论如何,当您按名称访问元素时,DOM Level 0脚本方法的行为略显奇怪.如果只有一个匹配元素,您将把它作为一个独立的对象.另一方面,如果有多个,您将获得一个对象列表.您不能调用focus()select()在类似数组的列表上,这就是错误出现的原因; 返回列表时,你必须执行keyword1 [0] .focus()之类的操作.

因此,您必须决定是否要使用旧式DOM Level 0方法来访问表单控件 - 在这种情况下,您将不得不应对单个或多个控件的嗅探 - 或者移动到'DOM Level 1'引入的基于ID的方法:

document.getElementById('keyword1').focus();
Run Code Online (Sandbox Code Playgroud)

基于ID的方法通常需要更多的输入(在脚本中并将'id'添加到您希望以这种方式访问​​的所有元素,如果它们还没有它们),但它们很简单且明确.(你也可以name放在<form>上.)