无法设置null的属性'innerHTML'

Jos*_*a W 69 javascript innerhtml onload

为什么我会收到错误或Uncaught TypeError:无法设置null的属性'innerHTML'?我以为我理解innerHTML并且之前有过工作.

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>

<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>

</head>

<body>
<div id="hello"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Eri*_*ard 117

您必须在脚本之前放置hello div,以便在加载脚本时它存在.

  • 如果你使用window.onload = function name(){},那么div是在之前还是之后都没关系. (13认同)
  • 酥脆的解决方案。但我仍然收到错误。在 chrome/fedora 25/apache 中 (2认同)

Col*_*337 33

你需要告诉javascript执行动作"onload"...试试这个:

<script type ="text/javascript">
window.onload = function what(){
document.getElementById('hello').innerHTML = 'hi';
};
</script>
Run Code Online (Sandbox Code Playgroud)


RBT*_*RBT 30

我看到所有技术人员都提供了解决问题的解决方案,但是没有人能够理解为什么它首先发生的原因或根本原因.

为什么我会收到错误或Uncaught TypeError:无法设置null的属性'innerHTML'?

浏览器始终从上到下加载整个HTML DOM.在script标记内部(存在于headHTML文件的部分中)的任何JavaScript代码都会被浏览器呈现引擎执行,甚至在加载整个DOM(body标记中存在的各种HTML元素标记)之前.head标记中存在的脚本hello甚至在实际在DOM中呈现之前就试图访问具有id的元素.显然,JavaScript无法看到该元素,因此您最终会看到空引用错误.

你怎么能像以前一样工作?

当用户第一次登陆您的页面时,您希望在页面上显示"hi"消息.因此,当您完全确定DOM已完全加载且helloid元素可访问/可用时,您需要在某个时刻连接代码.它可以通过两种方式实现:

  1. 重新排序脚本:这样,只有在hello已经加载包含id元素的DOM之后才会触发脚本.您可以通过在所有DOM元素之后移动脚本标记来实现它,即在body标记结束的底部.由于渲染是从上到下进行的,因此您的脚本最终会被执行,并且您不会遇到任何错误.

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Untitled Document</title>
    </head>
    
    <body>
    <div id="hello"></div>
    
    <script type ="text/javascript">
        what();
        function what(){
            document.getElementById('hello').innerHTML = 'hi';
        };
    </script>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

  1. 使用事件挂钩:浏览器的呈现引擎提供基于事件的挂钩window.onload事件,它为您提供浏览器已完成加载DOM的提示.因此,当此事件被触发时,您可以放心,hello已经在DOM中加载了id 的元素以及之后尝试访问此元素的任何JavaScript都不会失败.所以你做了类似下面的代码片段.请注意,在这种情况下,即使脚本位于head标记内HTML文档的顶部,您的脚本仍然有效.

<!DOCTYPE HTML>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Untitled Document</title>
        <script type ="text/javascript">
            window.onload = function() {
            what();
            function what(){
                document.getElementById('hello').innerHTML = 'hi';
            };
        }
        </script>
        </head>
        
        <body>
        <div id="hello"></div>
        </body>
        </html>
Run Code Online (Sandbox Code Playgroud)


use*_*957 9

JavaScript 部分需要在页面加载后运行,因此建议将 JavaScript 脚本放在 body 标签的末尾。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Example</title>

</head>
<body>
<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>  
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 请您不要将您输入的每个单词都大写吗? (3认同)

RIY*_*HAN 8

把你的JS放进去吧 window.onload

window.onload = function() {

        what();

        function what() {
            document.getElementById('hello').innerHTML = 'hi';
        };

    }
Run Code Online (Sandbox Code Playgroud)


JT *_*lan 6

JavaScript看起来不错。尝试在div加载后运行它。尝试仅在文档准备就绪时运行。$(document).ready在jQuery中。

  • 导入jquery来解决这个问题是多余的,除非您打算在这里继续将其用于本项目。“ window.onload”可能就足够了,但是还有其他事件可用。在“窗口”上引用MDN:https://developer.mozilla.org/en-US/docs/Web/API/Window (2认同)

小智 5

这是我的片段尝试一下。我希望它对你有帮助。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
</head>

<body>
  
<div id="hello"></div>
  
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)


小智 5

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Example</title>

</head>
<body>
<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = '<p>hi</p>';
    };
</script>  
</body>
</html>
Run Code Online (Sandbox Code Playgroud)