我的表单有onsubmit="checkform()"事件(校验表单),如果直接使用input的submit控件提交表单时这个事件会被触发。
代码改成通过input的button的onclick="submitForm('loginForm','login')"事件来动态提交表单后,如下代码(红色部分):
function submitForm(formName,eventName){
formId = document.getElementById(formName);
formId.action = 'common/P0101002-login.action';
        formId.submit();
}
结果表单的onsubmit事件不执行了。难道这是js造成的?如果这样不能触发onsubmit事件,有没有什么变通的方法解决。
注意:我不希望在submitForm函数去执行checkform函数,因为sumitForm函数被封装成了全局js函数,而checkform是页面中的函数。

解决方案 »

  1.   

    JS没错,看FORM的NAME或者ID的问题
      

  2.   

    貌似是你传值传错了,看你写的,好像是传的form的名字,但是你拿form对象的时候却是getElementById
      

  3.   

    可能是我没有表达清楚,不是说js提交表单失败,提交表单成功了,但是表单中的“onsubmit事件”没有被触发。
    也就是说,虽然表单数据提交到服务器了,但是没有经过表单验证。
      

  4.   

    function submitForm(formName,eventName){ 
     
    document.forms[0].action = 'common/P0101002-login.action'; 
    document.forms[0].submit();} 
      

  5.   

    你不希望在SubmitForm中执行CheckForm
    但是你可以在CheckForm中执行SubmitFrom啊。
      

  6.   

    <form name="formname" action="" method="post">
       <input type=button value="" onclick="submitForm()">
    </form>
    <script language=javascript>
    function submitForm(){ 
    if(checkform()){
    document.formname.action = 'common/P0101002-login.action'; 
    document.formname.submit(); 
    }else{
    alert("sssss");
    }
    }
    </script> 
      

  7.   

    今天无意中看到加菲鱼的这篇文章,终于搞明白了这个问题。
    原址:http://hi.baidu.com/ystar/blog/item/b021cbfc10c036fefc037f21.html
    官方的解释是这样的:
    The submit method does not invoke the onsubmit event handler. Call the onsubmit event handler directly. When using Microsoft® Internet Explorer 5.5 and later, you can call the fireEvent method with a value of onsubmit in the sEvent parameter. 
    大意是说submit方法是不能连带触发onsubmit事件,你可以直接调用onsubmit事件。如果使用的是微软5.5及以后版本,你还可以使用firEvent方法将onsubmit方法作为一个参数值来调用。根据上面的解释修正源代码如下(注意红色代码部分):
    function submitForm(formName, eventName){
    var formId = document.getElementById(formName);
    if(formId.fireEvent('onsubmit')){ formId.action = formId.action.replace(".", "_" + eventName + ".");
    formId.submit();
    }
    }搞定,谢谢加菲鱼。不过上面的写法当浏览版本较低或非IE时可能会有一些问题,如果有朋友愿意测试一下不胜感激,分一定会给。
    另外有朋友可能会说为什么不直接调用ousubmit()事件,如下:
    function submitForm(formName, eventName){
    var formId = document.getElementById(formName);
    if(formId.onsubmit()){ formId.action = formId.action.replace(".", "_" + eventName + ".");
    formId.submit();
    }
    }
    这个我试过了,但这种写法要求form标签中必须书写onsubmit事件代码,否则会报错。
    但并不是所有form必需书写onsubmit代码,所以这种写法不论form是否需要校验都必须加上onsubmit事件,造成不必要的垃圾代码。
    但fireEvent方法就没有这个问题。
    有兴趣的朋友可以继续研究一下,有结果了大家分享一下,谢谢!