【问题标题】:JQuery deferred with .each()使用 .each() 延迟的 JQuery
【发布时间】:2011-05-28 16:20:00
【问题描述】:

您知道如何将 JQuery 的延迟方法与一个检测所有更改的表单并将每个表单作为 Ajax 帖子提交的功能一起使用吗?

如果我只是列出大量提交的表单,我可以得到同样的效果,但如果我使用...

$('form.changed').each(function(){
  return $(this).submitWithAjax();
});

我正在尝试使用的代码的更完整版本在这里... at JS Fiddle

提前致谢!

【问题讨论】:

  • 你能澄清你的问题吗?我不确定我是否理解(但我很确定我的答案是错误的......)

标签: jquery jquery-deferred


【解决方案1】:

用“.map()”代替“.each()”:

var deferreds = $('form.changed').map(function(i, elem) {
  return $(this).submitWithAjax();
});

$.when.apply(null, deferreds.get()).then(function() { ... });

“$.when()”可以让你捆绑一堆延迟对象并等待它们全部成功(或任何失败——注意那里的区别)。它通常允许任意数量的参数,但由于我们有一个数组,所以我使用了“apply()”。

请注意,我只是轻轻地使用了这些东西,因此请阅读 jQuery API 文档以仔细检查 :-) edit — 同样在重新阅读您的问题后,我可能误解了您。

【讨论】:

  • 这非常有效。谢谢你的帮助。只是想了解它为什么现在有效。
  • “延迟”功能是其中一项非常简单的功能,但我同意很难完全“了解”该机制的工作原理 :-)
【解决方案2】:

将更改事件委托给表单字段可以解决您的问题。

$('form').delegate('input[type=text], input[type=radio], select', 'change', 
function(evt){
    // your submits here
    console.log('changed!')
});

【讨论】:

  • 感谢您的回复,但检测到表单上的更改不是问题。 '$("form :input").live('change', function(){ // 如果表单输入发生变化 $(this).closest('form').addClass("changed"); });'
猜你喜欢
  • 2011-09-15
  • 2013-01-25
  • 2016-05-19
  • 2014-01-08
  • 2011-11-06
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2011-05-07
相关资源
最近更新 更多