【问题标题】:Javascript - Referencing certain HTML elements inside of a loopJavascript - 在循环内引用某些 HTML 元素
【发布时间】:2015-10-19 08:12:59
【问题描述】:

我正在制作一个简单的 Javascript 菜单,它可以在主要包含 HTML 表单和文本的选项卡之间切换。 为此,我使用以下代码将单击属性分配给更改类样式设置的列表元素:
http://jsfiddle.net/NHKZL/
这种情况下的问题是代码通过遍历类列表来查找要打开/关闭的元素(容器> .class)来跟踪菜单内容。这在每个选项卡中使用纯文本时效果很好,但在使用不同内容(如 php 回显和循环)时效果较差。我认为这是由于 JS 考虑了其中一些标签类。
这是代码行:

var target = document.querySelector('.container>.' + e.target.classList[0]);

我正在寻找替代品的特别部分是:

类列表[0]

发布代码的人指出了这个弱点并建议使用 data-* 来跟踪我希望影响的元素,但我似乎无法弄清楚这会如何影响此特定行中的其余语法.我的解决方案的另一半目前包括向容器类内部的类添加 data-* 属性。
欢迎任何其他有关如何执行此操作的建议。

【问题讨论】:

  • data-* 是类的属性。因此,您应该使用例如data-count="5" 为属性计数传递一个值 5。然后在 js 端你可以使用 var count = $(selector).data('count');或 var count = $(selector).attr('data-count');您确实在课堂上添加了 data-* 吗?什么意思?
  • @LelioFaieta 由于该问题没有jquery 标记,因此您确实应该提到以纯JavaScript 方式获取数据属性。我更喜欢<element>.getAttribute("data-count"); 或新的dataset API。 developer.mozilla.org/en-US/docs/Web/Guide/HTML/…
  • 这个问题的本质就是让JS循环找到每个里面有数据标签的元素。实际值无关紧要,只要我有一种方法可以“标记”受此循环影响的元素。最初它会遍历每个类,然后开始将点击事件添加到我想要影响的类中的内容中。 (Fiddle 中容器下的 div 类切换。)
  • @JeremyJStarcher 你是对的。我更专注于理解他在“将 data-* 属性添加到容器类内部的类”时所指的内容。
  • @JeremyJStarcher 我已经尝试过:“var target = document.querySelector('.container>.' + e.target.getAttribute("data-count"));”但它没有用。很可能是因为这并不像“container>.class”那样引用实际的元素名称。它最终只是一个容器,后跟一个随机数据字符串。

标签: javascript css loops menu


【解决方案1】:

我更新你的小提琴如何使用 data-* 属性:http://jsfiddle.net/NHKZL/441/

HTML,添加数据索引属性:

<ul class="menu">
    <li class="toggle1" data-index="1">One</li>
    <li class="toggle2" data-index="2">Two</li>
    <li class="toggle3" data-index="3">Three</li>
    <li class="toggle4" data-index="4">Four</li>
    <li class="toggle5" data-index="5">Five</li>
</ul>
<div class="container">
    <div class="toggle1" data-index="1">Here are the contents of 1.</div>
    <div class="toggle2" data-index="2">Here are the contents of 2..</div>
    <div class="toggle3" data-index="3">Here are the contents of 3...</div>
    <div class="toggle4" data-index="4">Here are the contents of 4....</div>
    <div class="toggle5" data-index="5">Here are the contents of 5.....</div>
</div>

JS,请注意在选择器中我选择了具有相同数据索引号的容器的子元素:

var menu_elements = document.querySelectorAll('.menu>li'),
    menu_length = menu_elements.length;
for (var i = 0; i < menu_length; i++) {
    menu_elements[i].addEventListener('click', function (e) {
        var target = document.querySelector('.container> [data-index="' + e.target.getAttribute("data-index")+'"]'); // clicked element
        Array.prototype.filter.call(target.parentNode.children, function (siblings) {
            siblings.style.display = 'none'; // hide sibling elements
        });
        target.style.display = 'block'; // show clicked element
    });
}

【讨论】:

  • 工作就像一个魅力,非常感谢。这是我似乎找不到的语法。另外,附带说明一下,{debugger tag for? 是什么?
  • 我删除了debugger;,如果你想检查一些东西,它基本上是代码中的一个断点。我总是在检查小提琴时添加它,然后在最后删除它
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2021-12-11
  • 2017-08-31
相关资源
最近更新 更多