我有一个简单的脚本测试,它调用HTML文件。在那个html文件中是一个id为"test2"
的div。
然后我尝试将内容添加到其innerHTML中,但它的行为就像它不存在一样,即使div显示在浏览器中。
这就是我接近这个想法的方式:
<script>
function call_file(file,div_id){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById(div_id).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET",file,true);
xmlhttp.send();
}
window.onload = function() {
file = 'test.html';
div_id = 'test';
call_file(file,div_id);
document.getElementById('test2').innerHTML = 'Hi';
};
</script>
<div id="test" class="outer""></div>
“test.html”的内容:
<div id="test2" class="inner"></div>
为什么它没有找到带有此错误的id "test2"
,即使我亲眼看到div:
Cannot set property 'innerHTML' of null
答案 0 :(得分:2)
您正在进行异步调用,因此send()
将在收到响应之前返回并添加到DOM中。任何依赖于接收数据的代码都应该在您的onreadystatechange
函数中,或以某种方式由它触发,以便在收到响应数据之前它不会执行。
答案 1 :(得分:1)
您无法设置它,因为它尚不存在。你需要等到它被加载。
您可以使用回调函数执行此操作。
function call_file(file,div_id, callback){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById(div_id).innerHTML=xmlhttp.responseText;
return callback();
}
}
xmlhttp.open("GET",file,true);
xmlhttp.send();
}
window.onload = function() {
file = 'test.html';
div_id = 'test';
call_file(file,div_id, function () {
document.getElementById('test2').innerHTML = 'Hi';
});
};