仅当事件默认为/未被阻止时才运行函数

时间:2010-11-26 14:12:09

标签: javascript javascript-events jquery preventdefault

只有在事件(由另一个未知函数)调用event.preventDefault()时才能运行函数。这是一个jQuery插件,所以我不知道页面的其他部分可能正在做什么。我试过这个:

Event.test = Event.preventDefault;
Event.preventDefault = function () {
    alert('Success');
    this.test();
}

但它不起作用......只是表现正常,没有错误。

相反,我也想要反过来......只有在没有调用event.preventDefault()时才调用函数。实际上,要将函数添加到事件的默认操作中。有任何想法吗?这一切都可能吗?

编辑:根据评论,我找到了第一个问题的解决方案:http://jsfiddle.net/nathan/VAePB/9/。它适用于Chrome(警告function preventDefault() { [native code] },但IE警告undefined。所以IE不会让我定义Event.prototype.test,但它会让我重新定义Event.prototype.preventDefault。很奇怪。我如果我能在IE中使用它,我相信我可以根据这个问题想出第二个问题的解决方案。

2 个答案:

答案 0 :(得分:3)

我不确定我是否理解。你不能只使用像this

这样的event.isDefaultPrevented()

答案 1 :(得分:0)

对于第一个问题,请尝试以下方法:

oldPreventDefault = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() {
    //do stuff
    oldPreventDefault.call(this);
}

我不知道这是否有用,但可能值得一试。

对于第二个问题,我会尝试类似于实时事件处理的东西。将监听器放在父元素上(即body或顶级div)。如果您可以如前所述挂钩preventDefault,则可以使用它来设置标志。如果事件冒泡到该元素并且未设置标志,请执行扩展行为。虽然这不适用于所有事件,但并非所有事件都会冒泡。解决此问题的另一种方法可能是延迟执行,直到当前堆栈使用setTimeout(0,...)完成,然后检查标志。