代码之家  ›  专栏  ›  技术社区  ›  Nathan MacInnes

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

  •  4
  • Nathan MacInnes  · 技术社区  · 14 年前

    只有在事件(由另一个未知函数)调用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 回复  |  直到 14 年前
        1
  •  0
  •   geowa4    14 年前

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

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

    我不知道这是否可行,但也许值得一试。

    对于第二个问题,我将尝试类似于实时事件处理的方法。在父元素(即。 body 或是高层 div ). 如果你能把钩子插进去 preventDefault 如前所述,您可以使用它设置标志。如果事件冒泡到该元素,而未设置标志,则执行扩展行为。虽然这不适用于所有事件,因为并非所有事件都会出现泡沫。解决此问题的另一种方法可能是延迟执行,直到当前堆栈完成使用 setTimeout(0,...) 然后检查国旗。

        2
  •  3
  •   Diego    14 年前

    我不确定我是否理解。你就不能用 event.isDefaultPrevented() 喜欢 this