您的位置:首页 > Web前端 > JQuery

jQuery .Ajax() 方法在IE浏览器返回No Transport错误原因?

2011-07-19 10:48 441 查看
在开发环境一切正常,部署至Product Server之后才发现如此错误,昨夜为此烦恼至今日凌晨1:30,经过比对分析,终于发现这是个Cross Site Script问题,即cross-site HTTP Request(跨站点Http请求)引起的。

引用最新jquery-1.6.2.min.js , 我们在.Ajax()方法里面异步调用了另一个Site的.aspx文件,打算返回一个系统生成的编号,在所有IE6-IE9浏览器均提示“ No Transport “,在Firefox浏览器却能够成功执行到Success返回 ,  网上许多朋友提出例如 在.Ajax()定义前设置jQuery.Support.Cors = true , 经验证至少在 jquery-1.6.2.min.js 版本不可行;其他还有例如采用jQuery plugin 插件,在.Ajax()执行完毕之前让其它button等触发事件暂停等待,这种方法对我们这种情况不可用。

怎样处理呢? 目前的处理方法一种是采用JSONP可以解决,或者把被调用的.aspx 文件部署在同一个Domain下,同一个站点的不同虚拟目录也是可以的。

提供测试脚本如下:

        var _url = "http://www.***.net/query.aspx?id=123789";

        $.ajax({

            type: "Get",

            url: _url,

            success: function(response) {

                if (response.toString() != "") {

            ...

                }

            },

        timeout:30000,

        error: function (XMLHttpRequest, txtStatus, errorThrown)

        {

            alert(txtStatus);

        }

        });

/*******************************************

// 2011-11-15 补充

// 关于解决类似问题的思路

//
关于Cross-site-scripting

// 关于JSONP

*******************************************/

有一位James Padolsey的朋友似乎通过重构.ajax方法解决了这个问题,如有兴趣可以去看他的原文,源码也贴在这里。

/**

 * jQuery.ajax mid - CROSS DOMAIN AJAX

 * ---

 * @author James Padolsey (http://james.padolsey.com)

 * @version 0.11

 * @updated 12-JAN-10

 * ---

 * Note: Read the README!

 * ---

 * @info http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/
 */

jQuery.ajax = (function(_ajax){

    

    var protocol = location.protocol,

        hostname = location.hostname,

        exRegex = RegExp(protocol + '//' + hostname),

        YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',

        query = 'select * from html where url="{URL}" and xpath="*"';

    

    function isExternal(url) {

        return !exRegex.test(url) && /:\/\//.test(url);

    }

    

    return function(o) {

        

        var url = o.url;

        

        if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) ) {

            

            // Manipulate options so that JSONP-x request is made to YQL

            

            o.url = YQL;

            o.dataType = 'json';

            

            o.data = {

                q: query.replace(

                    '{URL}',

                    url + (o.data ?

                        (/\?/.test(url) ? '&' : '?') + jQuery.param(o.data)

                    : '')

                ),

                format: 'xml'

            };

            

            // Since it's a JSONP request

            // complete === success

            if (!o.success && o.complete) {

                o.success = o.complete;

                delete o.complete;

            }

            

            o.success = (function(_success){

                return function(data) {

                    

                    if (_success) {

                        // Fake XHR callback.

                        _success.call(this, {

                            responseText: data.results[0]

                                // YQL screws with <script>s

                                // Get rid of them

                                .replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')

                        }, 'success');

                    }

                    

                };

            })(o.success);

            

        }

        

        return _ajax.apply(this, arguments);

        

    };

    

})(jQuery.ajax);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息