Javascript 比较;标记名";将财产转让给「;img";不适用于<;img>;要素
我有以下代码片段:Javascript 比较;标记名";将财产转让给「;img";不适用于<;img>;要素,javascript,if-statement,Javascript,If Statement,我有以下代码片段: function switchEvent() { if (this.lastChild.tagName == "img" ) { var remove = this.lastChild; this.removeChild(remove); } else { console.log(this.lastChild); var image = document.createElement('i
function switchEvent() {
if (this.lastChild.tagName == "img" ) {
var remove = this.lastChild;
this.removeChild(remove);
}
else {
console.log(this.lastChild);
var image = document.createElement('img');
}
}
注意,在第二部分中,当我检查console.log时,它会打印出:
<img height="20" width="75" src="btn2.png" style="left: -14px; right: 0px;">
它只是跳过“if”而跳转到“else”。
啊,什么
编辑:这是一个onclick事件。因此,“this”指的是单击的元素。Try
if (this.lastChild.tagName == "IMG") {
// ...
“标记名”属性是大写的。或者,你不能做出这样的假设并强迫事情发生:
if (this.lastChild.tagName.toLowerCase() == "img") {
// ...
也应该有效。但是,如果最后一个子节点不是具有标记名的节点(例如,如果是文本或注释节点),则第二个版本将遇到问题。你会得到一个例外,但不是第一个例外。您可以进行显式的
undefined
测试,但大写惯例实际上在HTMLDOM级别1规范中,因此这是一个非常安全的假设。(编辑一个聪明的人指出,.nodeName
属性将始终存在,并且它与元素节点的.tagName
相同。它也是大写。)您如何调用switchEvent
?console.log(this.lastChild.tagName)
显示什么?怎么样console.log(this.lastChild)代码>?你在测试什么浏览器?你的HTML是什么样子的?您尝试了多少次调试?调试时,调试器中的this.lastChild.tagName
值是多少?我猜这不是“img”
。您的假设中很可能存在错误,而不是JavaScript语言中的错误。如果最后一个孩子
将是一个textnode呢?使用.nodeName
而不是.tagName
将避免异常。所有节点都有一个.nodeName
,元素节点给它的值与给标记名的值相同。。。我期待着lastElementChild
;)。撇开浏览器支持方面的顾虑不谈(目前主要是IE8),@Teemu的建议是可行的。@cookiemonster是的,如果这是支持实际意图的话。我的意思是,如果你对实际的最后一个节点感兴趣,那么不是,但是如果它是最后一个元素,而不考虑其他东西,那么是的。(可能是的。)