【问题标题】:getAttribute by TagName - JS通过 TagName 获取属性 - JS
【发布时间】:2015-06-08 15:57:28
【问题描述】:

我的具体情况是我试图从 DOM 中删除/使链接元素无效(我无法控制它的生成)。我打算这样做的方法是用一个无意义的值替换“href”属性——我选择这样做而不是简单地使用disable = true的原因是为了在其他场合可以重用该函数更改其他属性。

我遇到的问题是.getAttribute,它返回错误“TypeError: elemArr.hasAttribute is not a function”。

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", "#");

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

【问题讨论】:

标签: javascript dom getattribute


【解决方案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);
  });
}

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

【讨论】:

  • hasAttribute 返回一个布尔值。你不能打电话给&lt;boolean&gt;.value
  • 不知何故我也错过了!尽快更新
【解决方案2】:

.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

【讨论】:

    【解决方案3】:

    您的代码中有几个错误:

    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 进行比较。

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2015-08-28
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多