2017-06-27 24 views
0

我试图将data-webpart属性添加到文档中的所有锚点,但使用其包含div的数据属性填充它们的值。向锚点添加不同的数据属性

但是,我写的代码似乎只用一个数据属性填充所有的锚(或者说,首先添加第一个,然后添加第二个)。

任何帮助将不胜感激!

HTML

<body> 
    <div data-webpart="form"> 
     <a href="#">Test Link</a> 
     <a href="#">Test Link</a> 
     <a href="#">Test Link</a> 
    </div> 
    <div data-webpart="icon-grid"> 
     <a href="#">Test Link</a> 
     <a href="#">Test Link</a> 
     <a href="#">Test Link</a> 
    </div> 
</body> 

的JavaScript

// data attributer 
var webParts = document.querySelectorAll("[data-webpart]"); 
var webPartAnchors = document.querySelectorAll("[data-webpart] > a"); 

function addDataAttr() { 
    var closestWebPartAttr; 
    for (i = 0; i < webPartAnchors.length; i++) { 
     for (e = 0; e < webParts.length; e++) { 
      closestWebPartAttr = webParts[e].getAttribute("data-webpart"); 
      webPartAnchors[i].setAttribute("data-web-part", closestWebPartAttr); 
     } 
    } 
} 

window.onload = function() { 
    if (webParts !== null) { addDataAttr(); } 
}; 

回答

0

你的嵌套的循环是从复制数据属性每一个 DIV到锚,因为没有什么是涉及每个锚,只是他们的父母。最后他们都有最后一个数据属性。

由于锚点是DIV的直接子对象,因此不需要使用querySelectorAll()来获取它们,您可以在循环内使用.children()

function addDataAttr() { 
    for (var i = 0; i < webParts.length; i++) { 
     var webpart = webParts[i].dataset.webpart; 
     var children = webParts[i].children; 
     for (var j = 0; j < children.length; j++) { 
      children[j].dataset.webpart = webpart; 
     } 
    } 
}