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);
引用最新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);
相关文章推荐
- jQuery .Ajax() 方法在IE浏览器返回No Transport错误原因?
- jQuery .Ajax() 方法在IE浏览器返回No Transport错误原因?
- ie9 jquery.ajax 返回异常No Transport
- IE浏览器下,ajax访问不生效或返回“No Transport”的问题
- Jquery.ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
- Jquery.ajax不能解析json对象,报Invalid JSON错误的原因和解决方法(转)
- Jquery.ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
- jQuery的Ajax接收java返回数据方法
- ASP.NET MVC2 AJAX调用JsonResult方法并返回自定义错误信息
- jquery中Uncaught TypeError: $(...).ajaxUpload is not a function(…)错误解决方法
- jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
- jquery中ajax方法返回的三种数据类型:text、json、xml;
- jquery ajax return没有返回值的解决方法
- jQuery中ajax请求后台返回json数据并渲染HTML的方法
- IE浏览器下jquery的ajax方法失效解决办法
- linux下system函数错误返回-1 错误原因NO child processes
- jquery ajax return没有返回值的解决方法
- linux下system函数错误返回-1 错误原因NO child processes