我的具体情况是我试图从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", "#");
非常感谢任何有关为什么会抛出此错误的帮助。
答案 0 :(得分:1)
.hasAttribute()
返回布尔值true
或false
。因此,workingAtt
将等于true
或false
。布尔值不是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)
您的代码中有几处错误:
elemArr.hasAttribute
代替elemArr[i].hasAttribute
。var workingAtt = elemArr.hasAttribute(att);
- 此处,workingAtt
将是布尔值,workingAtt.value
不存在。您应该使用elemArr[i].getAttribute(att)
,然后使用workingAtt
,而不是workingAtt.value
(它将不再存在!)。if (workingAtt.value === filePath)
您要与filePath
进行比较,而您最应该与传递给该函数的value
进行比较。