views:

138

answers:

3

I have the following JavaScript in my HTML page referencing an HTML form on the page:

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

Both functions are throwing an exception when trying to access the variable myForm, saying that "myForm is null or not an object". Why is this occurring?

UPDATE: One thing I think I'm gathering from this is that global variables should generally be used for string literals - not elements in the DOM. I"m going to go forward with this, and use element variables sparingly, and only after the DOM has been loaded.

+7  A: 

Your problem is in document.myForm. You may want to use:

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

UPDATES: The other answers caught another couple of issues:

As bobobobo noted in another answer, you should use document.getElementById() for myForm.myInput as well. In addition outis caught another problem as you should place your <script> block near the end of your HTML document, just before the closing </body> tag. Otherwise your script will execute before the form gets inserted in the DOM.

Daniel Vassallo
You beat me to it +1
Romain Hippeau
+10  A: 

What browser are you using?

IN general you should never use document.* access. This is an MS-IE convention. Instead, use

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

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

As outis noted, either put your script block at the bottom of your page, or use the onload event of <body> tag, like this

<script>
function go()
{
    alert( "The DOM has been assembled and can be accessed.. nOW!!!" ) ;
    var myForm = document.getElementById( 'myForm' ) ; // ...
}
</script>
<body onload="go() ;">
</body>
bobobobo
+1 for catching the other problem :)
Daniel Vassallo
Thanks. I'm going to avoid document.* from now on.
Eric Belair
+7  A: 

If the sample is representative of the page, the the form "myForm" doesn't exist when the script is evaluated. In addition to using document.getElementById (or document.forms.formName), you'll need to delay setting var myForm until after the form element is processed or, better yet, pass the form as an argument to the functions rather than using a global variable.

outis
+1 good catch ...
Daniel Vassallo
I thought this might be the problem. It makes sense. Thank you.
Eric Belair