Javascript getElementById()空错误

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代码中遇到了一个奇

对于那些想在问题之前获得答案的人:

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生成的输入字段:

    <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);
    }
}