form的submit()方法不能触发onsubmit事件的解决方法,兼容各版本浏览器。

当使用JavaScript的form.submit()方法触发表单提交时,可能不会触发onsubmit事件。文章通过示例代码解释了这个问题,并提供了针对IE、Firefox和Chrome等浏览器的兼容性解决方案,包括使用fireEvent和dispatchEvent方法来确保onsubmit事件在所有浏览器中都能被正确触发。

form的submit()方法不能触发onsubmit事件的解决方法,兼容各版本浏览器。

在处理表单提交的时候遇到一个问题,通常用<input type="submit" value="提交" />按钮来提交form,再监听form的onsubmit事件就能在前端处理表单验证的事情。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form id="form" action="http://www.a.com" method="post">
        <input type="submit" value="提交" />
    </form>
    
    <script>
    var form =document.getElementById("form");
    form.onsubmit = function(){
        alert("表单提交了")
    }     
    </script>
</body>
</html>

 

以上代码很顺利,没有任何问题。

当用别的元素来触发form的提交时确不会触发onsubmit事件。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form id="form" action="http://www.a.com" method="post">
        <input type="submit" value="提交" />
    </form>
    <a href="javascript:void(0)" id="txtBtn">提交</a>
    <script>
    var form =document.getElementById("form"),
    txtBtn = document.getElementById("txtBtn");

    txtBtn.onclick = function(){
        form.submit();
    }
    form.onsubmit = function(){
        alert("表单提交了")
    }     
    </script>
</body>
</html>

当点击a链接的提交时以为会弹出:表单提交了,可是没有,但表单内容是提交了的,但没有触发onsubmit事件。查了下手册,原文如下:

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. 

关于fireEvent的介绍,可以看这里:http://msdn.microsoft.com/en-us/library/ms536423(v=vs.85).aspx

于是加上fireEvent。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form id="form" action="http://www.a.com" method="post">
        <input type="submit" value="提交" />
    </form>
    <a href="javascript:void(0)" id="txtBtn">提交</a>
    <script>
    var form =document.getElementById("form"),
    txtBtn = document.getElementById("txtBtn");

    txtBtn.onclick = function(){        
        form.fireEvent('onsubmit');
        form.submit();        
    }

    form.onsubmit = function(){
        alert("表单提交了")
    }
    
    </script>
</body>
</html>

以上代码如愿的弹出:表单提交了,用a标签提交也能触发onsubmit事件了。

到此为止以为OK了,可是在chrome和firefox下依然不行。百度GOOGLE一翻,找到了解决方法,直接上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form id="form" action="http://www.a.com" method="post">
        <input type="submit" value="提交" />
    </form>
    <a href="javascript:void(0)" id="txtBtn">提交</a>
    <script>
    var form =document.getElementById("form"),
    txtBtn = document.getElementById("txtBtn");

    txtBtn.onclick = function(){        
        var result;
        if(form.fireEvent){
            //IE浏览器
            result=form.fireEvent('onsubmit');
        }else{
            //FIREFOX\CHROME等标准浏览器
          var evt = document.createEvent('HTMLEvents');  
          evt.initEvent('submit',false,true);  
          result=form.dispatchEvent(evt);  
        }
        if(result){
            form.submit();
        }
        
    }

    form.onsubmit = function(){
        alert("表单提交了")
    }
    
    </script>
</body>
</html>

 

 完美解决问题,各浏览器下表现一致了!

关于firefox,chrome等标准浏览器的实现中所用到的方法,具体描述看下面几个链接:

http://www.w3school.com.cn/xmldom/met_document_createevent.asp

http://www.w3school.com.cn/xmldom/met_element_dispatchevent.asp

http://www.w3school.com.cn/jsref/event_initevent.asp

 

好文要顶 关注我 收藏该文 icon_weibo_24.png wechat.png

tyson
粉丝 - 1 关注 - 11

+加关注

« 上一篇: getBoundingClientRect获取元素在页面上的位置
» 下一篇: 兼容的获取样式的函数getStyle()

在实现表单提交时,调用 `submitForm` 方法是一种常见的做法,特别是在使用某些前端框架(如 Vue.js 或 UniApp)时。该方法通常用于触发表单的提交行为,同时可以结合表单验证、数据处理等逻辑。 以下是如何调用 `submitForm` 方法实现表单提交的几种方式: ### 1. 在 Vue 中调用 `submitForm` 方法 如果你使用的是 Vue.js,并且希望手动触发表单提交,可以通过 `$refs` 来调用 `submitForm` 方法。例如: ```html <template> <el-form ref="form" :model="formData" label-width="120px"> <el-form-item label="姓名"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-button @click="handleSubmit">提交</el-button> </el-form> </template> <script> export default { data() { return { formData: { name: '' } }; }, methods: { handleSubmit() { this.$refs.form.submitForm((valid) => { if (valid) { // 表单验证通过,执行提交操作 console.log('表单验证通过,准备提交'); } else { // 表单验证失败 console.log('表单验证失败'); return false; } }); } } }; </script> ``` 在上述代码中,`submitForm` 方法接受一个回调函数,用于处理表单验证结果。如果验证通过,则可以执行进一步的提交逻辑。 ### 2. 在 UniApp 中调用 `submitForm` 在 UniApp 中,可以通过 `$refs` 调用表单的 `_onSubmit` 方法来实现表单提交。例如: ```html <template> <view> <form ref="form" @submit="formSubmit"> <input type="text" v-model="formData.name" /> <button form-type="submit">提交</button> </form> <button @click="manualSubmit">手动提交</button> </view> </template> <script> export default { data() { return { formData: { name: '' } }; }, methods: { manualSubmit() { this.$refs.form._onSubmit(); // 手动调用表单提交方法 }, formSubmit(e) { console.log('表单提交事件触发', e); // 处理表单提交逻辑 } } }; </script> ``` 在上述代码中,`manualSubmit` 方法通过 `$refs` 调用了 `_onSubmit` 方法,从而手动触发表单提交。 ### 3. 使用 JavaScript 原生方法调用表单提交 如果你不使用框架,可以直接通过 JavaScript 调用表单的 `submit` 方法。例如: ```html <form id="myForm" action="/submit" method="POST"> <input type="text" name="name" /> <button type="button" onclick="submitForm()">提交</button> </form> <script> function submitForm() { document.getElementById('myForm').submit(); // 触发表单提交 } </script> ``` 在上述代码中,`submitForm` 函数通过 `document.getElementById` 获取表单元素并调用其 `submit` 方法,从而实现表单提交。 ### 4. 使用 jQuery 提交表单 如果你使用 jQuery,可以通过 `submit()` 方法触发表单提交。例如: ```html <form id="myForm" action="/submit" method="POST"> <input type="text" name="name" /> <button type="button" id="submitBtn">提交</button> </form> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function() { $('#submitBtn').click(function() { $('#myForm').submit(); // 触发表单提交 }); }); </script> ``` 在上述代码中,点击按钮时会触发 `submit()` 方法,从而提交表单。 ### 5. 结合 AJAX 提交表单数据 如果你希望在提交表单时不刷新页面,可以结合 AJAX 提交表单数据。例如: ```html <form id="myForm"> <input type="text" name="name" /> <button type="button" onclick="submitForm()">提交</button> </form> <script> function submitForm() { const formData = new FormData(document.getElementById('myForm')); fetch('/submit', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { console.log('提交成功:', data); }) .catch(error => { console.error('提交失败:', error); }); } </script> ``` 在上述代码中,`submitForm` 函数使用 `fetch` API 提交表单数据,避免了页面刷新。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值