getElementById后为null?

时间:2011-09-02 20:30:47

标签: javascript dom getelementbyid

这里非常简单的错误,我确定,但基本上我有一个标识为formID的表单,我就这样称呼它:

<script type="text/javascript">
    function redvalidate() {
        var form = document.getElementById("formID")
        var fields = form.getElementsByClassName("validate"),

我收到错误:form is null

有人能发现错误吗?

(PS称其为提交表格)

更新 好吧基本上我有两个提交一个表格,这显然不起作用。所以我正在做的是从另一个内部调用这个函数......

表单标签:

<form name="purchaseform" id="formID" onSubmit="RememberFormFields('purchaseform','name,email,ship_to,phone_extension,pi_name');" action="process.php" method="post" enctype="multipart/form-data">

继承人RememberFormFields:

    <script type="text/javascript">
function RememberFormFields(form,list)
{
redvalidate()

...etc... rememberformfields function ...et.c..

4 个答案:

答案 0 :(得分:2)

他在提交表单时调用函数,因此在调用函数时肯定已经加载了表单。 (见http://jsfiddle.net/HaajY/

我宁愿在id或类似的地方拼错。 需要看到更多能够发现问题。

更新: 您需要将元素作为参数传递给函数。

这将有效:

<script type="text/javascript">
function redvalidate(elem) {
var fields = elem.getElementsByClassName("validate")
alert(fields)
}

function RememberFormFields(elem,form,list)
{
    redvalidate(elem);
}
</script>
<form name="purchaseform" id="formID" onSubmit="RememberFormFields(this,'purchaseform','name,email,ship_to,phone_extension,pi_name');" method="post" enctype="multipart/form-data">
    <input type="submit"/>
</form>

在此处查看此操作:http://jsfiddle.net/HaajY/2/

答案 1 :(得分:1)

假设您的页面上某处有html <form id="formID"...,您只需要延迟加载javascript直到DOM准备就绪。您正在尝试从尚未应用于DOM的元素中获取ID,因此JavaScript将其视为NULL。

有很多方法可以实现这一目标。您可以将所有JS放在</body>标记附近,您可以使用Google's suggested deferred javascript loading practice将所有JS附加到正文底部的<head>

这是JQuery非常方便的原因之一,因为您可以将代码包装在$(document).ready(function(){});块中,因此任何DOM操作脚本都将始终有效,因为它们会等到它们在触发之前创建DOM。它通过在现代浏览器中查找“DOMContentLoaded”事件来实现这一目的,并且为IE设置了doScrollCheck()函数,它试图一遍又一遍地滚动正文 - 如果它是可滚动的,他们知道它很好。如果您不想为此加载JQuery,则可以轻松复制此练习。

JQuery的DOM就绪检查:

if ( document.addEventListener ) {
    DOMContentLoaded = function() {
        document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
        jQuery.ready();
    };

} else if ( document.attachEvent ) {
    DOMContentLoaded = function() {
        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
        if ( document.readyState === "complete" ) {
            document.detachEvent( "onreadystatechange", DOMContentLoaded );
            jQuery.ready();
        }
    };
}

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }

    try {
        // If IE is used, use the trick by Diego Perini
        // http://javascript.nwbox.com/IEContentLoaded/
        document.documentElement.doScroll("left");
    } catch(e) {
        setTimeout( doScrollCheck, 1 );
        return;
    }

    // and execute any waiting functions
    jQuery.ready();
}

return jQuery;

})();

答案 2 :(得分:0)

这只是因为在加载DOM对象之前执行了该函数。使用body标签的“onload”功能来调用你的功能。或者使用jQuery的$(document).ready()函数来处理所有事情。

答案 3 :(得分:0)

您还可以在表格内嵌套表格。

<form>
    <form id="nested-form">
        <!-- html -->   
    </form>
</form>

在这种情况下,document.getElementById("nested-form")无法检测到嵌套形式,并且该函数将返回null