select2.js 保留之前点击的项目,这会导致在确认弹出窗口中删除多个项目

select2.js maintain previously clicked items which results in remove more than one items on confirmation popup

我有一个文本框,我可以使用 select2.js 在其中添加和删除项目。现在我有一个要求,当我从文本框中删除项目时,它应该要求一些确认消息。

为此,我需要更改 select2.jsunselect() 方法。下面是我修改过的代码。

unselect: function (b) {
    var $curelm = this;
    var d = "", e= "", c = "";
    confirmpopup("Confirm", "Are you sure you want to remove this Tag?", function (confirm) {   //  <-- Here i have added confirmpopup code
        if (confirm) {
            c = $curelm.getVal();
            if (b = b.closest(".select2-search-choice"), 0 === b.length) throw "Invalid argument: " + b + ". Must be .select2-search-choice";
            if (d = b.data("select2-data")) {
                var f = a.Event("select2-removing");
                if (f.val = $curelm.id(d), f.choice = d, $curelm.opts.element.trigger(f), f.isDefaultPrevented()) return !1;
                for (;
                    (e = p($curelm.id(d), c)) >= 0;) c.splice(e, 1), $curelm.setVal(c), $curelm.select && $curelm.postprocessResults();
                return b.remove(), $curelm.opts.element.trigger({
                    type: "select2-removed",
                    val: $curelm.id(d),
                    choice: d
                }), $curelm.triggerChange({
                    removed: d
                }), !0
            }
        }
    });
},

我准备了一个JS Fiddle来告诉你我的问题。

当我在框中单击 "x"(删除符号)时,它会打开一个确认弹出窗口,如果我在该弹出窗口中单击 "Yes" 按钮,它将完全删除项目从框中,当我单击 "No" 按钮时,它不会删除项目。到目前为止一切都很好。现在出现问题,当我第二次单击框中的 "x" 并单击 "Yes" 按钮时,它将从框中删除 2 个项目,而不是仅删除选定的项目。我不知道为什么,但它会保留以前点击的项目历史记录(我猜)。

任何人都可以指出我在上面的代码中做错了什么吗?

要在 JS Fiddle 中生成问题,请按照以下步骤操作:

NOTE: I have added the whole select2.js code in JS Fiddle rather than add it in external link because i have made change in its unselect method.

好的,在对我的代码进行深入挖掘后,我得到了解决方案。 confirmpopup() 函数中的问题。当我点击要从 select2 框中删除的项目时,我已经为 "Yes" 按钮注册了点击事件。然后我再次单击另一个项目以从 select2 框中删除,然后再次 "Yes""No" 按钮事件在 DOM 中注册了确认弹出窗口。所以这就是 "Yes" 按钮点击事件被调用 2 次的原因。

所以为了克服这个问题,我必须首先取消绑定点击事件使用.Off()方法在下面的代码中。

function confirmpopup(title, message, callbackfunc) {
    $('#errorlabel').text(title);
    $('#popupmessage').text(message);
    $('#modelconfirm').show();

    $('#btnyes').off('click'); // <-- Solution is here

    $('#btnyes').on('click', function () {
        $('#modelconfirm').hide();
        callbackfunc();
    });

    $('#btnno, .close').on('click', function () {
        $('#modelconfirm').hide();
    });

}