Javascript 如何初始化firstChild以便我不';“得不到”;x、 firstChild是否为空或不是对象;?
在我的JSP/HTML中,我有以下内容:Javascript 如何初始化firstChild以便我不';“得不到”;x、 firstChild是否为空或不是对象;?,javascript,Javascript,在我的JSP/HTML中,我有以下内容: <div id="exampleLabel"> </div> 这在Chrome中运行良好,在Firefox和IE中不起任何作用,页面上出现一个错误: exampleLabel.firstChild为null或不是对象 好吧,我可以认为没有firstChild,所以尝试使用firstChild。任何东西都会是NPE,我甚至可以认为其他浏览器不会像Chrome那样自行初始化 问题是,我如何自己初始化它,然后才能对其进行.nodeVa
<div id="exampleLabel"> </div>
这在Chrome中运行良好,在Firefox和IE中不起任何作用,页面上出现一个错误:
exampleLabel.firstChild为null或不是对象
好吧,我可以认为没有firstChild,所以尝试使用firstChild。任何东西都会是NPE,我甚至可以认为其他浏览器不会像Chrome那样自行初始化
问题是,我如何自己初始化它,然后才能对其进行
.nodeValue=“blahblah”
?创建一个textNode,然后附加它
function changeLabel(){
var textNode = exampleLabel.firstChild;
if (!textNode) {
textNode = document.createTextNode('foo');
exampleLabel.appendChild(textNode);
}
textNode.nodeValue = 'LABEL HAS CHANGED';
}
它在IE中不起作用的原因是,与所有其他主流浏览器不同,它不会为HTML中的空白创建文本节点,因此只包含空格的
在IE中没有子节点。我建议手动添加文本节点,或更改现有的文本节点
此外,除非您在其他地方声明了exampleLabel
,否则您依赖的是IE和Chrome的一个非标准且相当讨厌的特性,该特性将DOM元素的ID映射到全局对象的属性(即,您可以通过其ID将元素引用为变量)。这在其他浏览器中不起作用。您应该改为使用document.getElementById()
尽管不太符合DOM,为什么不坚持使用
examplelab.innerHTML='LABEL HAS change'代码>?啊,我明白了,我原以为Firefox的问题是一样的,但它并没有像IE那样出现错误。为指出这一点干杯。一分为二@TimDown我知道复制exampleLabel而不从全局范围中通过ID识别引用是一个容易犯的错误,但答案仍然不完整。这是一个灰色地带,它是否有效的否决票。是的,这很苛刻,但在这种情况下,您可以识别出用户是通过ID直接引用exampleLabel的。
function changeLabel(){
var textNode = exampleLabel.firstChild;
if (!textNode) {
textNode = document.createTextNode('foo');
exampleLabel.appendChild(textNode);
}
textNode.nodeValue = 'LABEL HAS CHANGED';
}
function changeLabel(labelText) {
var exampleLabel = document.getElementById('exampleLabel');
var child = exampleLabel.firstChild;
if (!child) {
child = document.createTextNode('');
exampleLabel.appendChild(child);
}
child.nodeValue = labelText;
}
changeLabel('LABEL HAS CHANGED');