这里非常简单的错误,我确定,但基本上我有一个标识为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..
答案 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
。