Jquery 从元素中删除属性(在循环中)仅在第一次有效

Jquery Remove Attributes from element (in loop) only work the first time

我有一个函数可以创建和删除 18 个图像元素(#scelta1、#scelta2 等)的所有数据属性,每次用户单击这些图像之一时,它都会 运行:

$(document).ready(function () {
    $('#scelta6']").on("click", function() { 
    // For simplicity #scelta6,
    // the real function gets the id based on the element you click
    $('#scelta6'+).attr({'data-a': foo,
                        'data-b': bar,
                        [a lot of data-] });
    // All the variables is taken from the dropdowns choices of the user in a 
    // separate function
[do something]
    var conta = 1;
    var fiamma;
    while (conta < 19) {
        fiamma = $('#scelta'+conta);
        $.each($(fiamma).data(), function(i){ $(fiamma).removeAttr("data-" + i); });
        console.log(conta); // Just to know if the function is running 
        conta++;
    }
}

现在的问题是:在一个全新加载的页面上,如果我单击这些元素中的一个,上面的函数将 运行 没有任何问题,并从所有元素中删除所有数据属性。当我再次单击这些元素之一时,所有所有数据属性都保留在它们的位置上! 为什么这个功能只在第一次使用? 我错过了什么?

编辑 如果第一次使用函数 运行 并且在数据集的所有元素中都有数据,则每个元素中的数据都将被删除。 例如: 我将数据设置为#scelta1、#scelta2、#scelta3、运行 函数,它将从所有数据中删除数据。然后我在#scelta2 中重新设置它,单击并删除所有数据。然后我再次在#scelta1、#scelta2、#scelta3 中设置数据,单击所有数据将从它们中全部删除。但是,如果我将数据设置为#scelta2 和#scelta4,它将仅删除#scelta2 中的数据...

编辑:似乎是使用 attr 设置 data 属性导致了这个错误(我验证了并且行为就像你描述的那样)。使用 data() 设置属性似乎可以正常工作。

$(document).ready(function () {
    
    //setting data with attr seems to be the cause of the bug here, use data() instead
    $('.sceltaButt').on("click", function() { 
      //$('#' + $(this).attr('id')).attr({'data-a': 'foo', 'data-b': 'bar'});
      $('#' + $(this).attr('id')).data('a', 'foo').data('b', 'bar');
      showData();
    });
    
    //then you don't need to remove them manually anymore, removeData is enough
    $('#removeData').on("click", function() {
      var conta = 1;
      var fiamma;
      while (conta < 7) {
          fiamma = $('#scelta'+conta);
          $(fiamma).removeData();
          //console.log(conta); 
          conta++;
      }
      showData();
    });
    
    //now this version doesn't work anymore because we use data()
    $('#removeWithoutData').on("click", function() {
      var conta = 1;
      var fiamma;
      while (conta < 7) {
          fiamma = $('#scelta'+conta);
          $.each($(fiamma).data(), function(i){ 
            $(fiamma).removeAttr("data-" + i);
          });
          //console.log(conta); 
          conta++;
      }
      showData();
    });
    
    function showData(){
      var result = '<br>';
      $('.sceltaButt').each(function(){
        /*$.each($(this)[0].attributes, function(){
            result += ' ' + this.name + ':' + this.value;
        });*/
        $.each($(this).data(), function(name){
            result += ' ' + name + ':' + this;
        });
        result += '<br>';
      });
      $('#result').html(result);
    }
    
    showData();
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="sceltaButt" id="scelta1">ADD TO 1</button>
<button class="sceltaButt" id="scelta2" data-c="test">ADD TO 2</button>
<button class="sceltaButt" id="scelta3">ADD TO 3</button>
<button class="sceltaButt" id="scelta4" data-d="test2">ADD TO 4</button>
<button class="sceltaButt" id="scelta5">ADD TO 5</button>
<button class="sceltaButt" id="scelta6">ADD TO 6</button>
<button id="removeData">CLICK ME TO REMOVE (with removeData)</button>
<button id="removeWithoutData">CLICK ME TO REMOVE (without removeData)</button>
<div>CURRENT DATA: <span id="result"></span></div>