Uncaught ReferenceError - Function is not defined

落花浮王杯 提交于 2019-12-25 09:15:43

问题


I have created a small website with a couple of buttons. Each button should call a previously defined JS function. But with every button press I get a ReferenceError stating that the function is not defined.

(index):1 Uncaught ReferenceError: mainLightOn is not defined

Here's the code of my site:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>Home Cinema Control Center</title>
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" type="text/css" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js" type="text/javascript"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
    <style type="text/css">
        td {
            padding: 10px;
        }
        body {
            font-family: Segoe UI, Arial, sans-serif;
            background-color: #636363;
        }
        p {
            color: #3b3b3b;
            font-size: 4.0em;
        }
        .btn-xlarge {
            padding: 18px 28px;
            font-size: 3.5em;
            line-height: normal;
            border-radius: 8px;
        }
        .box {
            background-color: #fbfbfb;
            margin: 120px auto;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 10px 15px 20px rgba(0, 0, 0, 0.3);
        }
    </style>
    <script type="text/javascript">
        function httpGetAsync(theUrl) {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                  // Add stuff later
                }
            }
            xmlHttp.open("GET", theUrl, true);
            xmlHttp.send(null);
        }

        function mainLightOn() {
            httpGetAsync("/api/mainlight/1");
        }

        function mainLightOff() {
            httpGetAsync("/api/mainlight/0");
        }
    </script>
</head>

<body>
    <div class="box" style="width:90%; display:table">
        <table style="width:100%">
            <tr>
                <td style="width:40%;">
                    <p>Main Light</p>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-success btn-xlarge btn-block" onclick="mainLightOn()">On</button>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-danger btn-xlarge btn-block" onclick="mainLightOff()">Off</button>
                </td>
            </tr>
        </table>
    </div>
</body>

</html>

Strangely the error does only occur when I open the website from my server. When I open the html locally on my laptop, the functions are called fine.


回答1:


Your function definitions are inside the $().ready(function() {... }) body, so the scope is just that function. Javasript that's executed from HTML elements is executed in the global scope.

There's no need to put those functions inside $().ready(). You only need to put code there if it has to wait until the DOM is ready before running. But these functions will only be executed when the user clicks on the elements, which can't happen until the DOM is ready.




回答2:


The error can be reproduced if named functions are within .ready() handler, where this is set to document

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>Home Cinema Control Center</title>
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" type="text/css" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js" type="text/javascript"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
    <style type="text/css">
        td {
            padding: 10px;
        }
        body {
            font-family: Segoe UI, Arial, sans-serif;
            background-color: #636363;
        }
        p {
            color: #3b3b3b;
            font-size: 4.0em;
        }
        .btn-xlarge {
            padding: 18px 28px;
            font-size: 3.5em;
            line-height: normal;
            border-radius: 8px;
        }
        .box {
            background-color: #fbfbfb;
            margin: 120px auto;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 10px 15px 20px rgba(0, 0, 0, 0.3);
        }
    </style>
    <script type="text/javascript">
      $().ready(function() {
        function httpGetAsync(theUrl) {
          console.log(theUrl);
        }    

      
        function mainLightOn() {
            httpGetAsync("/api/mainlight/1");
        }

        function mainLightOff() {
            httpGetAsync("/api/mainlight/0");
        }
        })
    </script>
</head>

<body>
    <div class="box" style="width:90%; display:table">
        <table style="width:100%">
            <tr>
                <td style="width:40%;">
                    <p>Main Light</p>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-success btn-xlarge btn-block" onclick="mainLightOn()">On</button>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-danger btn-xlarge btn-block" onclick="mainLightOff()">Off</button>
                </td>
            </tr>
        </table>
    </div>
</body>

</html>

Solution, since it does not appear to be possible to set this to other than document using .ready(), where the onclick handler is expecting this to be window, is to place the named functions outside of .ready() handler

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>Home Cinema Control Center</title>
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" type="text/css" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js" type="text/javascript"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
    <style type="text/css">
        td {
            padding: 10px;
        }
        body {
            font-family: Segoe UI, Arial, sans-serif;
            background-color: #636363;
        }
        p {
            color: #3b3b3b;
            font-size: 4.0em;
        }
        .btn-xlarge {
            padding: 18px 28px;
            font-size: 3.5em;
            line-height: normal;
            border-radius: 8px;
        }
        .box {
            background-color: #fbfbfb;
            margin: 120px auto;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 10px 15px 20px rgba(0, 0, 0, 0.3);
        }
    </style>
    <script type="text/javascript">
        function httpGetAsync(theUrl) {
          console.log(theUrl);
        }    

      
        function mainLightOn() {
            httpGetAsync("/api/mainlight/1");
        }

        function mainLightOff() {
            httpGetAsync("/api/mainlight/0");
        }
    </script>
</head>

<body>
    <div class="box" style="width:90%; display:table">
        <table style="width:100%">
            <tr>
                <td style="width:40%;">
                    <p>Main Light</p>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-success btn-xlarge btn-block" onclick="mainLightOn()">On</button>
                </td>
                <td style="width:30%;">
                    <button type="button" class="btn btn-danger btn-xlarge btn-block" onclick="mainLightOff()">Off</button>
                </td>
            </tr>
        </table>
    </div>
</body>

</html>


来源:https://stackoverflow.com/questions/39668892/uncaught-referenceerror-function-is-not-defined

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!