javascript – 将动态创建的下拉列表的自定义属性值添加到另一个元素

前端之家收集整理的这篇文章主要介绍了javascript – 将动态创建的下拉列表的自定义属性值添加到另一个元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我这里有一些 HTML
<tr taskId="(#=obj.task.id#)" assigId="(#=obj.assig.id#)" class="assigEditRow" >
            <td><select name="resourceId" class="get-resources formElements"></select></td>
            <td><span class="resources-units"></span></td>
            <td><span class="resources-quantity"></span></td>
            <td><input type="text" placeholder="required Q"></td>
            <td align="center"><span class="teamworkIcon delAssig" style="cursor: pointer">d</span></td>
</tr>

还有一点JS在这里:

'use strict';
    function addResourceFunction(){
      let ResourcesJSON = (json) => {
        let Resources = json;
        console.log(Resources);
          let contactsLength = json.length;
          let arrayCounter = -1;

          let resID;
          let resName;
          let resUnit;
          let resQuantity;
          let Option = $('<option />');
          let assignedID = $('tr.assigEditRow:last').attr("assigId");

          while(arrayCounter <= contactsLength) {
            arrayCounter++;

            resID       = Resources[arrayCounter].ID;
            resName     = Resources[arrayCounter].name;
            resUnit     = Resources[arrayCounter].unit;
            resQuantity = Resources[arrayCounter].quantity;

            $('.assigEditRow').last().find('select').append($('<option>',{
              value: resName.toString(),text: resName.toString(),resourceID: resID.toString(),resourceUnit: resUnit.toString(),resourceQuantity: resQuantity.toString()
            }));
          }
      }

      $.getJSON("MY JSON URL IS HERE",function(json) {
        ResourcesJSON(json);
      });
    };

那么实际上发生了什么:我从URL(JSON数组)获取数据,在单击时触发addResourceFunction()以创建新的表行并添加带有从数组传递的选项的新选择.正如您从我的HTML标记中看到的那样,选择输入放在td.get-resources中,并且所有这些都有效.我得到了我的日期设置,我填充了选择字段,所有工作都很好.我可以根据需要添加任意数量的行/选择下拉列表.

此外,每个选项都有一些自定义属性(您可以在上面的JS代码中看到它),我想将这些属性的值添加到行的第二和第三列(在HTML中,这些是span.resources-units和span.resources-quantity).问题是,我不知道如何让它以1:1的方式工作,这意味着一个选择下拉列表“仅改变”自己行的单位和数量.以下是代码

let idCounter = 1;
    $(document).on('change','.get-resources',function() {
      $('.assigEditRow').last().find('.resources-units').attr('id','units-' + idCounter);
      $('.assigEditRow').last().find('.resources-quantity').attr('id','quantity-' + idCounter);

      this.resourceUn = $( ".get-resources option:selected" ).attr( "resourceUnit" );
      this.resourceQuant = $( ".get-resources option:selected" ).attr( "resourceQuantity" );
      $('#units-' + idCounter).append(this.resourceUn);
      $('#quantity-' + idCounter).append(this.resourceQuant);
      idCounter++;
    });

会发生的是,如果我添加一个选择输入,并更改选项,那么事情就可以了.当我添加另一个并更改其选项时,它会获得第一个属性.添加更多 – 同样的事情.无论我改变什么,都需要添加第一个项目的属性值.

解决方法

尝试从元素而不是变量中获取id,因为您始终使用计数器的id更新元素,而不是使用已单击行的id的元素.

嗯,柜台究竟做了什么?我看得越多,我就越不了解.我所知道的是,您没有通过使用idCounter引用正确的行来选择正确的元素.

你想做点什么

$(document).on('change',function() {
    //var row = this;
    this.find(/* Some path to the second column */).att(/* some att to change */);
    this.find(/* Some path to the third column */).att(/* some att to change */);
});

您总是再次使用该行作为根,而不是找到某个ID,因此您只更新该行.

本机:

<table>
    <tr>
        <td>
            <select>
                <option data-text="resName1" data-resourceID="resID1" data-resourceUnit="resUnit1" data-resourceQuantity="resQuantity1">1</option>
                <option data-text="resName2" data-resourceID="resID2" data-resourceUnit="resUnit2" data-resourceQuantity="resQuantity2">2</option>
                <option data-text="resName3" data-resourceID="resID3" data-resourceUnit="resUnit3" data-resourceQuantity="resQuantity3">3</option>
            </select>
        </td>
        <td>
            <div class="column2"></div>
        </td>
        <td>
            <div class="column3"></div>
        </td>
    </tr>
</table>
<script>
document.addEventListener('change',function ( event ) {
    var select = event.target,option = select.options[select.selectedIndex],values = {
            'text' : option.getAttribute('data-text'),'resourceID' : option.getAttribute('data-resourceID'),'resourceUnit' : option.getAttribute('data-resourceUnit'),'resourceQuantity' : option.getAttribute('data-resourceQuantity')
        },row = select.parentNode.parentNode,/* depending on how deep the select is nested into the tr element */
        column2 = row.querySelector('.column2'),column3 = row.querySelector('.column3');
    column2.textContent = 'some string with the values you want';
    column3.textContent = 'some string with the other values you want';
});
</script>

基本上,您从已更改的选择开始,从那里获得单击的选项节点.然后,您将从该选项中获得所需的属性.然后,将几个节点上移到行父级,找到该行内的两列.然后,您可以设置这两列的内容.

原文链接:https://www.f2er.com/js/157532.html

猜你在找的JavaScript相关文章