通常我们在做表单的时候,为了能给用户返回数据,我们使用 ajax 提交数据,然后阻止 form 表单提交。但是,最近老是发现 ajax 提交了两次,很是奇怪。
HTML
JS
发现 alert(1); 执行了两次,ajax 也提交了两次。
为了防止调用的地方增加而导致绑定的数量增加,使用 unbind 解除其他的绑定
HTML
JS
HTML
JS
其实这样就行了,不会执行执出现执行两次的情况。
补充一下
这种方式被称为事件委托,避免页面局部刷新后,js节点绑定丢失而导致js不执行。
如下例
HTML
- <form method="post" id="registerForm" onsubmit="return checkRegister();">
- <input type="text" name="username">
- <input type="password" name="password">
- <input type="email" name="email">
- <input type="submit" value="注册">
- </form>
JS
- function checkRegister() {
- alert(1);
- $.ajax({
- url: _ctx + "/register",
- type: 'POST',
- data: $("#registerForm").serialize(),
- beforeSend: function (request) {
- request.setRequestHeader(header, token);
- },
- success: function (response) {
- alert(response.success);
- if (response.success) {
- layer.alert('注册成功', {icon: 1});
- } else if (response.success == false) {
- layer.alert(response.message, {icon: 2});
- }
- },
- error: function () {
- layer.msg('注册失败');
- }
- });
- return false;
- }
发现 alert(1); 执行了两次,ajax 也提交了两次。
解决办法如下
为了防止调用的地方增加而导致绑定的数量增加,使用 unbind 解除其他的绑定
HTML
- <form method="post" id="registerForm" >
- <input type="text" name="username">
- <input type="password" name="password">
- <input type="email" name="email">
- <input type="submit" value="注册">
- </form>
JS
- $("#registerForm").unbind('submit').bind('submit', function () {
- alert(1);
- $.ajax({
- url: _ctx + "/register",
- type: 'POST',
- data: $("#registerForm").serialize(),
- beforeSend: function (request) {
- request.setRequestHeader(header, token);
- },
- success: function (response) {
- alert(response.success);
- if (response.success) {
- layer.alert('注册成功', {icon: 1});
- } else if (response.success == false) {
- layer.alert(response.message, {icon: 2});
- }
- },
- error: function () {
- layer.msg('注册失败');
- }
- });
- return false;
- });
更新
HTML
- <form method="post" id="registerForm" >
- <input type="text" name="username">
- <input type="password" name="password">
- <input type="email" name="email">
- <input type="submit" value="注册" id="submit">
- </form>
JS
- $(document).on('click', '#submit', function () {
- alert(1);
- $.ajax({
- url: _ctx + "/account/profile",
- type: 'POST',
- data: $("#profileForm").serialize(),
- async: false,
- beforeSend: function (request) {
- request.setRequestHeader(header, token);
- },
- success: function (response) {
- if (response.success) {
- layer.alert('修改成功', {icon: 1});
- $(".tab-content").load(_ctx + "/account/profile .tab-pane");
- $(".navbar-custom-menu-wrapper").load(_ctx + "/account/profile .navbar-custom-menu");
- } else if (response.success == false) {
- layer.alert(response.message, {icon: 2})
- }
- },
- error: function () {
- layer.alert('修改失败', {icon: 2});
- }, complete: function () {
- }
- });
- return false;
- });
其实这样就行了,不会执行执出现执行两次的情况。
补充一下
- $(document).on('click', '#submit', function () {
- }
这种方式被称为事件委托,避免页面局部刷新后,js节点绑定丢失而导致js不执行。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏