2010-07-23 43 views
0

我找不到解決方案,我需要覆蓋以前設置的提交事件處理程序。在我的例子中,我有一個iframe頁面,他們自己提交(可以有驗證錯誤,並返回false)。所以,我需要做的:覆蓋表單提交事件與jQuery(1.3.2)

$('<iframe></iframe>') 
    .load(function() { 
     content = $(this).contents() 
     form = content.find('form') 
     previous_form_submit = .... //This is my question 
     form.unbind("submit") 
     form.submit(function() { 
      var valid = previous_form_submit() 
      if (valid) { 
      $.post(form.attr('action'), form.serialize(), function(data) { 
       //do something 
      }) 
     }) 
    }) 

編輯:爲了更清晰的,問題是重寫事件,但沒有失去之前的處理與驗證。

EDIT2:我使用jQuery 1.3.2

我要去另一種解決方案,但我感到好奇,怎麼能做到這一點。

謝謝。

+0

這些變量(「content」,「form」,「previous_form_submit」)都應該用'var'關鍵字聲明!就像現在一樣,它們對頁面來說是全球性的! – Pointy 2010-07-23 12:56:35

+0

另外:你已經打電話給「解綁」了,所以你的問題真的是關於如何*保存*任何以前的提交處理程序? – Pointy 2010-07-23 12:57:30

+0

是的,只是我的原始代碼的摘錄。是的,我的意思是:我需要重寫當前的提交事件處理程序,但我需要保存以前的處理程序,以進行驗證(在我的示例中是前一個處理程序)。 – Hugo 2010-07-23 13:02:11

回答

1

事件處理程序都存儲在元素的expando數據存儲,訪問由.data(),在這種情況下,.data('events')事件處理程序,那麼您綁定做.submit提交處理程序,.click點擊次數等


jQuery的1.4+版本:

如果表單有一個提交處理它應該是這樣的:

var oldHandler = form​​​​​​​​.data("events").submit[0].handler; 

否則,你需要通過他們循環,使用$.each()例如:

$.each(form.data("events").submit, function(i, h) {  
    var handler = h.handler; 
    //do something with handler 
}); 

的jQuery的1.3.x版:

例如使用$.each()

$.each(form.data("events").submit, function(i, h) {  
    var handler = h; 
    //do something with handler 
}); 

儘管這裏最好循環,因爲在dexes沒有清理。處理程序可能不是第一項,因此.submit[0]可能是undefined,即使處理程序。

+0

感謝尼克,我使用的是jquery 1.3.2。 – Hugo 2010-07-23 13:06:25

+0

@Hugo - 已更新顯示1.3.2中稍微不同的對象佈局:) – 2010-07-23 13:13:21

+0

@Nick - 再次感謝,但form.data(「events」)沒有任何返回。 編輯:form.data(「events」)未定義 – Hugo 2010-07-23 13:20:53