Javascript getElementById()空错误
对于那些想在问题之前获得答案的人: 1)在实际创建元素之前,不要使用getElementById()读取该元素:请参阅windows.onload 2)如果您使用的是XMLHTTPRequest和AJAX内容,请在回调中调用您的getElementById(),或解锁此函数(xhr_object.readyState==请求的4部分) 在我的例子中,我调用我的页面时没有使用所需的回调(noobish Ctrl-C Ctrl-V样式) 问题是: 我在HTML/Javascript代码中遇到了一个奇怪的情况。 这段代码的目的是通过JS函数获取HTML输入(键入文本)的值 上下文是一个主HTML页面加载my all my JS函数,并通过HTTPRequest按需加载子div中的HTML内容 加载div后将调用所选代码 以下是我必须阅读的PHP生成的输入字段:Javascript getElementById()空错误,javascript,alert,getelementbyid,textinput,Javascript,Alert,Getelementbyid,Textinput,对于那些想在问题之前获得答案的人: 1)在实际创建元素之前,不要使用getElementById()读取该元素:请参阅windows.onload 2)如果您使用的是XMLHTTPRequest和AJAX内容,请在回调中调用您的getElementById(),或解锁此函数(xhr_object.readyState==请求的4部分) 在我的例子中,我调用我的页面时没有使用所需的回调(noobish Ctrl-C Ctrl-V样式) 问题是: 我在HTML/Javascript代码中遇到了一个奇
<input id="listejf" type="text" value="6|7|">
这个代码不起作用。Firebug发送给我:
TypeError:document.getElementById(“ListJF”)为空
奇怪的是,如果我通过警报调用getElementById
,我可以让它工作,如下所示:
alert(document.getElementById("listejf"));
listejf=document.getElementById('listejf').value;
alert(listejf);
第一个警报显示null
,但第二个警报显示为“6 | 7 |”
现在有两个问题:
- 为什么警报能让它工作
- 我怎样才能让它在不到处发出警报的情况下工作
重新编辑后,代码消失:
这是主HTML页面:main.HTML
<head>
<script type="application/javascript" src="./preload.js"></script>
</head>
<body>
<a href="#" onCLick="CallPagen()">Link</a>
<div id="targetid"></div>
</body>
PageN.php只是用填充的值回显inputtext字段。您应该在DOM就绪后运行代码,当调用警报()
时,文档正在加载,浏览器有时间创建DOM对象,请尝试以下操作:
加载事件在文档加载过程结束时激发。此时,文档中的所有对象都在DOM中,所有图像和子帧都已完成加载
应该在DOM就绪后运行代码,当调用警报()
时,文档正在加载,浏览器有时间创建DOM对象,请尝试以下操作:
加载事件在文档加载过程结束时激发。此时,文档中的所有对象都在DOM中,所有图像和子帧都已完成加载
“…如果我通过类似这样的警报调用getelement,我可以使它工作…”
这几乎总是意味着您正在发出一个异步AJAX请求
“为什么警报能让它工作?”
发生的情况是,警报
将下一行代码的处理延迟足够长的时间,以便响应返回
如果没有警报
,下一行代码将立即运行,并且元素还不可用
“我怎样才能使它工作而不到处发出警报?”
这是一个非常普遍的问题。解决方案是,您需要将依赖于XMLHttpRequest请求响应的任何代码放入对请求的回调中
因此,如果您是通过本机API发出请求,您应该添加一个onreadystatechange
回调
xhrRequest.onreadystatechange = function() {
if (xhrRequest.readyState === 4) {
// append the response text to the DOM
listejf=document.getElementById('listejf').value;
alert(listejf);
}
}
“…如果我通过类似这样的警报调用getelement,我可以使它工作…”
这几乎总是意味着您正在发出一个异步AJAX请求
“为什么警报能让它工作?”
发生的情况是,警报
将下一行代码的处理延迟足够长的时间,以便响应返回
如果没有警报
,下一行代码将立即运行,并且元素还不可用
“我怎样才能使它工作而不到处发出警报?”
这是一个非常普遍的问题。解决方案是,您需要将依赖于XMLHttpRequest请求响应的任何代码放入对请求的回调中
因此,如果您是通过本机API发出请求,您应该添加一个onreadystatechange
回调
xhrRequest.onreadystatechange = function() {
if (xhrRequest.readyState === 4) {
// append the response text to the DOM
listejf=document.getElementById('listejf').value;
alert(listejf);
}
}
确保您的JavaScript位于页面上的
元素之后,或者位于“load”或“ready”处理程序中。JavaScript代码在元素编写之前加载到我的主页中,但这部分代码在之后调用。我不了解sry。你还没有发布足够的上下文让问题变得明显。代码到底是如何调用的?@Pointy:很可能xhr请求是异步的。@Pointy:是的,需要做一点澄清,但考虑到OP是通过xhr加载内容的,并且存在一个警报
使其能够工作,我认为这是99%的可能性。请确保您的JavaScript位于页面上的
元素之后,或者位于“load”或“ready”处理程序中。JavaScript代码在编写元素之前加载到我的主页中,但这部分代码在之后调用。我不了解sry。你还没有发布足够的上下文让问题变得明显。代码到底是如何调用的?@Pointy:很可能xhr请求是异步的。@Pointy:是的,需要做一点澄清,但是考虑到OP是通过xhr加载内容的,并且存在一个警报使其能够工作,我认为大约有99%的可能性。可以看到,输入是通过XMLHttpRequest创建的,window.onload似乎没有按预期触发。谢谢你的尝试@Encheridon欢迎您,因为您使用的是Ajax,所以您应该在Ajax完成后运行代码。可以看到,输入的创建是通过XMLHttpRequest完成的,window.onload似乎没有按预期触发。谢谢你的尝试@Encheridon欢迎您,因为您使用的是Ajax,您应该在Ajax完成后运行代码。不,不包括Ajax。只是DOM异步stuff@Bergi:嗯?你怎么知道的?我这样称呼阅读功能,但没有结果:[
window.onload = function() {
var listejf = document.getElementById('listejf').value;
alert(listejf);
};
xhrRequest.onreadystatechange = function() {
if (xhrRequest.readyState === 4) {
// append the response text to the DOM
listejf=document.getElementById('listejf').value;
alert(listejf);
}
}