2014-02-05 32 views
0

我有一個簡單codesample之前等待做兩件事情:如何執行的jQuery的AJAX執行以下語句

  • 詢問接受郎頭(阿賈克斯)
  • 使用/引用它(可AJAX的一部分,因爲這需要在很多地方,樣品是顯示在屏幕上)

的HTML是這樣的:

<html> 
<head> 
<script src="jquery-1.11.0.js"></script> 
</head> 
<body> 
<H1 id=bLocale>Should be the browser locale here</H1> 
</body> 
<script> 
var bLocale='unchanged'; 
$.ajax({ 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) { 
     bLocale= headers['Accept-Language']; 
     comma=bLocale.indexOf(','); 
     if(comma>0) bLocale=bLocale.substring(0, comma); 
    }, 
    async: false 
}); 
$("#bLocale").text(bLocale); 
</script> 
</html> 

問題是ajax太慢了(即使asyn set false),並且顯示在bLocale獲取返回值之前發生。

解決此問題的任何想法?

+6

歡迎** **異步的奇妙世界!你不能那樣做。 – SLaks

+0

不適用於JSONP,不會。 JSONP本質上是異步的。真正的阿賈克斯alls可以被迫是同步的,但不是JSONP。 –

+2

你爲什麼不不只是把'$(「#bLocale」)文本(bLocale);'你的AJAX成功函數 – putvande

回答

3

The problem is that ajax is too slow (even with asyn set false) and the display happens before bLocale gets the returned value.

你告訴jQuery使用JSONP,它本質上是異步的; async: false對它沒有影響。 async: false作品true ajax請求,但不是JSONP。此外,(它不會長了不少,雖然jQuery開發團隊正在刪除async選項,你就必須使用XMLHttpRequest直接得到同步請求。)

,你不希望一個同步請求。擁抱web開發的異步,事件驅動性質:

var bLocale='unchanged'; // Move this *into* the success function unless 
         // you really, really need it to be outside it 
$.ajax({ 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) { 
     bLocale= headers['Accept-Language']; 
     comma=bLocale.indexOf(','); 
     if(comma>0) bLocale=bLocale.substring(0, comma); 

     $("#bLocale").text(bLocale); // <=== Inside the callback, not outside it 
    } 
}); 
+0

是,嵌入顯示代碼將工作此示例代碼,但在現實中,我需要bLocale在很多地方,所以我需要知道它得到正確的價值。在這種情況下,將更改爲另一種數據類型強制synchornous? – user3097579

+0

有些時候你不能看到樹林。很明顯,每天都這樣做,忘記其他人可能不會。 – davidkonrad

+0

@ user3097579:你在很多地方都需要它並不重要。您設置它,以便您告訴其他地方信息已準備就緒(從回調中)。 *「將更改爲另一種數據類型強制synchornous」*它會如果它的工作,但我猜你是使用JSONP的原因(具體來說,解決同源策略問題)。 JSONP可能是正確的選擇。您唯一的選擇是CORS,但依賴於您使用的服務支持它,您的訪客使用的瀏覽器支持它,並且您需要一個特殊的插件來支持較舊的IE。 –

0

It's right that it's impossible to use ajax to achieve synchronization. As the return is jsonp, we can load it in a script tag. See the following. Thanks for all the help that prompts me to this solution.

<html>
<head>
<script>

var bLocale='raw'; // can be used at any other place 

function processHeaders(headers){ 
    bLocale=headers['Accept-Language']; 
    comma=bLocale.indexOf(','); 
    if(comma>0) bLocale=bLocale.substring(0, comma); 
} 

</script>

<script src="jquery-1.11.0.js"></script>

<script type="application/javascript" src="http://ajaxhttpheaders.appspot.com?callback=processHeaders"></script>

</head>
<body>

<H1 id=bLocale>Should be the browser locale here</H1>

</body>

<script>

$("#bLocale").text(bLocale); 

</script>
</html>

+0

不幸的是,我無法使IE工作。任何解決方法? – user3097579