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是的,如果这是支持实际意图的话。我的意思是,如果你对实际的最后一个节点感兴趣,那么不是,但是如果它是最后一个元素,而不考虑其他东西,那么是的。(可能是的。)