jquery ajax401 什么原因纯ajax跨域的解决办法法

jQuery ajax设置全局错误处理 - 陈增华 - ITeye技术网站
博客分类:
$(function(){
// 设置jQuery Ajax全局的参数
$.ajaxSetup({
type: "POST",
error: function(jqXHR, textStatus, errorThrown){
switch (jqXHR.status){
case(500):
alert("服务器系统内部错误");
case(401):
alert("未登录");
case(403):
alert("无权限执行此操作");
case(408):
alert("请求超时");
alert("未知错误");
success: function(data){
alert("操作成功");
chenzenghua
浏览: 31001 次
来自: 北京
第一个serialize很有用。
jQuery.uniqueArray
未定义。。。
果断大牛。。。jQuery ajax - ajaxError() 方法
jQuery ajax - ajaxError() 方法
当 AJAX 请求失败时,触发提示框:
$(&div&).ajaxError(function(){
alert(&An error occurred!&);
定义和用法
ajaxError() 方法在 AJAX 请求发生错误时执行函数。它是一个 Ajax 事件。
.ajaxError(function(event,xhr,options,exc))
function(event,xhr,options,exc)
必需。规定当请求失败时运行的函数。
额外的参数:
event - 包含 event 对象
xhr - 包含 XMLHttpRequest 对象
options - 包含 AJAX 请求中使用的选项
exc - 包含 JavaScript exception
XMLHttpRequest 对象和设置作为参数传递给回调函数。捕捉到的错误可作为最后一个参数传递:
function (event, XMLHttpRequest, ajaxOptions, thrownError) {
// thrownError 只有当异常发生时才会被传递
亲自试一试 - 实例
如何使用 options 参数来获得更有用的错误消息。Jquery Ajax请求文件下载操作失败的原因分析及解决办法-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
Jquery Ajax请求文件下载操作失败的原因分析及解决办法
来源:互联网 发表时间: 10:25:47 责任编辑:王亮字体:
为了帮助网友解决“Jquery Ajax请求文件下载操作失败的原因分析及解决办法”相关的问题,学网通过互联网对“Jquery Ajax请求文件下载操作失败的原因分析及解决办法”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:Jquery Ajax请求文件下载操作失败的原因分析及解决办法,具体解决方案如下:解决方案1:jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。 废话少说,直接进入正题,我们先来分析一下失败的原因 一、失败的原因 那是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。 二、解决方案 1)可以使用jquery创建表单并提交实现文件下载; var form = $("&form&"); form.attr("style","display:none"); form.attr("target",""); form.attr("method","post"); form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do"); var input1 = $("&input&"); input1.attr("type","hidden"); input1.attr("name","strZipPath"); input1.attr("value",strZipPath); $("body").append(form); form.append(input1); form.submit(); form.remove(); 2)可以直接使用a标签实现文件下载; &a href=”下载地址”&点击下载&/a& 3)使用隐藏iframe或新窗体解决。 PS:AJAX请求 $.ajax方法的使用 使用jQuery的$.ajax方法可以更为详细的控制AJAX请求。它在AJAX请求上施加细粒度级别的控制。 $.ajax方法语法
$.ajax(options) 参数 & options (对象)一个对象的实例,其属性定义这个操作的参数。详情见下表。 返回值 XHR实例
options详细范围值
名称 类型 描述 url 字符串 请求的url地址 type 字符串 将要使用的HTTP方法。通常是POST或GET。如果省略,则默认为GET data 对象 一个对象,其属性作为查询参数而传递请求。如果是GET请求,则把数据作为查询字符串传递;如果是POST请求,则把数据作为请求体传递。在这两种情况下,都是由$.ajax()实用工具函数来处理值的编码 dataType 字符串 一个关键字,用来标识预期将被响应所返回的数据的类型。这个值决定再把数据传递给回调函数之前(如果有)进行什么后续处理。有效值如下: xml-响应文本被解析为XML文档,而作为结果的XML DOM被传递给回调函数 html-响应文本未经处理就被传递给回调函数。在已返回HTML片段内的任何&script&块将被求值 json-响应文本被求值为JSON字符串,而作为结果的对象被传递给回调函数 jsonp-与json相似,不同之处是提供远程脚本支持(假定远程服务器支持) script-响应文本被传递给回调函数。在任何回调函数被调用之前,响应被作为一个或多个JavaScript语句而进行处理 text-响应文本被假定为普通文本。服务器资源负责设置适当的内容类型响应标头。如果省略这个属性,则不对响应文本进行任何处理或求值就传递给回调函数 timeout 数值 设置Ajax请求的超时值(毫秒)。如果请求在超时值到期之前仍未完成,则中止请求并且调用错误回调函数(如果已定义) global 布尔型 启用或禁用全局函数的触发。这些函数可以附加到元素上,并且在Ajax调用的不同时刻或状态下触发。默认启用全局函数触发 contentType 字符串 将要在请求上指定的内容类型。默认为application/x-www-form-urlencoded(与表单提交所使用的默认类型相同) success 函数 如果请求的响应指示成功状态码,则这个函数被调用。响应体作为第一个参数被返回给这个函数,并且根据指定的dataType属性进行。第二个参数是包含状态码的字符串―这种情况下永远为成功状态码 error 函数 如果请求的响应返回错误状态码,则这个函数被调用。三个实参被传递给这个函数:XHR实例、状态消息字符串(在这种情况下永远为错误状态码)以及XHR实例所返回的异常对象(可选) complete 函数 请求完成时被调用。两个实参被传递:XHR实例和状态消息字符串(成功状态码或错误状态码)。如果也指定了success或error回调函数,则这个函数在success或error回调函数调用之后被调用 beforeSend 函数 在发起请求之前被调用。这个函数被传递XHR实例,并且可以用来设置自定义的标头或执行其他预请求操作 async 布尔型 如果指定为false,则请求被提交为同步请求。在默认的情况下,请求是异步的 processData 布尔型 如果设置为false,则阻止已传递数据被加工为URL编码格式。默认情况下,数据被加工为URL编码格式(适用于类型为application/x-www-form-urlencoded的请求) ifModified 布尔型 如果设置为true,则自从上一次请求以来,只有在响应内容没有改变的情况下(根据Last-Modified标头)才允许请求成功。如果省略,则不执行标头检查
下面看个例子,尽可能多的用到options中的选项 客户端代码: &html xmlns="/http://www.w3.org/1999/xhtml"& &head& &title&&/title& &script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"&&/script& &script type="text/javascript"& $().ready(function () {   $('#selectNum').change(function () {     var idValue = $(this).val();     var show = $('#show');     $.ajax({       url: 'Server.aspx',       type: 'POST',       data: { id: idValue },       //调小超时时间会引起异常       timeout: 3000,       //请求成功后触发       success: function (data) { show.append('success invoke!' + data+'&br/&'); },       //请求失败遇到异常触发       error: function (xhr, errorInfo, ex) { show.append('error invoke!errorInfo:' + errorInfo+'&br/&'); },       //完成请求后触发。即在success或error触发后触发       complete: function (xhr, status) { show.append('complete invoke! status:' + status+'&br/&'); },       //发送请求前触发       beforeSend: function (xhr) {       //可以设置自定义标头       xhr.setRequestHeader('Content-Type', 'application/charset=utf-8');       show.append('beforeSend invoke!' +'&br/&');       },       //是否使用异步发送       async: true     })   }); }) &/script& &/head& &body& &select id="selectNum"&   &option value="0"&--Select--&/option&   &option value="1"&1&/option&   &option value="2"&2&/option&   &option value="3"&3&/option& &/select& &div id="show"&&/div& &/body& &/html& 服务端主要代码: protected void Page_Load(object sender, EventArgs e) {   if (!Page.IsPostBack)   {     if (Request["id"] != null && !string.IsNullOrEmpty(Request["id"].ToString()))     {       //启用该句会引发ajax超时异常       // System.Threading.Thread.Sleep(3000);       Response.Write(GetData(Request["id"].ToString()));     }   } } protected string GetData(string id) {   string str = string.E   switch (id)   {     case "1":       str += "This is Number 1";            case "2":       str += "This is Number 2";            case "3":       str += "This is Number 3";            default:       str += "Warning Other Number!";          }    } 运行程序,结果如图: 学网
1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号  俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下。
  事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责获取数据,然后把数据return。基本的逻辑剥离出来是这样的:
function getData1(){
url : 'p.php',
async : false,
success: function(data){
  这里的ajax不能用异步的,否则函数返回时,result还未赋值,会出错。所以我加了async:false。看起来好像没什么问题。我调用这个函数可以正常的得到数据。
$('.btn1').click(function(){
var data = getData1();
alert(data);
  接下来,要加另外一个功能,由于ajax请求有一定的耗时,所以我需要在发出请求前页面有个loading效果,即显示一张&正在加载&的gif图片,想必大家也都见过。所以我的处理函数就变成了这样:
$('.btn1').click(function(){
$('.loadingicon').show();
var data = getData1();
$('.loadingicon').hide();
alert(data);
  请求之前显示loading图片,请求完成后把它隐藏。看起来也没什么问题。为了看清效果,我的p.php代码sleep了3秒,如下:
echo ('aaaaaa');
  但是我运行的时候问题出现了,我点击按钮并未像预想的那样出现这个loading图片,页面什么反应也没有。排除良久找到了原因,就在async:false这里。
  浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会&迅速&将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。
setTimeout解决阻塞问题
  既然明白了问题在哪里,我们就来针对性想办法。为了不让同步ajax请求阻塞线程,我想到了setTimeout,把请求的代码放到sestTimeout中,让浏览器重启一个线程来操作,不就解决问题了吗?于是乎,我的代码就变成了这样:
$('.btn2').click(function(){
$('.loadingicon').show();
setTimeout(function(){
url : 'p.php',
async : false,
success: function(data){
$('.loadingicon').hide();
alert(data);
  setTimeout的第二个参数设为0,浏览器会在一个已设的最小时间后执行。不管三七二十一先运行起来看看。
  结果loading图片显示出来了,但是!!!图片怎么不动呢,我明明是一张动态gif图。这个时候我很快就想到了,虽然同步请求延迟执行了,但是它执行期间还是会把UI线程给阻塞。这个阻塞相当牛逼,连gif图片都不动了,看起来像一张静态图片一样。
  结论很明显,setTimeout治标不治本,相当于把同步请求&稍稍&异步了一下,接下来还是会进入同步的噩梦,阻塞线程。方案失败。
是时候用Deferred了
  jQuery在1.5版本之后,引入了Deferred对象,提供的很方便的广义异步机制。详情可参看阮一峰老师的这篇文章。
  于是我用Deferred对象改写了代码,如下:
function getData3(){
var defer = $.Deferred();
url : 'p.php',
//async : false,
success: function(data){
defer.resolve(data)
return defer.promise();
$('.btn3').click(function(){
$('.loadingicon').show();
$.when(getData3()).done(function(data){
$('.loadingicon').hide();
alert(data);
  可以看到我在ajax请求中去掉了async:false,也就是说,这个请求又是异步的了。另外请注意success函数中的这一句:defer.resolve(data),Deferred对象的resolve方法可传入一个参数,任意类型。这个参数可以在done方法中拿到,所以我们异步请求来的数据就可以以这样的方式来返回了。
  至此,问题得到了解决。Deferred对象如此强大且方便,我们可以好好利用它。
  我的全部测试代码如下,有意的同学可以拿去测一下:
&button class="btn1"&async:false&/button&
&button class="btn2"&setTimeout&/button&
&button class="btn3"&deferred&/button&
&img class="loadingicon" style="position:left:50%;top:50%;margin-left:-16margin-top:-16display:" src="loading2.gif" alt="正在加载" /&
function getData1(){
url : 'p.php',
async : false,
success: function(data){
$('.btn1').click(function(){
$('.loadingicon').show();
var data = getData1();
$('.loadingicon').hide();
alert(data);
$('.btn2').click(function(){
$('.loadingicon').show();
setTimeout(function(){
url : 'p.php',
async : false,
success: function(data){
$('.loadingicon').hide();
alert(data);
function getData3(){
var defer = $.Deferred();
url : 'p.php',
//async : false,
success: function(data){
defer.resolve(data)
return defer.promise();
$('.btn3').click(function(){
$('.loadingicon').show();
$.when(getData3()).done(function(data){
$('.loadingicon').hide();
alert(data);
});&/script&
PS:Firefox有做优化?
  上述问题在chrome和IE9中测试结论一致。但是我在Firefox中测试时,同步ajax并未阻塞掉UI线程,也就是说这个问题根本不存在。我用其他代码做了测试,在Firefox中js线程确实是会阻塞UI线程,这个没有疑问。那可能的一个猜测就是Firefox对同步ajax做了优化,事实到底是什么,我暂未得知。有高人知道还请指点。
阅读(...) 评论()Jquery Ajax请求文件下载操作失败的原因分析及解决办法_管理资源吧
&&&&&&&&&&&&
Jquery Ajax请求文件下载操作失败的原因分析及解决办法
  jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。
  废话少说,直接进入正题,我们先来分析一下失败的原因
  一、失败的原因
  那是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
  二、解决方案
  1)可以使用jquery创建表单并提交实现文件下载;
var form = $("&form&");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
var input1 = $("&input&");
input1.attr("type","hidden");
input1.attr("name","strZipPath");
input1.attr("value",strZipPath);
$("body").append(form);
form.append(input1);
form.submit();
form.remove();
  2)可以直接使用a标签实现文件下载;
  &a href=”下载地址”&点击下载&/a&
  3)使用隐藏iframe或新窗体解决。
  PS:AJAX请求 $.ajax方法的使用
  使用jQuery的$.ajax方法可以更为详细的控制AJAX请求。它在AJAX请求上施加细粒度级别的控制。
  $.ajax方法语法
$.ajax(options)
(对象)一个对象的实例,其属性定义这个操作的参数。详情见下表。
  options详细范围值
请求的url地址
将要使用的HTTP方法。通常是POST或GET。如果省略,则默认为GET
一个对象,其属性作为查询参数而传递请求。如果是GET请求,则把数据作为查询字符串传递;如果是POST请求,则把数据作为请求体传递。在这两种情况下,都是由$.ajax()实用工具函数来处理值的编码
一个关键字,用来标识预期将被响应所返回的数据的类型。这个值决定再把数据传递给回调函数之前(如果有)进行什么后续处理。有效值如下:
xml-响应文本被解析为XML文档,而作为结果的XML DOM被传递给回调函数
html-响应文本未经处理就被传递给回调函数。在已返回HTML片段内的任何&script&块将被求值
json-响应文本被求值为JSON字符串,而作为结果的对象被传递给回调函数
jsonp-与json相似,不同之处是提供远程脚本支持(假定远程服务器支持)
script-响应文本被传递给回调函数。在任何回调函数被调用之前,响应被作为一个或多个JavaScript语句而进行处理
text-响应文本被假定为普通文本。服务器资源负责设置适当的内容类型响应标头。如果省略这个属性,则不对响应文本进行任何处理或求值就传递给回调函数
设置Ajax请求的超时值(毫秒)。如果请求在超时值到期之前仍未完成,则中止请求并且调用错误回调函数(如果已定义)
启用或禁用全局函数的触发。这些函数可以附加到元素上,并且在Ajax调用的不同时刻或状态下触发。默认启用全局函数触发
contentType
将要在请求上指定的内容类型。默认为application/x-www-form-urlencoded(与表单提交所使用的默认类型相同)
如果请求的响应指示成功状态码,则这个函数被调用。响应体作为第一个参数被返回给这个函数,并且根据指定的dataType属性进行。第二个参数是包含状态码的字符串―这种情况下永远为成功状态码
如果请求的响应返回错误状态码,则这个函数被调用。三个实参被传递给这个函数:XHR实例、状态消息字符串(在这种情况下永远为错误状态码)以及XHR实例所返回的异常对象(可选)
请求完成时被调用。两个实参被传递:XHR实例和状态消息字符串(成功状态码或错误状态码)。如果也指定了success或error回调函数,则这个函数在success或error回调函数调用之后被调用
beforeSend
在发起请求之前被调用。这个函数被传递XHR实例,并且可以用来设置自定义的标头或执行其他预请求操作
如果指定为false,则请求被提交为同步请求。在默认的情况下,请求是异步的
processData
如果设置为false,则阻止已传递数据被加工为URL编码格式。默认情况下,数据被加工为URL编码格式(适用于类型为application/x-www-form-urlencoded的请求)
ifModified
如果设置为true,则自从上一次请求以来,只有在响应内容没有改变的情况下(根据Last-Modified标头)才允许请求成功。如果省略,则不执行标头检查
  下面看个例子,尽可能多的用到options中的选项
  客户端代码:
&html xmlns="http://www.w3.org/1999/xhtml"&
&title&&/title&
&script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"&&/script&
&script type="text/javascript"&
$().ready(function () {
  $('#selectNum').change(function () {
    var idValue = $(this).val();
    var show = $('#show');
    $.ajax({
      url: 'Server.aspx',
      type: 'POST',
      data: { id: idValue },
      //调小超时时间会引起异常
      timeout: 3000,
      //请求成功后触发
      success: function (data) { show.append('success invoke!' + data+'&br/&'); },
      //请求失败遇到异常触发
      error: function (xhr, errorInfo, ex) { show.append('error invoke!errorInfo:' + errorInfo+'&br/&'); },
      //完成请求后触发。即在success或error触发后触发
      complete: function (xhr, status) { show.append('complete invoke! status:' + status+'&br/&'); },
      //发送请求前触发
      beforeSend: function (xhr) {
      //可以设置自定义标头
      xhr.setRequestHeader('Content-Type', 'application/charset=utf-8');
      show.append('beforeSend invoke!' +'&br/&');
      },
      //是否使用异步发送
      async: true
    })
&select id="selectNum"&
  &option value="0"&--Select--&/option&
  &option value="1"&1&/option&
  &option value="2"&2&/option&
  &option value="3"&3&/option&
&div id="show"&&/div&
  服务端主要代码:
protected void Page_Load(object sender, EventArgs e)
  if (!Page.IsPostBack)
    if (Request["id"] != null && !string.IsNullOrEmpty(Request["id"].ToString()))
      //启用该句会引发ajax超时异常
      // System.Threading.Thread.Sleep(3000);
      Response.Write(GetData(Request["id"].ToString()));
protected string GetData(string id)
  string str = string.E
  switch (id)
    case "1":
      str += "This is Number 1";
      
    case "2":
      str += "This is Number 2";
      
    case "3":
      str += "This is Number 3";
      
    default:
      str += "Warning Other Number!";
      
  运行程序,结果如图:}

我要回帖

更多关于 js ajax跨域解决办法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信