0

我的具体情况是我试图从 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", "#");

非常感谢您对为什么抛出此错误的任何帮助。

4

3 回答 3

1

.hasAttribute()返回一个布尔值truefalse。因此,workingAtt将等于truefalse。布尔值不是 HTMLElement,因此它们没有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
于 2015-06-08T16:00:48.347 回答
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);
  });
}

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

于 2015-06-08T16:02:52.557 回答
0

您的代码中有几个错误:

  1. elemArr.hasAttribute而不是elemArr[i].hasAttribute.
  2. var workingAtt = elemArr.hasAttribute(att);— 这里,workingAtt将是一个布尔值,workingAtt.value不存在。您应该使用elemArr[i].getAttribute(att)并稍后使用workingAtt, NOT workingAtt.value(它将再次不存在!)。
  3. if (workingAtt.value === filePath)您正在比较,filePath而您绝对应该与value您在函数中传递的内容进行比较。
于 2015-06-08T16:07:47.060 回答