2014-02-05 31 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