JavaScript ajax, JSONP, 处理数据的回调函数

JavaScript ajax, JSONP, Callback function to do something with data

伙计们,

我正在尝试拨打 ajax 电话以获取一些 JSON。我可以很容易地解决 Chrome 中的跨源问题,但在 IE 中,我让它工作而不抛出错误的唯一方法是使用 JSONP。我的问题是我不知道如何处理响应。我可以看到调用在 fiddler 中执行并且它 returns JSON 但是我如何捕捉它并在下面的代码中使用它。

$.support.cors = true;

            function callAjaxIE(){

            $.ajax({                    
                type: 'GET',            
                async: true,
                url: usageUrl,
                dataType: 'jsonp',
                crossDomain: true,
                jsonp: false,
                jsonpCallback: processDataIE,                       
            //  cache: false,
                success: function (data) {
                    alert('success');
                    //processData(data)
                },
                error: function (e){

                    console.log(e);
                }

             }).done(function (data) {                      
                    alert('done');              
             });

function processDataIE(){

alert('processing data ie');
}

它在我 运行 时起作用,它显示一个消息框说 'processing data ie' 但那又怎样。我该如何处理结果?

更新:

所以我已经根据 Quentin 更新了代码。它不会进入 'success' 块。错误如下。

当我看fiddler的时候。 JSON 在那里。我如何获得它?

  1. 不要强求函数名。这是竞争条件的秘诀。删除 jsonpCallback: processDataIE。让 jQuery 确定函数名称。
  2. 不要从 URL 中删除回调参数。让服务器从查询字符串中读取 callback 以确定调用哪个函数。删除 jsonp: false,.
  3. 正常使用success功能。 (去掉processDataIE,就是success的意思)。

旁白:

crossDomain: true 毫无意义。它告诉 jQuery 当它使用 XHR(你不是)并且 URL 指向相同的来源(它不是)时,它不应该添加额外的 headers 以防服务器将 HTTP 重定向到不同的来源。

async: true 毫无意义。这是默认设置,无论如何 JSONP 请求只能是异步。

$.support.cors = true; 充其量是毫无意义的,而且可能是有害的。删除它。

不要覆盖 jQuery 对浏览器对 CORS 支持的检测。你不能通过对 jQuery 说谎来让旧浏览器支持 CORS。无论如何,您正在使用 JSONP,因此 CORS 无关紧要。


以上是合理、标准、稳健的解决方案。

如果您想要快速解决您在游戏中遇到的所有不良做法,那么只需查看 processDataIE 的第一个参数。