【问题标题】:jQuery change() loops only adding last change() from object?jQuery change() 循环仅从对象添加最后一个 change()?
【发布时间】:2017-12-06 17:42:20
【问题描述】:

我有一个具有如下设置的数组:

["1", "open_order", "form", "county", "San Diego", "title_officer", "Peter", "0"]
["2", "open_order", "form", "county", "San Diego", "branch", "MV", "0"]
["3", "open_order", "form", "county", "San Diego", "title_officer", "Tom", "0"]
["4", "open_order", "form", "county", "San Bernardino", "branch", "RV", "0"]

它会像这样创建一个数组:

$(function() {
  var o = [];
  var i = 0;
  var predata = $('#preferences').text();
  var data = JSON.parse(predata);
    for(i = 0; i < data.length; i++) {
        var dataObject = {};
      dataObject['preferenceId'] = data[i][0];
      dataObject['pageName'] = data[i][1];
      dataObject['preferenceType'] = data[i][2];
      dataObject['baseField'] = data[i][3];
      dataObject['baseValue'] = data[i][4];
      dataObject['targetField'] = data[i][5];
      dataObject['targetValue'] = data[i][6];
      dataObject['conditionalId'] = data[i][7];
        o[i] = dataObject;
    }
    $.each(o, function() {
      console.log();
      var baseField = $('#' + o.baseField);
      var baseValue = o.baseValue;
      var targetField = $('#' + o.targetField);
      var targetValue = o.targetValue;
      
      baseField.change(function() {   
        if (baseField.val() == baseValue) {
          
            targetField.val(targetValue);
        }
      });
    });
});

上面,我尝试为每次 baseField.val() 匹配 baseValue 时创建一个更改事件。从这里开始,这将更新其他选择框/输入字段。

但是,change() 仅适用于列表中的最后一个对象。

我在这里做错了什么?

【问题讨论】:

  • 别想了,尝试在 for 循环中将 var 放在 i = 0 之前:` for(var i = 0; i
  • 我相信问题的一部分是所有的 baseFields 都是country 所以你很可能在页面上的单个国家元素上创建了重复的绑定。我也很困惑为什么当o 是一个数组时你在做Object.keys(o).length 而你可以只做o.length 或将它从一个for each 更改为一个o.forEach()
  • 否定:/ 不过谢谢! @ChrisHappy
  • @Taplar sooo...有什么建议吗?
  • 您需要将index, element 或两个以您喜欢的名称命名的变量传递给每个函数。然后引用传入参数的那个元素。 $.each() api 文档应该显示这方面的示例。

标签: jquery forms object for-loop onchange


【解决方案1】:

这行得通。

$(function() {
  var arr = [];
  var i = 0;
  var predata = $('#preferences').text();
  var data = JSON.parse(predata);
    for(i = 0; i < data.length; i++) {
        var dataArr = {};
      dataArr['preferenceId'] = data[i][0];
      dataArr['pageName'] = data[i][1];
      dataArr['preferenceType'] = data[i][2];
      dataArr['baseField'] = data[i][3];
      dataArr['baseValue'] = data[i][4];
      dataArr['targetField'] = data[i][5];
      dataArr['targetValue'] = data[i][6];
      dataArr['conditionalId'] = data[i][7];
        arr[i] = dataArr;
    }

    $.each(arr, function(key, value) {
      var baseField = $('#' + value.baseField);
      var baseValue = value.baseValue;
      var targetField = $('#' + value.targetField);
      var targetValue = value.targetValue;
      
      baseField.change(function() {   
        if (baseField.val() == baseValue) {
          
            targetField.val(targetValue);
        }
      });
    });
});

【讨论】:

  • 当然,但应尽可能避免使用 IMO this。在您尝试重构此代码之前,它可能看起来像头发分裂。 Taplar 的建议更有说服力。
  • @nrodic 我想我不确定如何实施 Taplar 的解决方案。任何人都可以发布代码的编辑版本吗?
  • $.each(o, function(key, value) { var baseField = $('#' + value.baseField...同样,您的解决方案完全有效。
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多