2013-07-16 3 views
0

С помощью следующего кода будет отправлен статус ERROR. Когда я положил commandButton вне формы ИЛИ положил еще alert() в конце geocode() статус OK будет предупрежден.
Что здесь происходит?Как объяснить это поведение JSF и Javascript?

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head> 

    <script src="https://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false"></script> 

    <script> 
    var geocoder; 
    geocoder = new google.maps.Geocoder(); 

    function geocode() { 
     geocoder.geocode({'address' : 'china'},geocoderCallback); 
    } 

    function geocoderCallback(results, status) { 
     alert(status); 
     }; 
    </script> 

</h:head> 

<h:body> 

    <h:form> 
    <h:commandButton onclick="geocode()" value="geocode" /> 
    </h:form> 

</h:body> 
</html> 

ответ

2

Для начала изменять свой код из

onclick="geocode()" 

в

onclick="geocode(); return false;" 

Причина этого поведения, потому что, когда <h:commandButton находится внутри h:form (и вы не используете f:ajax) вы делаете всю страницу отправить

В результате этого всей страницы представить страница перезарядка будет происходить (и то, что портит карты), и после этого перезагрузить обратный вызов («geocoderCallback») вызывается

при перемещении <h:commandButton за пределами h:form он не будет отправлять какую-либо страницу и вызывать только код js, и в этом случае все в порядке (ваши карты не «перепутаны»)

то же самое относится к «другое предупреждение() в конце геокода() " он покажет предупреждение перед отправкой страницы (до того, как ваши карты« перепутаны »)

+0

Благодарим вас за полезный ответ. Теперь он работает и даже начинает иметь больше смысла, но я до сих пор не понимаю: как эта часть после перезагрузки страницы работает? Я бы предположил, что только «никто» больше не слушает ответ от сервера геокодирования. Я также думаю, что статус «ОШИБКА» означает, что с некоторым запросом что-то не так. Но сам запрос должен быть прекрасен. – Lester

+1

Геокодер работает, по-видимому, асинхронно. Поэтому, как только он запускается и выполняется в другом потоке, текущий поток немедленно возвращается к продолжению кнопки 'onclick' поведения синхронного представления формы. Этот шаг, в свою очередь, прерывает все запущенные асинхронные вызовы на текущей странице. Затем вызов геокодера приводит к ошибке. – BalusC

+0

Итак, статус «ОШИБКА» происходит не от сервера геокодирования, а от сценария, загруженного на мой клиент? – Lester

Смежные вопросы