jquery - 使用 jQuery 和 Ajax 启动 Bootstrap Modal 后,单击事件处理程序会多次发生

标签 jquery ajax twitter-bootstrap bootstrap-modal

我设计了一个简单的模式,其工作方式与用户尝试删除任何实体时的 JavaScript 确认类似。当用户单击“删除”图标时,在该图标的单击事件上将启动以下模式。

enter image description here

如果用户单击"is",则会发送 ajax 请求来删除该项目。当第一个 ajax 请求发送时它工作得很好。但是,当用户尝试再次执行相同的操作时,它会发送两个请求,依此类推以进行下一次尝试。我不知道出了什么问题。

这是我的“删除图标”的 HTML:

<a href="javascript:void(0)" class="btn btn-default">
<?php echo $item_name . " "; ?>
<i class="fa fa-times delete_item" data-url="<?php echo $url; ?>" data-item_id="<?php echo $item['id']; ?>" ></i></a>

对于模态:

<div class="modal fade">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-body">
            <h5 style="text-align:center;">Do you want to delete this item?</h5>
            <br />
            <div>
                <button type="button" class="btn btn-danger pull-right confirm_delete">Yes</button>
                <button type="button" class="btn btn-default pull-right" data-dismiss="modal">No</button>
            </div>
            <br />
        </div>
    </div>
</div>

这是我的 JavaScript:

$('body').on('click', '.delete_item', function(e){
e.preventDefault();
var url = $(this).data('url');
var data = 'item_id=' + $(this).data('item_id');
var btn = $(this);

$(btn).parents('form').children('.modal').modal('show');

$('.modal-body').on('click', '.confirm_delete', function(e){
    e.preventDefault();
    var confirm = $(this);
    $.ajax({
        type: 'post',
        url: url,
        data: data,
        dataType: 'json',
        cache: false,
        success: function(data){
            if(data.status)
            {
                $(btn).parent('.btn').remove();
            }
            else
            {
                alert('error');
            }
        },
        complete: function(){
            $(confirm).parents('.modal').modal('hide');
        }
    });
});

});

最佳答案

这是因为单击第二个删除按钮时注册了多个单击事件处理程序。

使用 off() 作为一个解决方案删除以前的处理程序

$('body').on('click', '.delete_item', function (e) {
    e.preventDefault();
    var url = $(this).data('url');
    var data = 'item_id=' + $(this).data('item_id');
    var btn = $(this);

    $(btn).parents('form').children('.modal').modal('show');

    $('.modal-body').off('click.confirm').on('click.confirm', '.confirm_delete', function (e) {
        e.preventDefault();
        var confirm = $(this);
        $.ajax({
            type: 'post',
            url: url,
            data: data,
            dataType: 'json',
            cache: false,
            success: function (data) {
                if (data.status) {
                    $(btn).parent('.btn').remove();
                } else {
                    alert('error');
                }
            },
            complete: function () {
                $(confirm).parents('.modal').modal('hide');
            }
        });
    });
});

关于jquery - 使用 jQuery 和 Ajax 启动 Bootstrap Modal 后,单击事件处理程序会多次发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21251075/

相关文章:

css - 去掉 Bootstrap 风格怎么样?

javascript - 如何将此工作 JS 代码转换为 JQUERY

javascript - 用 jQuery 替换字符串中的字母字符和空格

javascript - XMLHttpRequest;跨源请求仅支持协议(protocol)方案 : http, data, chrome, chrome-extension, https, chrome-extension-resource

javascript - 将变量从 Rails 传递到 js.erb 文件

html - 你如何获得一个元素来填充 btn-group 中的其余空间?

javascript - 使用 jQuery 获取具有特定类名的对象的 "ancestor"的可靠方法

jQuery-UI 小部件/控件可以进行 Twitter UI 之类的更新吗?

javascript - 如何通过 perl 中的 ajax 调用将值从一个 div 传递到另一个?

javascript - 当通过 Javascript 触发时,Bootstrap Modal 不会向 body 添加 modal-open 类