2009-04-06 9 views
3

私はフォームで作業しています。Javascript focus()とselect()quirk

<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> 

を使用した場合のに対し、すべてのものは、私は理由を理解したいと思います

結構です。 i)は(それが


はdocument.formname.fieldname.focusをはずの入力フィールドに対して予め

おかげIDタグを有することなく動作するようにたい。 およびdocument.formname.fieldname.select(); の作品ですか?

答えて

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 

(ちなみに、それは新しい文書をHTMLDocumentやHTMLFormElementに追加すると、使用しているコントロールの名前と衝突する可能性があります。これは、document.formsまたはフォームを使用した場合の問題ではありません。要素コレクション。また、IEは誤ってすべての名前とIDを 'ドキュメント'にダンプします。したがって、という名前のフォームに加えて、document.adv_searchという要素があると、間違ったものが返されます。

とにかく、 DOM Level 0スクリプトメソッドは、このような名前で要素にアクセスすると、やや不思議な挙動をします。一致する要素が1つある場合は、その要素をスタンドアロンオブジェクトとして取得します。一方、複数の場合は、オブジェクトのリストを取得します。 focus()またはselect()を配列のようなリストに呼び出すことはできません。そのため、エラーが表示されます。リストが返ってきたら、keyword1 [0] .focus()のようなことをしなければなりません。

旧式のDOM Level 0メソッドを使用してフォームコントロールにアクセスするかどうかを決める必要があります。その場合は、シングルまたはマルチフォームのスニッフィングに対処する必要があります。コントロール - あるいは「DOMレベル1」によって導入IDベースの方法に移動:

document.getElementById('keyword1').focus(); 

IDベースの方法は、スクリプトの中で(一般的にもう少しタイピングであり、あなたが望むすべての要素に」idを追加します彼らがまだそれらを持っていないならば、この方法にアクセスする)が、単純で曖昧ではありません。 (また、あなたがして<フォーム>自体にnameをドロップすることができます。)

+0

おかげで多くのことを忘れてしまいました。非常に役立ちます。まさに私が知りたかったもの。 – chris

+0

あなたは正しいです。私が使用しているコードは同じ名前の2つのフィールドを持っていました。 – chris

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> 
+0

getElementsByNameがエラーああ[0]、それを固定 – chris

+0

「オブジェクトはこのプロパティまたはメソッドをサポートしてdoesntの」を与える使用して言及するおかげ – chris