未捕获的TypeError:无法读取null的属性'appendChild'

Spa*_*rky 12 javascript ajax

我收到以下错误

未捕获的TypeError:无法读取null的属性'appendChild'

myRequest.onreadystatechange @ script.js:20

用我的以下代码

// index.html 
<html>
    <head>
        <title>Simple Page</title>
    </head>
    <body>
        <div id="mainContent">
            <h1>This is an AJAX Example</h1>
        </div>
        <script type="text/javascript" src="script.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我的JavaScript文件

// script.js
// 1. Create the request

var myRequest;

// feature check!
if(window.XMLHttpRequest) { // Firefox, Safari
    myRequest = new XMLHttpRequest();
} else if (window.ActiveXObject){ // IE
    myRequest = new ActiveXObject("Microsoft.XMLHTTP");
}


// 2. Create an event handler for our request to call back 
myRequest.onreadystatechange = function() {
    console.log("We were called!");
    console.log(myRequest.readyState);
    if(myRequest.readyState === 4){
        var p = document.createElement("p");
        var t = document.createTextNode(myRequest.responseText);
        p.appendChild(t);
        document.getElementById("mainContent").appendChild(p);
    }
};

// 3. open and send it
myRequest.open("GET","simple.txt", true);

// any parameters?
myRequest.send(null);
Run Code Online (Sandbox Code Playgroud)

这是内容 simple.txt

这是一个简单文本文件的内容.

按照@Tejs的建议把脚本标签放在html的底部,但我仍然遇到这个错误.

小智 27

对于有相同问题querySelectorgetElementById返回以下错误的人:

Uncaught TypeError: Cannot read property 'appendChild' of null
Run Code Online (Sandbox Code Playgroud)

但是你在 HTML 中有一个类名或 id ......

如果您的脚本标记在头部,则 JavaScript 将在您的 HTML 之前加载。您需要defer像这样添加到脚本中:

<script src="script.js" defer></script>
Run Code Online (Sandbox Code Playgroud)

  • 将“defer”放入脚本文件中可以解决问题。使用“defer”,javascript 文件最后在页面上打开。因此,它可以防止错误的发生。 (2认同)

Ale*_*lan 14

在执行回调时,页面上没有一个带有"mainContent"的元素.

在线:

document.getElementById("mainContent").appendChild(p);
Run Code Online (Sandbox Code Playgroud)

该部分document.getElementById("mainContent")正在返回null


Edg*_*256 8

不错的答案在这里。我遇到了同样的问题,但我尝试过,<script src="script.js" defer></script>但效果不佳。我的所有代码和链接都设置得很好。问题是我把js文件链接放在了页面的头部,所以它是在加载DOM之前加载的。对此有 2 种解决方案。

window.onload = () => {
    //write your code here
}
Run Code Online (Sandbox Code Playgroud)
  1. 添加<script src="script.js"></script>到 html 文件的底部,以便它最后加载。


sif*_*_in 6

那些获取 querySelector 或 getElementById 返回以下错误的:

Uncaught TypeError: Cannot read property 'appendChild' of null
Run Code Online (Sandbox Code Playgroud)

或任何其他属性,即使您在 HTML 中有类名或 id

不要使用(推迟,因为它太依赖浏览器了。)

<script src="script.js" defer></script>  //don't use this
Run Code Online (Sandbox Code Playgroud)

相反,将所有代码放入“script.js”内

$(document).ready(function(){
    //your script here.
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是只是将依赖关系从“跨浏览器”转移到“jQuery”吗?也许添加 POJS 版本。 (4认同)