2010-08-11 90 views
4

如果我錯了,糾正我,但在我看來,jQuery事件處理與javascript事件處理完全分離。我知道執行jQuery和JavaScript事件處理程序本身的順序是未定義的,但是可以假設所有JavaScript處理程序都將在jQuery之前執行?關於(內聯)javascript事件處理程序執行jquery事件處理程序的順序

example給出的答案這question似乎是這種情況。

此外,是否有任何優先執行內聯JavaScript事件處理程序方面的綁定?

爲了澄清,我問了這一切,因爲我遇到了一個問題,我有onClick事件調用一個封閉形式的submit()方法的<a>元素的內聯事件處理程序。在提交表單之前,我想動態地將一些隱藏的inputs添加到表單中。現在我這樣做:

 var preSubmit = function preSubmit() 
     { 
      // add inputs 
     } 

     var oldSubmit = form.submit; 
     form.submit = function newSubmit() 
     { 
      preSubmit(); 
      oldSubmit.call(form, arguments); 
     } 


但我真的不知道是否有一個更優雅的方式,我真的很需要這方面的一些澄清。從你的問題的細節

+0

_「我知道,執行的jQuery的順序和JavaScript事件處理程序本身是不確定的」 _ - 不,用jQuery綁定的所有事件處理程序將在它們綁定的順序執行(綁定時到一個特定的元素 - 與委託處理程序,你必須允許冒泡),因爲jQuery爲你管理這個。但jQuery仍然是JavaScript,它仍然使用'addEventListener()'(當瀏覽器擁有它時),所以非jQuery處理程序和jQuery處理程序的順序將是不確定的。 – nnnnnn 2013-06-18 12:39:04

回答

4

我不確定規格,但我認爲事件處理程序只是按照您定義的順序排隊。內聯處理程序是在DOM節點中定義的,因此沒有其他任何事情可以更早進行。

最優雅的方法是以不顯眼的方式編寫全部您的JavaScript,即與HTML保持分離(您似乎混合了編程風格)。不管結果如何,你可以通過onsubmit處理器連接到形式截取表單提交:

$("form").submit(function(){ 
    // Do stuff 
    return true; 
}); 

更新

我已經做了一些測試,它似乎是通過jQuery附加到表單的onsubmit處理沒有得到當您在其他地方調用DOM的submit()方法時觸發。這裏有一個解決方法:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head><title></title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript"><!-- 
jQuery(function($){ 
    $("a").each(function(i, a){ 
     a.onclick = function(){ // Remove previous handlers 
      alert("I will no longer submit the form"); 
      $(this).closest("form").submit(); 
     }; 
    }); 
    $("form").submit(function(){ 
     alert("I'll take care myself, thank you"); 
     $("input[name=foo]").val("Another value"); 
     return true; 
    }); 
}); 
//--></script> 
</head> 
<body> 


<form action="" method="get"> 
    <input type="text" name="foo" value="Default value"> 
    <a href="javascript:;" onclick="document.forms[0].submit()">Submit form</a> 
</form> 

</body> 
</html> 
+0

如果這取決於我,我肯定會把它寫在一個單獨的文件中。不幸的是,我使用已經包含事件處理的動態生成頁面,現在刪除它只是要求問題。我已經嘗試用'onSubmit()攔截提交,但是如果用'submit()'提交表單,只要按下提交按鈕,它就不會被調用。但感謝您的答案。 – alh84001 2010-08-11 08:21:03

+0

我想我現在明白你的觀點。查看我的更新。 – 2010-08-11 09:18:47

0

旁白,你可以只添加一個onsubmit事件,表單提交反正之前將其稱之爲...

1

有兩個解決方案:總結的形式或的提交功能鏈接的onClick處理程序。我不知道jQuery提供了「包裝現有功能」API。

至於運行順序,jQuery是JavaScript,因此處理程序在瀏覽器運行時運行。這不是特定於jQuery的東西,除非API聲明某些東西是異步運行的。