【问题标题】:Function is not defined - Uncaught ReferenceError未定义函数 - 未捕获的 ReferenceError
【发布时间】:2022-01-24 07:35:04
【问题描述】:

我有这个“未捕获的 ReferenceError: function is not defined”错误,不明白。

如果我有

$(document).ready(function() {
  function codeAddress() {
    var address = document.getElementById("formatedAddress").value;
    geocoder.geocode({
      'address': address
    }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        map.setCenter(results[0].geometry.location);
      }
    });
  }
});

<input type="image" src="btn.png" alt="" onclick="codeAddress()" />
<input type="text" name="formatedAddress" id="formatedAddress" value="" />

当我按下按钮时,它会返回“Uncaught ReferenceError”。

但是,如果我将codeAddress() 放在 $(document).ready(function(){}) 之外,那么它会工作很好

我的意图是将codeAddress() 放在document.ready 函数中。

【问题讨论】:

  • 有问题的网站上的按钮丢失了,哪个有附加的错误?
  • 左边的按钮,有“位置或地址”

标签: javascript


【解决方案1】:

有时会因为缓存和cookies以及我们在js文件上创建的函数无法被浏览器加载而发生。因此,请尝试清除缓存和 cookie 或在同一页面上按 CTRL+F5。另外,您可以尝试在隐身模式下打开它。

【讨论】:

    【解决方案2】:

    清除缓存为我解决了这个问题,或者您可以在其他浏览器中打开它

    index.js

    function myFun() {
        $('h2').html("H999999");
    }
    

    index.jsp

    <html>
    <head>
        <title>Reader</title>
    </head>
    <body>
    <h2>${message}</h2>
    <button id="hi" onclick="myFun();" type="submit">Hi</button>
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      我想我会提到这一点,因为我花了一段时间来解决这个问题,而且我在 SO 上的任何地方都找不到答案。我正在编写的代码为一位同事工作,但不适合我(我遇到了同样的错误)。它适用于 Chrome,但不适用于 Edge。

      我可以通过清除 Edge 中的缓存来使其正常工作。

      这可能不是这个特定问题的答案,但我想我会提到它以防它为其他人节省一点时间。

      【讨论】:

        【解决方案4】:

        还有一件事。根据我的经验,发生此错误是因为 Function is not defined - uncaught referenceerror 之前还有另一个错误。

        因此,通过控制台查看是否存在先前的错误,如果存在,请更正任何存在的错误。你可能很幸运,因为他们是问题所在。

        【讨论】:

          【解决方案5】:

          请检查您是否提供了正确的 js 引用。首先是 JQuery 文件,然后是您的自定义文件。由于您在 js 方法中使用了“$”。

          【讨论】:

            【解决方案6】:

            你必须在ready()之外写那个函数体;

            因为ready是用来调用函数或者绑定绑定id的函数,像这样。

            $(document).ready(function() {
                $("Some id/class name").click(function(){
                    alert("i'm in");
                });
            });
            

            但如果你在 onchange/onclick 事件中调用“showAmount”函数,则不能这样做

            $(document).ready(function() {
                function showAmount(value){
                    alert(value);
                }
            
            });
            

            你必须在ready()之外写“showAmount”;

            function showAmount(value){
                alert(value);//will be called on event it is bind with
            }
            $(document).ready(function() {
                alert("will display on page load")
            });
            

            【讨论】:

              【解决方案7】:

              您的问题是您不了解您设置的范围。

              您正在向ready 函数传递一个函数本身。在此函数中,您将创建另一个名为 codeAddress 的函数。这个存在于创建它的范围内,而不是在 window 对象内(所有东西及其叔叔都可以调用它)。

              例如:

              var myfunction = function(){
                  var myVar = 12345;
              };
              
              console.log(myVar); // 'undefined' - since it is within 
                                  // the scope of the function only.
              

              在这里查看更多关于匿名函数的信息:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

              另一件事是我注意到您在该页面上使用了 jQuery。这使得设置点击处理程序变得更加容易,您无需费心在 HTML 中设置“onclick”属性。您也不需要将codeAddress 方法提供给所有人:

              $(function(){
                  $("#imgid").click(function(){
                      var address = $("#formatedAddress").value;
                      geocoder.geocode( { 'address': address}, function(results, status) {
                         if (status == google.maps.GeocoderStatus.OK) {
                           map.setCenter(results[0].geometry.location);
                         }
                      });
                  });  
              });
              

              (您应该删除现有的onclick 并向您要处理的图像元素添加一个ID)

              请注意,我已将 $(document).ready() 替换为它的快捷方式 $() (http://api.jquery.com/ready/)。然后使用click 方法为元素分配一个点击处理程序。我还用 jQuery 对象替换了您的 document.getElementById

              【讨论】:

              • 哇!谢谢乔纳森,你对像我这样的初学者的所有解释都非常有帮助。
              • 这对我不起作用..我仍然有同样的问题,你能帮帮我吗
              【解决方案8】:

              如何去掉onclick属性并添加一个ID:

              <input type="image" src="btn.png" alt="" id="img-clck" />
              

              还有你的脚本:

              $(document).ready(function(){
                  function codeAddress() {
                      var address = document.getElementById("formatedAddress").value;
                      geocoder.geocode( { 'address': address}, function(results, status) {
                          if (status == google.maps.GeocoderStatus.OK) {
                              map.setCenter(results[0].geometry.location);
                          }
                      });
                  }
                  $("#img-clck").click(codeAddress);
              });
              

              这种方式如果你需要改变函数名或者什么都不需要接触html。

              【讨论】:

              • @ifaour 如果我想将参数传递给codeAddress() 函数,该怎么办?
              • 删除onclick 不会一直有帮助。我正在动态创建一些元素,并希望它们在单击时调用一个函数。我不能用你提到的方法来实现这一点。你的是替代方案,不是问题的解决方案。
              • 如果所有其他方法都没有在就绪部分中受到保护,这将很有帮助。由于嵌套视图,这变得有点头疼,我们必须使用准备好的文档,但可以在外部声明的内部访问。
              【解决方案9】:

              问题是codeAddress() 没有足够的范围可以从按钮调用。你必须在ready()的回调之外声明它:

              function codeAddress() {
                  var address = document.getElementById("formatedAddress").value;
                  geocoder.geocode( { 'address': address}, function(results, status) {
                      if (status == google.maps.GeocoderStatus.OK) {
                          map.setCenter(results[0].geometry.location);
                      }
                  });
              }
              
              
              $(document).ready(function(){
                  // Do stuff here, including _calling_ codeAddress(), but not _defining_ it!
              });
              

              【讨论】:

              • 感谢 Humberto,我现在对 javascript 有了更多的了解。谢谢你的解释。
              • 这个!这是我的问题的答案,因为我无法运行自己的函数(与 jQuery 无关),并且只要我将它们放在 jQuery(document).ready(function() { 之前,一切正常!谢谢,温贝托!
              • 谢谢,这个回答让我了解jquery和js
              • 完美答案。解决了我的问题,function was undefined
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多