JavaScript перестает работать при добавлении функции обратного вызова

У меня странная проблема на моей веб-странице. JavaScript, прикрепленный к href, вызывается просто отлично и перестает работать, если вызываемая функция javascript добавляет в нее оператор с функцией обратного вызова. В этом случае даже предупреждение, размещенное в качестве самого первого оператора в JS-функции, вызываемой из href, не срабатывает.

Вот пример: Следующее работает просто отлично.

при переходе по этой ссылке

<a href = "#" onclick="getMyPosition(); return false;">refresh</a>,

следующая js func вызывается просто отлично, и я вижу оба предупреждающие сообщения, указывающие на то, что getMyPosition() был выполнен. Примечание: в настоящее время (то есть, когда js вроде бы работает) функция обратного вызова ("handleposition") НЕ определена, но она не вызывает никаких ошибок! странно само по себе :)

function getMyPosition() { 
  alert("it worked 1.");
  if ( navigator.geolocation )
  {
    alert("it worked 2.");
    navigator.geolocation.getCurrentPosition(handlePosition, handleError, {
    enabledHighAccuracy: true,
    maximumAge: 60000,
    timeout:    30000
    });
  }
}

Теперь, если я добавлю следующую функцию в блок сценария, все перестанет работать, и кажется, что ссылка обновления была даже нажата. Поскольку все остальное на веб-странице (содержащее события JavaScript и т. д., прикрепленные к другим элементам) продолжает работать нормально, я предполагаю, что JavaSctipt на странице работает нормально. Просто эта ссылка перестает вызывать функцию, определенную в событии onClick.

добавление следующей функции обратного вызова приводит к поведению, как если бы ссылка «обновить» даже не была нажата:

function handlePosition(pos)
{
  alert(pos.coords.latitude);
  alert(pos.coords.longitude);
  window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";
}

Теперь, если удалить эту функцию, ссылка href, показанная выше, снова начнет работать, будет вызвана функция getMyPosition, и я снова увижу предупреждающие сообщения! Я не вижу ошибок скрипта на странице Как в IE 11, так и в Chrome, демонстрирующих такое поведение. Я на 32-битной машине Windows 7.


person jaadooviewer    schedule 02.01.2014    source источник
comment
Где вы добавляете обратный вызов? Можете ли вы опубликовать полный код для сломанного сценария?   -  person Nathan Friedly    schedule 03.01.2014


Ответы (3)


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

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

Вот как я бы закодировал ссылку для работы во всех браузерах:

<a href="#" onclick="return(getMyPosition())">refresh</a>

А вот исправленный код JS для позиции дескриптора и новая процедура handleError.

Обратите внимание на «return false», добавленный к вашей основной функции:

function getMyPosition() {
    alert("it worked 1.");
    if (navigator.geolocation) {
        alert("it worked 2.");
        navigator.geolocation.getCurrentPosition(handlePosition, handleError, {
            enabledHighAccuracy: true,
            maximumAge: 60000,
            timeout: 30000
        });
    }
    return false;
}

function handlePosition(pos) {
    alert(pos.coords.latitude);
    alert(pos.coords.longitude);
    window.location.href = "/map?js=y&amp;lat=" + pos.coords.latitude + "&amp;lon=" + pos.coords.longitude;
}

function handleError(error) {
    alert(error);
}
person Jgreenst    schedule 02.01.2014
comment
Спасибо. Это помогает. Проблема частично была связана с неверным адресом для window.location.href. Я не понимаю, почему эта ошибка может привести к тому, что весь блок JS перестанет работать, включая первую функцию, где windows.location.href еще даже не упоминается. Кроме того, нигде не сообщалось об ошибке скрипта. Довольно сложно отлаживать такое, казалось бы, странное поведение... :) - person jaadooviewer; 03.01.2014
comment
Пожалуйста. Обработчик неопределенных ошибок выдал исключение при вызове getCurrentPosition; ошибка href была бы заметна только после того, как getCurrentPosition вызвала handlePosition. - person Jgreenst; 03.01.2014

window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";

наверное должно быть:

window.location.href = "/map?js=y&lat=" + pos.coords.latitude + "&lon=" + pos.coords.longitude;
person Dennis    schedule 02.01.2014
comment
да, проблема была связана с неверным адресом для window.location.href. Я не понимаю, почему эта ошибка может привести к тому, что весь блок JS перестанет работать, включая первую функцию, где windows.location.href еще даже не упоминается. - person jaadooviewer; 03.01.2014

Вставьте return false; в конце функции getMyPosition

person varfoo    schedule 02.01.2014
comment
Почему ОП должен это делать? Пожалуйста, объясните проблему и ваше решение. - person Felix Kling; 03.01.2014
comment
Спасибо за ответ. Я возвращаю false после вызова функции, в которой определяется onClick, поэтому я не думаю, что это понадобится снова и в getMyPosition. - person jaadooviewer; 03.01.2014