显然,jQuery 中的 Event 对象有这个有用preventDefault()
的方法可以防止默认行为。
这通常用于防止点击事件执行浏览器默认行为。
似乎它对自定义事件也很有用。
我想通过这种行为实现的任务是一个单独的问题,但我将把它作为我正在寻找的行为的一个例子来解释:
我有一个简单的插件,可以从 div 中创建一个弹出窗口。我在互联网上找到它。
$(selector).pop();
当您单击弹出窗口的子项以外的任何内容时,我已经将其关闭,并防止单击元素上的默认单击行为。
function closeInactivePop() {
var foundAny = false;
jQ.each(function (i) {
var $this = $(this);
if ($this.hasClass('active') && ! $this.data('activePop')) {
$this.removeClass('active');
foundAny = true;
}
});
return foundAny;
}
$('body').click(function(){
// If we closed any, cancel the propagation. Otherwise let it be.
if (closeInactivePop()) {
$(document).trigger('jQuery.pop.menuClosed');
return false;
}
});
(现在我粘贴了它,我意识到我可以做得更好一点,但尽管如此)。
现在我添加了一个新插件,它在弹出窗口中绘制一个颜色选择器。除了这个颜色选择器创建的 DOM 不在弹出窗口内;它只是在视觉上在里面。DOM 结构是独立的。
在上述黑客攻击中,我实际上更愿意触发另一个事件,其默认行为是关闭弹出窗口。
function closeInactivePop() {
var foundAny = false;
jQ.each(function (i) {
var $this = $(this);
if ($this.hasClass('active') && ! $this.data('activePop')) {
$(document).trigger('jQuery.pop.menuClosed');
$this.removeClass('active');
foundAny = true;
}
});
return foundAny;
}
$('*').click(function(e) {
var $this = $(this);
// This bit is pseudocode, where the Function is the default behaviour
// for this event.
// It is helpful that $this is actually the clicked element and not the body.
$this.trigger('jQuery.pop.menuBeforeClose', function() {
// if we run default behaviour, try to close the popup, or re-trigger the click.
if (!closeInactivePop()) {
$this.trigger(e);
}
});
});
然后我可以稍后做
$('#colour-picker').bind('jQuery.pop.menuBeforeClose', function(e) {
e.preventDefault();
});
当原始点击事件的目标是颜色选择器或其中的某些东西时,这将阻止 closeInactivePopup 默认行为运行。
我可以以某种方式做到这一点,甚至是骇人听闻的吗?