【问题标题】:Update HTML attributes depending on the total <li> jQuery根据总 <li> jQuery 更新 HTML 属性
【发布时间】:2018-06-22 07:39:42
【问题描述】:

我有一个滑块,列表中的项目会因页面而异。

所以,我要做的是运行一个循环,该循环将为每张幻灯片更新 data-slide-to 属性并使用正确的编号。

经过大量的试验和错误,我写了一些几乎有效的东西......

我使用$.each() 获取所有&lt;li&gt; 的索引数组,并使用nth:child 选择器并使用索引选择&lt;li&gt; 然后使用.attr() 更改HTML 属性索引号。

完整代码:

var sliderList = $("ul#list li");

function updateDataNum(){
  $.each(sliderList, function( index, value ) {
    $( "ul#list li:nth-child" + '(' + index + ')').attr("data-slide-to",index);
  });
}

updateDataNum();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

代码如何开始

<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

我想要发生的事情

<ul id="list">
  <li data-target="#video-slider" data-slide-to="0">One</li>  
  <li data-target="#video-slider" data-slide-to="1">Two</li>  
  <li data-target="#video-slider" data-slide-to="2">Three</li> 
  <li data-target="#video-slider" data-slide-to="3">Four</li>
</ul>

发生了什么实际

<ul id="list">
  <li data-target="#video-slider" data-slide-to="1">One</li>  
  <li data-target="#video-slider" data-slide-to="2">Two</li>  
  <li data-target="#video-slider" data-slide-to="3">Three</li> 
  <li data-target="#video-slider" data-slide-to>Four</li>
</ul>

【问题讨论】:

  • 你的代码太复杂了。我的回答中给出了一个非常简单的解决方案。你可以检查一下

标签: javascript jquery html each


【解决方案1】:

nth-child 从 1 开始,而 index 从 0 开始。

改为:

$( "ul#list li:nth-child" + '(' + (index + 1) ...

var sliderList = $("ul#list li");

function updateDataNum(){
  $.each(sliderList, function( index, value ) {
    $( "ul#list li:nth-child" + '(' + (index + 1) + ')').attr("data-slide-to",index);
  });
}

updateDataNum();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

或者,您可以像这样一次完成所有作业:

$("#list li").attr("data-slide-to", function(index) {
  return index;
});

var sliderList = $("#list li");

function updateDataNum() {
  $("#list li").attr("data-slide-to", function(index) {
    return index;
  });
}

updateDataNum();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

在 ES6 中,这可以简化为:

$("#list li").attr("data-slide-to", index => index);

var sliderList = $("#list li");

function updateDataNum() {
  $("#list li").attr("data-slide-to", index => index);
}

updateDataNum();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

【讨论】:

  • 您可以通过根本不进行 nth-child 查找来进一步简化此操作。为什么不直接使用value.attr('data-slide-to', index)
  • 或使用$('#list li').each(function(idx)) { $(this).data('slide-to', idx); }
  • @SteveT 我会添加它作为答案,因为它是一个更好的解决方案
【解决方案2】:

请使用$(this) 简化您的代码,如下所示:-

$( this).attr("data-slide-to",(index+1)); // since index started from 0 so +1 needed

工作 sn-p:-

$(document).ready(function(){
  $.each($("ul#list li"), function(index) {
    $( this).attr("data-slide-to",(index+1));
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list">
  <li data-target="#video-slider" data-slide-to="">One</li>  
  <li data-target="#video-slider" data-slide-to="">Two</li>  
  <li data-target="#video-slider" data-slide-to="">Three</li> 
  <li data-target="#video-slider" data-slide-to="">Four</li>
</ul>

【讨论】:

    【解决方案3】:

    不要使用 attr('data-slide-to') 访问属性,而是使用 jquery 内置数据函数:

    $('#list li').each(function(idx) { 
      $(this).data('slide-to', idx); 
    });
    

    每个函数都带有一个从零开始的索引作为参数。

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多