为什么不能触发ajaxsubmit 上传文件

本篇文章主要分享下在使用jquery&ajax时防止重复提交的办法,其实方法很简单,就是在用户点击了提交按钮之后将按钮设置为不可点击即可,具体代码如下:
1 $('#submit').click(function(){
2   var objButton=$(this);
3   var content=$('#content').val();
4   $.ajax({
5   url:web_url+'jquery.php',
6   type:'post',
7   cache:false,
8   data: 'action=submit&content='+content,
9   beforeSend:function(){//触发ajax请求开始时执行
10   objButton.val('提交中').attr('disabled',true);//改变提交按钮上的文字并将按钮设置为不可点击
12   success:function(txt){//ajax请求成功后执行
13   //这里做相关逻辑判断了,具体根据自己的情况看了
15   error:function(){//ajax发生错误时执行
16   alert('数据请求出错!');
18   complete:function(){//ajax请求完成时执行
19   objButton.val('提交').attr('disabled',false);//改变提交按钮上的文字并将按钮设置为可以点击
21   });
阅读(...) 评论()Jquery Ajax请求文件下载操作失败的原因分析及解决办法
字体:[ ] 类型:转载 时间:
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯,本文重点给大家介绍Jquery Ajax请求文件下载操作失败的原因分析及解决办法,对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!";
      
运行程序,结果如图:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具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 参数来获得更有用的错误消息。&&&&&&&&&&&
代码举例:
更多按钮:
&input&type="button"&class="addMore"&id="addMore${issue.id&}"&value="更多"&/&
点击按钮添加一行文本框和&提交&按钮:(没有问题,可以正常添加)
$(".addMore").click(function(){
& & & & var&index&=&this.id.substring(7,this.id.length);
& & & & //$("#tr"+index).clone().appendTo("#table"+index);
& & & & $("#table"+index).append("&tr&&td&&/td&"+
& & & &"&&td&&input&id='content'"+num&+&"&type=text& size=60/&&/td&"+
& & & & "&td&&input&id='date'"+num&+"&type=text&/&&/td&"+
& & & & "&td&&input&id='result'"+num+"&type=text&/&&/td&"+
& & & & "&td&&input&type=button&class='submitBtn'&id='addBtn'"+index&+"&value='提交'/&&/tr&");
所有&提交&按钮的点击事件:
& & & $(".submitBtn").click(function(){//初始化后添加的jQuery元素的click事件
& & & & &//议题的编号,也是text的index
& & & & &var&index&=&this.id.substring(6,this.id.length);
& & & & &alert("index="+index);
& & & & &var&content&=&$("#content"+index).val();
& & & & &var&date&=&$("#date"+index).val();
& & & & &var&result&=&$("#result"+index).val();
& & & & &//判断是否有空值
& & & & &if(content.length&!=&0&&&&date.length&!=&0&&&&result.length&!=&0&){
& & & & & & &$.ajax({
& & & & & & & & &url:"addIssueInfo",
& & & & & & & & &type:"post",
& & & & & & & & &data:&{issueContent:content,
& & & & & & & & & & & & &issueId:index,
& & & & & & & & & & & & &issueDate:date,
& & & & & & & & & & & & &issueResult:result},
& & & & & & & & &datatype:&"json",
& & & & & & & & &success:function(){
& & & & & & & & & & &alert("添加成功!");
& & & & & & & & & & &$tr&=&$("#addBtn"+index).parent("td").parent("tr");
& & & & & & & & & & &$tr.remove();
& & & & & & & & & & &//追加行
& & & & & & & & & & &$("#table"+index).append("&tr&&td&&/td&&td&"+content+"&/td&&td&"+date+"&/td&&td&"+result+"&/td&&td&&/td&&/tr&");&& & & & &&
& & & & & & & & &},error:function(){
& & & & & & & & & & &alert("服务器忙,请稍候再试!");
& & & & & & & & &}
& & & & & & &});
& & & & &}else{
& & & & & & &alert("对不起,当前行的每一条信息均不能为空,请补全后提交!");
& & & & &}
问题是,为什么点击&更多&触发的事件添加的文本框和&提交&按钮,这个按钮不执行class="submitBtn"的点击事件?
解决:在添加更多一行的时候所产生的 input 和 button 都是动态生成的,所以不能使用 click,要使用 live (jquery 1.7.2 之后的版本不建议使用 live) 或 on 把$(".submitBtn").click(function(){改为$(".submitBtn").live('click', function(){或者$(".submitBtn").on('click', function(){
记住如果元素在页面初始化的时候不存在,而是之后通过动态生成在页面中的,要对这些元素进行操作,例如 click, blur, keyup, change....,都要使用 on .on('click', function.on('blur', function.on('keyup', function ....
阅读(...) 评论()

我要回帖

更多关于 ajaxsubmit 上传文件 的文章

 

随机推荐