【问题标题】:Why always the last reference to the object is used in loop?为什么总是在循环中使用对对象的最后一个引用?
【发布时间】:2011-09-29 18:15:09
【问题描述】:

assemblyEl 已正确创建(1.jpg、2.jpg、3.jpg),但 ajax 请求始终发送最后一个 id(3)。

为什么会发生这种情况以及如何解决?

var assemblies = [{id:1},{id:2},{id:3}];

for (var a in assemblies) {
    var assembly = assemblies[a];

    var assemblyEl = $('<img src="' + assembly.id + '.jpg" />')
                        .click(function () {
                                 $.ajax({
                                     type: "POST",
                                     url: url,
                                     data: { id: assembly.id },
                                     async: false,
                                     success: function (data) {
                                     }
                                 });
                         });
}

【问题讨论】:

  • 程序集必须是这种格式吗?
  • 等等,你的意思是你不想发送 id 3?
  • 请停止在数组上使用for...in 循环。它们速度慢且不稳定。
  • @Matt,你建议使用什么?
  • for(var i = 0;i&lt;assemblies.length;i++)...如果坚持使用a,可以改变量名。

标签: javascript jquery


【解决方案1】:

因为单击元素时会触发单击事件。到那时,assembly 的值是循环中的最后一个值。

使用闭包将值复制到新范围。

function clickHandler(assembly) {
    return function () {
         $.ajax({
              type: "POST",
              url: url,
              data: { id: assembly.id },
              async: false,
              success: function (data) {
              }
          });
    };
}

.click(clickHandler(assembly));

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多