javascript - 函数调用正在堆积

标签 javascript jquery bootstrap-4 bootstrap-modal

我有一个显示确认消息的引导模式。如果单击“接受”按钮,则使用 id 调用函数,如果单击“取消”或“关闭”按钮,则模式关闭。问题是,当显示模态时,如果我点击取消,然后再次打开模态,这次我点击“接受”,该函数被调用两次,一次是我点击取消的时间,一次是我点击取消的时间我点击“接受”的时间。我怎样才能避免这种情况?

$(document).ready(initItems)


function initItems() {
    $('.delete-item').on('click', initItemDeletion)
}

function initItemDeletion() {
    const itemId = $(this).data('item-id')
    $('h5.modal-title').text('Confirmation')
    $('div.modal-content div.modal-body').text('Are you sure you want to delete this item?')
    $('div.modal-footer button.btn.btn-primary').text('Yes, Delete It!')
    $('#main-modal').modal()
    $('div.modal-footer button.btn.btn-primary').click(() => {
        deleteItem(itemId)
        $('#main-modal').modal('hide')   
    })
    return 

}

function deleteItem(itemId) {
    console.log('deleting item...' + itemId)

}

再次:

  1. 单击链接:显示模式,但我单击取消。 控制台打印:无
  2. 单击链接:显示模式,但我单击接受。 控制台打印: 删除项目... 2 删除项目... 9

其中项目 2 是我第一次点击的项目所在的行,9 是我正在点击的当前行。

最佳答案

你的问题是,每次你打开新的模式,你绑定(bind)到 div.modal-footer button.btn.btn-primary 按钮,所以当你关闭模式时,它仍然存在,当你打开一个新的时,你会在上面再次绑定(bind)。

绑定(bind)到命名空间的点击事件并在之前解除绑定(bind),因此您始终只有一个处理程序:

$('div.modal-footer button.btn.btn-primary').off('click.close').on('click.close', function () {
    deleteItem(itemId)
    $('#main-modal').modal('hide')   
})

工作 fiddle :https://jsfiddle.net/aq9Laaew/219529/

https://api.jquery.com/event.namespace/

关于javascript - 函数调用正在堆积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52359077/

相关文章:

javascript - 关于更改隐藏输入

javascript - 如何在点击时更改 li 标签

bootstrap-4 - Bootstrap Carousel 循环遍历事件存储图片 Rails 6

html - CSS 将一个 div 的边距设置为等于另一个 div 的宽度

javascript - Knockout.JS 可观察数组对单个可观察项的更改

javascript - 无需迭代即可将成对数组转换为 2 个单独的数组

javascript - 如何在 osx 中禁用多重滚动效果并在每次滚动时触发一次滚动事件

javascript - 在不使用 jQuery 的情况下选择具有 "data-xxx"属性的所有元素

javascript - 使用javascript检测网页顶部的滚动

javascript - 如何使用 replaceWith 维护 jQuery 引用