TagName的getAttribute - JS

时间:2015-06-08 15:57:29

标签: javascript dom getattribute

我的具体情况是我试图从DOM中删除/激活一个链接元素(我无法控制它的生成)。我计划这样做的方法是更换' href'具有无意义值的属性 - 我选择这样做的原因而不是简单地使用disable = true,以便该函数可以在其他场合重复使用以更改其他属性。

我遇到的问题是.getAttribute,它返回错误" TypeError:elemArr.hasAttribute不是函数"。

function removeLink(elem, att, value, replacement) {
    var elemArr = document.getElementsByTagName(elem);
    for (var i = 0; i < elemArr.length; i++) {
        var workingAtt = elemArr.hasAttribute(att);
        if (workingAtt.value === filePath) {
            elemArr[i].setAttribute(att, replacement);
        }
    }
}
removeLink("link", "href", "filePath", "#");

非常感谢任何有关为什么会抛出此错误的帮助。

3 个答案:

答案 0 :(得分:1)

.hasAttribute()返回布尔值truefalse。因此,workingAtt将等于truefalse。布尔值不是HTMLElements,因此它们没有value属性。这就是为什么会有错误。

看起来你正在尝试做select elements where there is a href attribute之类的事情。

如果是这样,你可以过滤它们:

var myElements = [];

[].filter.call(elemArr, function(el) {
    if(el.hasAttribute(att)) {
        myElements.push(el);
    }
});

// then, do something with myElements

答案 1 :(得分:1)

在那里发生的是elemArr是一个数组,而数组没有hasAttribute方法。将代码重写为

function removeLink(elem, att, value, replacement) {
  var elemArr = document.getElementsByTagName(elem);
  for (var i = 0; i < elemArr.length; i++) {
    //this line here wasn't referring to a specific node but the array
    var workingAtt = elemArr[i].hasAttribute(att);
    if (workingAtt && elemArr[i].getAttribute(att) === value) {
      elemArr[i].setAttribute(att, replacement);
    }
  }
}
removeLink("link", "href", "filePath", "#");

它会起作用。

更加简洁的方法是这样的:

function removeLink(elem, att, value, replacement){
  var selector = elem + '['+ att +'="'+ value +'"]';
  [].forEach.call(document.querySelectorAll(selector), function(node){
    node.setAttribute(att, replacement);
  });
}

它基本上做同样的事情,但是相当短,更明确。

答案 2 :(得分:0)

您的代码中有几处错误:

  1. elemArr.hasAttribute代替elemArr[i].hasAttribute
  2. var workingAtt = elemArr.hasAttribute(att); - 此处,workingAtt将是布尔值,workingAtt.value不存在。您应该使用elemArr[i].getAttribute(att),然后使用workingAtt,而不是workingAtt.value(它将不再存在!)。
  3. if (workingAtt.value === filePath)您要与filePath进行比较,而您最应该与传递给该函数的value进行比较。