Javascript focus()和select()quirk

时间:2009-04-06 12:52:27

标签: javascript forms select focus

我正在处理一个表单并且在ie。

中获取null或者不是对象错误
<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>

//如果我使用

<script>
var key1 = document.getElementById('keyword1');
   key1.focus();
   key1.select();
</script>

//一切都很好

我想了解原因。 我希望它没有输入字段的id标记

提前致谢


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

2 个答案:

答案 0 :(得分:9)

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

<input type="text" name="keyword1" />
<input type="text" name="keyword1" />

然后document.adv_search.keyword1.focus()将因您指定的错误而失败。

原因是:

document.adv_search.keyword1

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

document.forms.adv_search.elements.keyword1

(顺便说一句,最好使用这个完整的语法,而不是依赖于名称上索引的'document'和'form'对象的行为:如果向HTMLDocument或HTMLFormElement添加新方法,可能会发生冲突使用您正在使用的控件名称。当您使用document.forms或form.elements集合时,这不是一个问题。而且,IE错误地将所有名称和ID转储到'document'中,所以如果你有一个元素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();

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

答案 1 :(得分:2)

ID方法确实是最好的,但如果你想按名称去,请使用getElementsByName

在这种情况下,它可能如下所示:

<script>
   // retrieves array of objects with the name 'keyword1' 
   // and takes the first one
   var key1 = document.getElementsByName('keyword1')[0]; 
   key1.focus();
   key1.select();
</script>