在Johan回答上一个关于 Deferred object的问题之后,我创建了以下代码:
var modalConfirm = (function ($) {
var dfd = $.Deferred();
var cls = function () {
this.title = arguments[0].title;
this.text = arguments[0].text;
var t = new Date().getTime();
var html = '<div class="modal show" id="modal-confirm' + t + '">\n';
html += ' <div class="panel">\n';
html += ' <h2>' + this.title + '</h2>\n';
html += ' <p>' + this.text + '</p>\n';
html += ' <div class="buttons">\n';
html += ' <input type="button" id="confirm-yes' + t + '" value="Yes">\n';
html += ' <input type="button" id="confirm-no' + t + '" value="No">\n';
html += ' </div>\n';
html += ' </div>\n';
html += '</div>\n';
html += '<div id="modal-overlay' + t + '" class="overlay"></div>\n';
$('body').append(html);
$('#confirm-no' + t).click(function () {
mHideConfirm(t);
dfd.reject({ modal: null });
});
$('#confirm-yes' + t).click(function () {
mHideConfirm(t);
dfd.resolve({ modal: null });
});
}
cls.prototype = {
yes: dfd.promise().done,
no: dfd.promise().fail
};
return cls;
})(jQuery);
function mHideConfirm(t) {
$('#modal-confirm' + t).remove()
$('#modal-overlay' + t).remove();
}
$('#lst').dblclick(function() {
new modalConfirm({ title: 'A title', text: 'A text' })
.yes(function() {
console.log('YES');
})
.no(function() {
console.log('NO');
});
});
这正如我第一次所期望的那样,通过显示modal-confirm
div、解析或拒绝(基于单击的按钮)然后隐藏 div ( mHideConfirm
)。(我添加了t
以防万一存在一些 ID 唯一性问题 - 没有)
当dblclick
随后发生时,就会出现问题。该过程会自动Deferred
从前一个实例中触发事件。因此,如果我第一次单击是dblclick
,当第二次发生时,会在没有单击按钮的情况下触发。
似乎该dfd
变量未使用新对象重新初始化,modalConfirm
或者至少不在click
按钮或cls.prototype
.
任何想法或建议将不胜感激。