javascript - 如果发生验证错误,Ajax 表单将发送两次

标签 javascript jquery ajax

我了解 event.preventDefault()event.stopImmediatePropagation()。但这对我不起作用。就我而言,我有这样的 ajax 调用:

$('#templateConfirmDialog').on('show.bs.modal', function (event) {
    $(this).find('.modal-yes').click(function(){
                var form = form2js('search_form', '.', true, function (node) {}, false);
                var requestData = JSON.stringify(form, replacer);
                var $formErrors = $('.search_form').find('.alert-danger');
                event.preventDefault();
                event.stopImmediatePropagation();
                $.ajax({
                    type: 'POST',
                    contentType : "application/json",
                    url: '/fraud/template/testCreate',
                    data: requestData,
                    dataType: 'json',
                    success:  function (data) {
                        $formErrors.text('');

                         //if no errors just reload
                        if (data === undefined || data.length === 0) {
                            location.reload();
                        }
                        else {

                            //else bind error messages
                            data.forEach(function(error) {
                                $('#new-' + error.field + '-error').text(error.defaultMessage);
                            })
                        }
                    }
                });
});

我的问题是,ajax 调用被阻止的次数与我尝试输入数据的次数一样多。如果我输入了一次无效数据 - ajax 会被调用两次。如果是两次- 3次。这种行为的原因可能是什么?

最佳答案

每次发生此事件时:

$('#templateConfirmDialog').on('show.bs.modal', function (event) {

您绑定(bind)一个新的点击事件处理程序:

$(this).find('.modal-yes').click(function(){

因此,如果您 show.bs.modal 两次,那么就有两个 click 事件处理程序都提交 AJAX 请求。相反,只需将 click 事件处理程序一次绑定(bind)到目标可点击元素,而不是每次显示模式时都绑定(bind)它。

替换这个:

$('#templateConfirmDialog').on('show.bs.modal', function (event) {
    $(this).find('.modal-yes').click(function(){
        //...
    });
});

这样:

$('#templateConfirmDialog').find('.modal-yes').click(function(){
    //...
});

或者,如果该元素动态添加到 DOM,则:

$(document).on('click', '#templateConfirmDialog .modal-yes', function(){
    //...
});

这样,在页面加载时只创建一个单击事件处理程序,而不是每次显示模式时添加一个新的处理程序。

关于javascript - 如果发生验证错误,Ajax 表单将发送两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47202050/

相关文章:

javascript - Ember 仅适用于一页网站?

javascript - AJAX POST - 如何在 PHP 中使用 js 变量

javascript - 显示更多 - 显示更少显示 31 行而不是 30 行

javascript - 如何将节点从一个列 div 拖到另一列 div

javascript - 如何将 URL 字符串传递到 jQuery $.each 循环中的服务器端单击处理程序?

使用隐藏 IFrame 下载 PHP 文件而不保存

javascript - 我怎样才能实现这个twbs分页

javascript - 使用 JavaScript 动态插入 Adsense

php - 如何创建可编辑的下拉列表?使用 AJAX

javascript - "Re open last closed tab"导致显示最后的ajax请求内容