2013-07-16 19 views
0

使用以下代碼提醒狀態ERROR。當我把commandButton置於表格的外部或者在geocode()的末尾放置另一個alert()時,狀態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:commandButtonh:form內(和你沒有使用f:ajax )您正在做一個整頁提交

作爲該整個頁面的結果提交會發生重新加載頁面(這是什麼弄亂地圖),之後重裝你的回調(「geocoderCallback」)被稱爲

如果移動<h:commandButtonh:form外不會做任何頁面提交,只調用JS代碼,在這種情況下,一切正常(您的地圖不「亂」)

同樣適用於「另一個警報()結尾的地理編碼()「它會在頁面提交之前顯示警報(在地圖」混亂「之前)

+0

感謝您的幫助。現在它起作用了,甚至開始變得更有意義了,但我仍然沒有真正明白它:頁面重新加載之後這部分是如何工作的?我本來以爲只有「沒有人」會收聽來自地理編碼服務器的響應。我也認爲'ERROR'狀態意味着某些請求出了問題。但請求本身應該沒問題。 – Lester

+1

Geocoder顯然是異步運行的。因此,一旦它被觸發並在另一個線程中執行,那麼當前線程立即返回以繼續按鈕的同步提交表單的「onclick」行爲。這一步反過來中止當前頁面上所有正在運行的異步調用。地理編碼調用會導致錯誤。 – BalusC

+0

因此'ERROR'的狀態不是來自地理編碼服務器,而是來自加載到我的客戶端的腳本? – Lester

相關問題