调用event.preventDefault()之后是否有方式来调用默认操作?

这个问题是为了开发jQuery插件和其他自包含的JavaScript代码片段,不需要修改其他脚本文件的兼容性。

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

$(submitButton).click(function (e) { e.preventDefault(); // Do custom code here. e.invokeDefault(); // Imaginary... :( }); 

即使是表格提交这样简单的事情,似乎也没有普遍的答案。 $(selector).closest("form").submit()解决方法假定默认操作是一个标准的表单提交,而不是像ASP.NET中的__doPostBack()函数那样古怪。 在调用ASP.NETcallback函数的最后,这是我最接近的一个通用的,一劳永逸的解决scheme:

 $(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, "")); } 

我想我可以开始编写特殊情况来处理与window.locationredirect的正常链接,但是随后我们打开了一个全新的蠕虫jar – 在越来越多的情况下为默认事件调用堆积创build比解决scheme更多的问题。

那么怎么样? 谁有我一直在寻找的魔力?

看看这个:

你可以试试

 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); } 

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

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

不要首先调用preventDefault() 。 那么默认的动作会发生在你的事件处理程序之后。

这应该工作。 我只testing过Firefox。

 <html> <head> <script> window.addEventListener("click",handleClick,false); function handleClick(e){ if (e.useDefault != true){ alert("we're preventing"); e.preventDefault(); alert(e.screenX); //Firing the regular action var evt = document.createEvent("HTMLEvents"); evt.initEvent(e.type,e.bubbles,e.cancelable); evt["useDefault"] = true; //Add other "e" attributes like screenX, pageX, etc... this.dispatchEvent(evt); } else{ alert("we're not preventing"); } } </script> </head> <body> </body> </html> 

当然,您也必须复制所有旧的事件variables属性。 我只是没有编码的部分,但它应该很容易。

JamWaffles已经certificate是不可能的。 简单的解释为什么这是不可能的:如果你重新触发默认操作,你的事件监听器再次拦截,你有一个无限循环。

和这个

 click(function (e) { e.preventDefault(); // Do custom code here. e.invokeDefault(); // Imaginary... :( }); 

是这样的(用你的虚构函数)。

 click(function (e) { // Do custom code here. }); 

看来你想操纵你点击的元素的url。 如果你这样做,它只是正常工作。 例子 。

我需要点击后禁用一个button,然后触发默认事件,这是我的解决scheme

 $(document).on('click', '.disabled-after-submit', function(event) { event.preventDefault(); $(event.currentTarget).addClass('disabled'); $(event.currentTarget).removeClass('disabled-after-submit'); $(event.currentTarget).click(); $(event.currentTarget).prop('disabled', true); });