2013-06-12 175 views
1

在Javascript中,如何附加事件處理程序以便在默認操作後運行?在默認行爲後執行的Javascript事件處理程序

<form target="_blank" action="submit.php" onsubmit="doThisAfterSubmit()"> 
    <input type="submit" onclick="doThisAfterSubmit()" /> 
</form> 

類似,但還不夠SO問題:

javascript: Possible to add event handler that runs after the default behavior?

How to catch event after default action was performed in JavaScript

我看了這些,但他們處理與利用的變化,如keyupkeypress解決了按鍵事件。我見過的唯一的其他解決方案是setTimeout()方法。我想避免使用setTimeout(),以支持更優雅的解決方案(如果存在的話)。

我的用例是,我想在提交後從DOM中刪除表單。

+0

你所說的 「後的默認行爲」 的意思?何時發送POST請求?何時收到答覆? – lonesomeday

+2

一旦提交完成,另一頁被加載,你的javascript丟失,所以答案很簡單,你不能! – adeneo

+2

@adeneo提示:查看錶單的「target」屬性。 – lonesomeday

回答

4

您可以自己執行默認操作,然後執行所需操作,然後阻止默認操作運行。

<form target="_blank" action="submit.php" 
     onsubmit="this.submit(); doThisAfterSubmit(this); return false;"> 
    <input type="submit" /> 
</form> 

注:在調用「的onsubmit」 this.submit()不會造成像你想象的無限循環。

jsfiddle demo

編輯:我原來的jsfiddle只顯示文本的形式提交後。我再次嘗試了一次,但將其更改爲刪除表單。這導致表單不再提交,儘管this.submit()被首先調用。在這種情況下,你可以使用setTimeout()延遲去除的形式,直到原來的線程執行完畢,就像這樣:

function doThisAfterSubmit(form) { 
    setTimeout(function() { 
     $(form).remove(); 
    }, 0); 
}; 

現在它被刪除之前提交表單。

jsfiddle demo

+0

你的回答的第一部分讓我興奮不已,然後不得不使用'setTimeout()'把我弄糟了。然後,我嘗試了你的第二個小提琴,並刪除了'setTimeout()',然後運行'$(form).remove()',它完美地工作! –

+0

@ ogc-nick - 我想知道它是否會在不同的瀏覽器上以不同的方式工作,顯然它確實如此。它在Chrome 27和IE 10上沒有'setTimeout()',但沒有在Firefox 27上運行。 –

+0

啊很有趣。是的,我正在用鉻進行測試。不幸的是,我的目標瀏覽器是Firefox,我只是沒有想到FF和Chrome在這方面有所不同。但我仍然喜歡這種方法。 –

0

您可以使用事件冒泡來代替:

<div onclick="this.remove();"> 
    <form target="_blank" action="submit.php" onsubmit="alert('submitted);"> 
    <input type="submit" /> 
    </form> 
</div> 
相關問題