2010-07-23 44 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