6

我正在处理一个表单并在 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(); 工作?

4

2 回答 2

9

您的特定示例对我有用,但如果我添加另一个同名字段:

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

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

原因是:

document.adv_search.keyword1

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

document.forms.adv_search.elements.keyword1

(顺便说一句,最好使用这个完整的语法,而不是依赖于在名称上索引的 'document' 和 'form' 对象的行为:如果将新方法添加到 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();

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

于 2009-04-06T13:06:44.607 回答
3

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>
于 2009-04-06T12:56:31.010 回答