在调用event.preventDefault()之后是否有[通用]方法来调用默认操作?

Jak*_*ake 40 javascript jquery

此问题是为了开发jQuery插件和其他自包含的JavaScript代码段,不需要修改其他脚本文件以实现兼容性.

我们都知道event.preventDefault()会阻止默认事件,因此我们可以运行自定义函数.但是如果我们想在调用之前简单地延迟默认事件呢?我已经看到了各种特定于案例的忍者技巧和解决方法来重新调用默认操作,但就像我说的那样,我的兴趣在于通用方式重新触发默认操作,而不是处理案例的默认触发器 - 以个案为基础.

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    e.invokeDefault(); // Imaginary... :(
});
Run Code Online (Sandbox Code Playgroud)

即使对于表单提交这样简单的事情,似乎也没有普遍的答案.该$(selector).closest("form").submit()解决方法假定默认的动作是一个标准的表单提交,而不是古怪像__doPostBack()在ASP.NET功能.在调用ASP.NET回调的最后,这是我最接近通用的,设置它和忘记它的解决方案:

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    var javascriptCommand = e.currentTarget.attributes.href.nodeValue;
    evalLinkJs(javascriptCommand);
});


function evalLinkJs(link) {
    // Eat it, Crockford. :)
    eval(link.replace(/^javascript:/g, ""));
}
Run Code Online (Sandbox Code Playgroud)

我想我可以开始编写特殊情况来处理带有window.location重定向的普通链接,但随后我们打开了一整套新的蠕虫 - 在越来越多的情况下堆积默认事件调用会产生比解决方案更多的问题.

那怎么样?谁拥有我一直在寻找的神奇子弹?

Mik*_*rds 10

看看这个:

你可以试试

if(!event.mySecretVariableName) {
   event.preventDefault();
} else {
   return; // do nothing, let the event go
}

// your handling code goes here
event.originalEvent.mySecretVariableName = "i handled it";

if (document.createEvent) {
   this.dispatchEvent(event.originalEvent);
} else {
    this.fireEvent(event.originalEvent.eventType, event.originalEvent);
}
Run Code Online (Sandbox Code Playgroud)

使用此答案:如何在JavaScript中触发事件?和jQuery事件参考:http://api.jquery.com/category/events/event-object/

标记您收到的事件对象,如果再次收到它,则不要循环.


Ben*_*Ben 8

不要preventDefault()先打电话.然后默认操作将在事件处理程序之后发生.

  • 只要您在自定义处理后不需要异步执行默认处理,这就是正确的答案. (12认同)