1

HTMLページに次のJavaScriptがあり、ページ上のHTMLフォームを参照しています。

<script type="text/javascript">
<!--

var myForm = document.myForm;

function validateForm() {
    if (myForm.myInput == "")
        alert("Please input some text.");

        return false;
    }

    myForm.submit();
}

function showFormInput() {
    myForm.reset();

    document.getElementById('myInput').style.display = 'inline';
}

//-->
</script>

...

<form name="myForm" id="myForm" action="..." method="post">
    <input id="myInput" name="myInput" type="text" value="" style="display:none;" />
</form>

両方の関数は、変数にアクセスしようとするmyFormと、「myFormがnullであるか、オブジェクトではない」という例外をスローします。なぜこれが発生するのですか?

更新:私がこれから収集していると思うことの1つは、グローバル変数は通常、DOMの要素ではなく、文字列リテラルに使用する必要があるということです。これを進めて、要素変数を慎重に使用し、DOMがロードされた後でのみ使用します。

4

3 に答える 3

10

どのブラウザを使用していますか?

一般に、document.*アクセスは決して使用しないでください。これは MS-IE 規則です。代わりに、

var myForm = document.getElementById( 'myForm' ) ;
var myInput = document.getElementById( 'myInput' ) ;

if( myInput.value == '' )
{
    // its empty!
}

前述のように、スクリプト ブロックをページの下部に配置するか、次onloadのように <body> タグのイベントを使用します。

<script>
function go()
{
    alert( "The DOM has been assembled and can be accessed.. nOW!!!" ) ;
    var myForm = document.getElementById( 'myForm' ) ; // ...
}
</script>
<body onload="go() ;">
</body>
于 2010-05-03T13:15:10.623 に答える
7

あなたの問題はにありdocument.myFormます。あなたは使用したいかもしれません:

var myForm = document.getElementById('myForm');

更新:他の回答は別のいくつかの問題を捉えました:

boboboboが別の回答で指摘したように、も使用する必要がありdocument.getElementById()ますmyForm.myInput。さらに、HTMLドキュメントの終わり近く、終了タグの直前にブロックを配置する必要があるため、 outisは別の問題を検出しました。そうしないと、フォームがDOMに挿入される前にスクリプトが実行されます。<script></body>

于 2010-05-03T13:10:35.327 に答える
7

サンプルがページを代表するものである場合、スクリプトが評価されるときにフォーム「myForm」は存在しません。document.getElementById(または)を使用することに加えてフォーム要素が処理されるまで設定を遅らせるか、グローバル変数を使用するのではなく、フォームを引数として関数に渡す必要があります。document.forms.formNamevar myForm

于 2010-05-03T14:06:05.883 に答える