阻止AJAX表单提交两次? [英] Prevent AJAX form from submitting twice?

查看:52
本文介绍了阻止AJAX表单提交两次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道为什么此AJAX表单要处理两次并发送一封电子邮件.您可以看到导致这种情况发生的代码中是否存在某种明显的重组?

HTML

 < form class ="submit-form" method ="post"><输入type ="url" class ="content-link" name ="content_link"占位符="Link"/><输入type ="email" class ="email" name ="email" placeholder =您的电子邮件地址"/>< button class ="submit-modal-button提交按钮">< span>发送< span class ="ss-icon"> send</span></span></button>< p class ="terms">通过单击提交,您同意我们的& nbsp;< a href =<?php echo home_url('terms-of-use');?>">条款&;条件</a</p></form> 

JavaScript

  processSubmitModal:function(){var form = $('.submit-form'),content_link = $('.submit-form input [type ="url"]'),email = $('.submit-form input [type ="email"]'),viewport_size = $(window).width()+"x" + $(window).height(),user_browser = BrowserDetect.browser,user_os = BrowserDetect.OS,current_page = document.location.href;$('.submit-form input [type ="url"] ,. submit-form input [type ="email"]').blur(function(){如果($ .trim($(this).val())==''){$(this).addClass('form-validation-error');返回false;} 别的 {$(this).removeClass('form-validation-error');}});form.submit(function(){if($ .trim(content_link.val())==''&& $ .trim(email.val())==''){content_link.addClass('form-validation-error');email.addClass('form-validation-error');返回false;}否则if($ .trim(content_link.val())==''){content_link.addClass('form-validation-error');返回false;}否则if($ .trim(email.val())==''){email.addClass('form-validation-error');返回false;} 别的 {var env = TTB.getEnvironment();$('.submit-modal-button').attr('disabled','disabled');$(document).ajaxStart(function(){$('.submit-modal .screen-1').delay(300).append('< span class ="loading2"></span&';));});$ .ajax({网址:env.submit_modal_process,输入:"POST",数据: {content_link:content_link.val(),电子邮件:email.val(),viewportsize:viewport_size,浏览器:user_browser,操作系统:user_os,当前页:当前页},成功:功能(){$('.submit-modal .screen-1').delay(1000).fadeOut(300,function(){$('.submit-modal .screen-1').fadeOut(500,function(){$('span.loading2').detach();$('.submit-modal .screen-2').fadeIn(500,function(){$('.submit-modal .screen-2').append('< img class ="carlton" src ='+ env.the_environment + TTB.config.image_path()+'submit-modal-success.gif'+'/>');});$('.submit-modal .screen-2').css('display','block').delay(4200).fadeOut(500,function(){$('.carlton').hide();$('.submit-modal .screen-1').fadeIn(500);content_link.val('');email.val('');content_link.focus();email.removeClass('form-validation-error');$('.submit-modal-button').removeAttr('disabled');});});});}});返回false;}});}Example.processSubmitModal(); 

解决方案

如果要从您的摘要中删除所有与问题代码无关的内容,我们将获得以下信息:

HTML

 < form class ="submit-form" method ="post"><输入type ="url" name ="content_link"/><输入type ="email" name ="email"/>< button>发送</button></form> 

JavaScript

  $(function(){var EXAMPLE = {processSubmitModal:function(){var form = $('.submit-form'),content_link = $('.submit-form input [type ="url"]'),email = $('.submit-form input [type ="email"]');form.submit(function(){$ .ajax({网址:document.location.href,输入:"POST",数据: {content_link:content_link.val(),电子邮件:email.val()},成功:函数(){//<-被执行两次的函数//做一点事}});返回false;});}};Example.processSubmitModal();//在代码段中未显示的代码中的某处...Example.processSubmitModal();}); 

我玩弄了您的代码片段,它始终仅执行一次AJAX调用并处理 email 一次,唯一的情况除外-在代码中的某处您调用 EXAMPLE.processSubmitModal()再次.在您的代码中搜索,几乎可以确定这是原因.请注意,每次调用 EXAMPLE.processSubmitModal()时,您都会添加另一个处理程序到表单的 submit 事件中,而不要覆盖它./p>

I can't figure out why this AJAX form is processing and sending out an email twice. Is there some sort of obvious hickup in the code you can see causing this to occur?

HTML

<form class="submit-form" method="post">
<input type="url" class="content-link" name="content_link" placeholder="Link" />
<input type="email" class="email" name="email" placeholder="Your Email Address" />
<button class="submit-modal-button submit-button"><span>Send<span class="ss-icon">send</span></span></button>
<p class="terms">By clicking Submit you agree to our&nbsp;<a href="<?php echo home_url('terms-of-use'); ?>">Terms & Conditions</a></p>
</form>

JavaScript

    processSubmitModal : function () {
    var form = $('.submit-form'),
        content_link = $('.submit-form input[type="url"]'),
        email = $('.submit-form input[type="email"]'),
        viewport_size = $(window).width() + "x" + $(window).height(),
        user_browser = BrowserDetect.browser,
        user_os = BrowserDetect.OS,
        current_page = document.location.href;

    $('.submit-form input[type="url"],.submit-form input[type="email"]').blur(function () {
        if ($.trim($(this).val()) == '') {
            $(this).addClass('form-validation-error');
            return false;
        } else {
            $(this).removeClass('form-validation-error');
        }
    });

    form.submit(function () {
        if ($.trim(content_link.val()) == '' && $.trim(email.val()) == '') {
            content_link.addClass('form-validation-error');
            email.addClass('form-validation-error');
            return false;
        }
        else if ($.trim(content_link.val()) == '') {
            content_link.addClass('form-validation-error');
            return false;
        }
        else if ($.trim(email.val()) == '') {
            email.addClass('form-validation-error');
            return false;
        } else {
            var env = TTB.getEnvironment();

            $('.submit-modal-button').attr('disabled','disabled');
            $(document).ajaxStart(function () {
                $('.submit-modal .screen-1').delay(300).append('<span class="loading2"></span>');
            });
            $.ajax({
                url: env.submit_modal_process,                      
                type: 'POST',
                data: {
                    content_link: content_link.val(),
                    email: email.val(),
                    viewportsize: viewport_size,
                    browser: user_browser,
                    os: user_os,
                    current_page: current_page
                }, 
                success: function () {
                    $('.submit-modal .screen-1').delay(1000).fadeOut(300, function () { 
                        $('.submit-modal .screen-1').fadeOut(500, function () {
                            $('span.loading2').detach();

                            $('.submit-modal .screen-2').fadeIn(500, function () {
                                $('.submit-modal .screen-2').append('<img class="carlton" src=' + env.the_environment + TTB.config.image_path() + 'submit-modal-success.gif' + ' />');  
                            });

                            $('.submit-modal .screen-2').css('display','block').delay(4200).fadeOut(500, function () {
                                $('.carlton').hide();
                                $('.submit-modal .screen-1').fadeIn(500);   
                                content_link.val('');
                                email.val('');
                                content_link.focus();
                                email.removeClass('form-validation-error');
                                $('.submit-modal-button').removeAttr('disabled');
                            });
                        }); 
                    });                  
                }
            });
        return false;
        }
    });
}
   EXAMPLE.processSubmitModal();

解决方案

If to remove all non relevant to the issue code from your snippets we will get the following:

HTML

<form class="submit-form" method="post">
    <input type="url" name="content_link" />
    <input type="email" name="email" />
    <button>Send</button>
</form>

JavaScript

$(function() {
    var EXAMPLE = {
        processSubmitModal : function () {
            var form = $('.submit-form'),
                content_link = $('.submit-form input[type="url"]'),
                email = $('.submit-form input[type="email"]');

            form.submit(function () {
                $.ajax({
                    url: document.location.href,
                    type: 'POST',
                    data: {
                        content_link: content_link.val(),
                        email: email.val()
                    },
                    success: function () { // <-- The function that is executed twice
                        // Do something
                    }
                });
                return false;
            });
        }
    };
    EXAMPLE.processSubmitModal();

    // And somewhere in the code that was not presented in snippet...
    EXAMPLE.processSubmitModal();
});

I played around with your snippet and it always performs only one AJAX call and process email once except the only case - when somewhere in the code you call EXAMPLE.processSubmitModal() once again. Search in your code, I'm almost sure it is the reason. Pay attention that each time you call EXAMPLE.processSubmitModal() you add one another handler to submit event of the form and not override it.

这篇关于阻止AJAX表单提交两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆