Функция не определена - uncaught referenceerror

У меня в этой неперехваченной ссылочной функции ошибки не определена ошибка, которую не понимают.

Если у меня есть

$(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.function.

12 ответов

Решение

Как насчет удаления onclick атрибут и добавление идентификатора:

<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.

Проблема в том, что 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!
});

Ваша проблема здесь в том, что вы не понимаете объем, который вы устанавливаете.

Вы передаете ready Функция сама функция. В рамках этой функции вы создаете другую функцию под названием codeAddress, Этот существует в области, которая его создала, а не в объекте окна (где все и его дядя могли бы это назвать).

Например:

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 на этой странице. Это значительно упрощает настройку обработчиков кликов, и вам не нужно ломать голову над настройкой атрибута "onclick" в HTML. Вам также не нужно делать 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 и добавьте идентификатор к элементу изображения, который вы хотите обработать)

Обратите внимание, что я заменил $(document).ready() с его ярлыком просто $() ( http://api.jquery.com/ready/). Затем метод click используется для назначения обработчика щелчка элементу. Я также заменил ваш document.getElementById с объектом jQuery.

Вы должны написать тело этой функции за пределами ready();

потому что ready используется для вызова функции или для привязки функции с идентификатором привязки следующим образом.

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

но вы не можете сделать это, если вызываете функцию onchange / onclick функции showAmount

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

});

Вы должны написать "showAmount" за пределами ready();

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

Очистка кеша решила проблему для меня, или вы можете открыть его в другом браузере

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>

Еще кое-что. По моему опыту, эта ошибка возникла из-за другой ошибки, предшествующей Function is not defined - uncaught referenceerror.

Итак, просмотрите консоль, чтобы увидеть, существует ли предыдущая ошибка, и если да, исправьте любую существующую. Возможно, вам повезло, потому что они были проблемой.

Иногда это происходит из-за кеша и файлов cookie, а функция, которую мы создали для файла js, не может быть загружена браузером. Поэтому попробуйте очистить кеш и файлы cookie или нажмите CTRL+F5 на той же странице. Также вы можете попробовать открыть его в режиме инкогнито.

Думал, что упомяну об этом, потому что мне потребовалось время, чтобы исправить эту проблему, и я не мог найти ответ нигде на SO. Код, над которым я работал, работал на моего коллегу, но не на меня (я получал ту же ошибку). У меня это сработало в Chrome, но не в Edge.

Я смог заставить его работать, очистив кеш в Edge.

Возможно, это не ответ на этот конкретный вопрос, но я подумал, что упомяну об этом, если это сэкономит кому-то немного времени.

пожалуйста, добавьте функцию вне функции .ready.

      $(document).ready(function () {
   listcoming();
});

function listcoming() {}

Вот так... ему не хватает места и объема внутри .ready f

Пожалуйста, проверьте, правильно ли вы предоставили JS ссылки. Сначала файлы JQuery, а затем ваши пользовательские файлы. Так как вы используете '$' в своих методах js.

Если вы поместите функцию между (), это будет локальная функция, поэтому функция предназначена только для этого скрипта.

И тогда вы сможете использовать функцию в каждом скрипте

Просто переместите функцию во внешний файл js, так как он включает код $. Эта ошибка будет устранена.

Другие вопросы по тегам