031-jQuery Ajax的ajax方法

1. $.ajax()方法通过HTTP请求加载远程数据。

2. $.ajax()方法是jQuery底层AJAX实现。简单易用的高层实现见$.get, $.post等。

3. $.ajax()方法返回其创建的XMLHttpRequest对象的超类。大多数情况下你无需直接操作该函数, 除非你需要操作不常用的选项, 以获得更多的灵活性。

4. 语法

$.ajax({name:value, name:value, ... })

5. 参数

6. 所有的选项都可以通过$.ajaxSetup()函数来全局设置。

7. 最简单的情况下, $.ajax()可以不带任何参数直接使用。不过, 我们最好设置一个url。

8. 参数详解

8.1. url

8.1.1. 类型: String

8.1.2. 默认值: 当前页地址。发送请求的地址。

8.2. type

8.2.1. 类型: String

8.2.2. 默认值: "GET"。请求方式("POST"或"GET")。注意: 其它HTTP请求方法, 如: PUT和DELETE也可以使用, 但仅部分浏览器支持。

8.3. data

8.3.1. 类型: String

8.3.2. 发送到服务器的数据。将自动转换为请求字符串格式。GET请求中将附加在URL后。查看processData选项说明以禁止此自动转换。必须为Key/Value格式。如果为数组, jQuery将自动为不同值对应同一个名称。如: {foo:["bar1", "bar2"]}转换为'&foo=bar1&foo=bar2'。

8.4. processData

8.4.1. 类型: Boolean

8.4.2. 默认值: true。默认情况下, 通过data选项传递进来的数据, 如果是一个对象(技术上讲只要不是字符串), 都会处理转化成一个字符串, 以配合默认内容类型"application/x-www-form-urlencoded"。如果要发送其它不希望转换的信息, 请设置为false, 在上传文件的时候它就是false

8.5. contentType

8.5.1. 类型: String/Boolean

8.5.2. 默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。默认值适合大多数情况。常用值还有一个"multipart/form-data", 在上传文件的时候就是这个值不过在上传文件的时候要设置成false, 服务器才认为是二进制信息。

8.6. dataType

8.6.1. 类型: String

8.6.2. 预期服务器返回的数据类型。如果不指定, jQuery将自动根据HTTP包MIME信息来智能判断, 比如: XML MIME类型就被识别为XML。JSON就会生成一个JavaScript对象, 而script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后, 传递给回调函数。可用值:

  • "text": 返回纯文本字符串
  • "json": 返回JSON数据 。
  • "html": 返回纯文本html信息; 包含的script标签会在插入dom时执行。
  • "xml": 返回XML文档, 可用jQuery处理。
  • "script": 返回纯文本JavaScript代码。不会自动缓存结果, 除非设置了"cache"参数。注意: 在远程请求时(不在同一个域下), 所有POST请求都将转为GET请求(因为将使用DOM的script标签来加载)。
  • "jsonp": JSONP格式。使用JSONP形式调用函数时, 如: "myurl?callback=?", jQuery将自动替换?为正确的函数名, 以执行回调函数。

8.7. async

8.7.1. 类型: Boolean

8.7.2. 默认值: true。默认设置下, 所有请求均为异步请求。如果需要发送同步请求, 请将此选项设置为false。注意, 同步请求将锁住浏览器, 用户其它操作必须等待请求完成才可以执行。

8.8. cache

8.8.1. 类型: Boolean

8.8.2. 默认值: true, dataType为script和jsonp时默认为false。设置为false将不缓存此页面。

8.9. jsonp

8.9.1. 类型: String

8.9.2. 在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分, 比如: {jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。

8.10. jsonpCallback

8.10.1. 类型: String

8.10.2. 为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery 生成度独特的函数名, 这样管理请求更容易, 也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候, 指定这个回调函数名。

8.11. username

8.11.1. 类型: String

8.11.2. 用于设置HTTP访问认证请求的用户名。

8.12. password

8.12.1. 类型: String

8.12.2. 用于设置HTTP访问认证请求的密码

8.13. timeout

8.13.1. 类型: Number

8.13.2. 设置请求超时时间(毫秒)。此设置将覆盖全局设置。

8.14. global

8.14.1. 类型: Boolean

8.14.2. 是否触发全局AJAX事件。默认值: true。设置为false将不会触发全局AJAX事件, 如: ajaxStart或ajaxStop可用于控制不同的Ajax事件。

8.15. ifModified

8.15.1. 类型: Boolean

8.15.2. 仅在服务器数据改变时获取新数据。默认值: false。使用HTTP包Last-Modified头信息判断。

8.16. context

8.16.1. 类型: Object

8.16.2. 这个对象用于设置Ajax相关回调函数的上下文。也就是说, 让回调函数内this指向这个对象(如果不设定这个参数, 那么this就指向调用本次AJAX请求时传递的options参数)。比如: 指定一个DOM 元素作为context参数, 这样就设置了success回调函数的上下文为这个DOM元素。

8.16.3. 就像这样:

$.ajax({url: "test.html", context: document.body, success: function(){
	$(this).addClass("done"); // this指的是body节点
}});

8.17. scriptCharset

8.17.1. 类型: String

8.17.2. 只有当请求时dataType为"jsonp"或"script", 并且type是"GET"才会用于强制修改charset。通常只在本地和远程的内容编码不同时使用。

8.18. traditional

8.18.1. 类型: Boolean

8.18.2. 如果你想要用传统的方式来序列化数据, 那么就设置为true。请参考工具分类下面的jQuery.param方法。

8.19. beforeSend(jqXHR,options)

8.19.1. 类型: Function

8.19.2. 发送请求前可修改XMLHttpRequest对象的函数, 如: 添加自定义HTTP头。

8.19.3. 第一个参数是XMLHttpRequest对象的超类。第二个参数是调用本次AJAX请求时传递的options参数。

8.19.4. 这是一个Ajax事件。如果返回false可以取消本次ajax请求。

8.20. xhr

8.20.1. 类型: Function

8.20.2. 需要返回一个XMLHttpRequest对象。用于重写或者提供一个增强的XMLHttpRequest对象。

8.21. dataFilter(response, dataType)

8.21.1. 类型: Function

8.21.2. 给Ajax返回的原始数据的进行预处理的函数。提供data和dataType两个参数。data是Ajax返回的原始数据, type是调用$.ajax()时提供的dataType参数。函数返回的值将由jQuery进一步处理。

8.21.3.

8.22. success(response,textStatus,jqXHR)

8.22.1. 类型: Function

8.22.2. 请求成功后的回调函数。

8.22.3. 第一个参数是由服务器返回的数据。第二个参数是描述状态的字符串。第三个参数是XMLHttpRequest对象超类

8.23. error(jqXHR,textStatus,error)

8.23.1. 类型: Function

8.23.2. 请求失败时调用此函数。

8.23.3. 有以下三个参数: XMLHttpRequest对象超类、描述错误状态的字符串(可能是"timeout", "error", "notmodified"和"parsererror"等)、捕获的异常对象。

8.24. complete(xhr,textStatus)

8.24.1. 类型: Function

8.24.2. 请求完成后回调函数(请求成功或失败之后均调用)。

8.24.3. 第一个参数是XMLHttpRequest对象超类。第二个参数是描述状态的字符串(可能是"success"等)。

9. 例子

9.1. 新建一个名为jQueryAjax动态WEB工程

9.2. 新建test.html

<!DOCTYPE html>
<html>
	<head>
		<title>测试文档</title>
		<meta charset="utf-8" />
	</head>
	<body> 
  		<h2>这是test.html文件中的h2</h2>
		<p id="p1">这是test.html文件中的p</p>
	</body>
</html>

9.3. 新建test.js

document.getElementById('result').innerHTML='我是服务器使用js返回的文本。';

9.4. 新建test.json

{"data": {"code": 1, "info": "success", "msg": "请求成功。"}}

9.5. 新建test.xml

<?xml version="1.0" encoding="UTF-8"?>
<data>
	<code>1</code>
	<info>success</info>
	<msg>请求成功。</msg>
</data>

9.6. 新建index.html

<!DOCTYPE html>
<html>
	<head>
		<title>jQuery-Ajax的Ajax()方法</title>
		<meta charset="utf-8" />

		<script type="text/javascript" src="jquery.js"></script>
		<script type="text/javascript">
			$(document).ready(function(){
				$('#btn1').click(function(){
					$.ajax({
						url: 'test.html',
						dataType: 'html',
						cache: true
					});
				});
				$('#btn2').click(function(){
					$.ajax({
						url: 'test.xml',
						dataType: 'xml',
						cache: false
					});
				});
				$('#btn3').click(function(){
					var fd = new FormData();
					fd.append("photo",$("#photo")[0].files[0]);
					fd.append("r", Math.random());
					
					$.ajax({
						url: 'UploadFile.action',
						type: 'post',
						data: fd,
						processData: false, // 必须有processData: false设置, 否则都没有请求, 设置为true也没有请求。
						contentType: false // 必须有contentType: false设置, 而且必须为false, 才能是multipart/form-data二进制的请求。
					});
				});
				$('#btn4').click(function(){
					$.ajax({
						url: 'JqueryAjax.action',
						dataType: 'script',
						data: {dataType: 'js'}
					});
				});
				$('#btn5').click(function(){
					var jqXHL = $.ajax({
						url: "JqueryAjax.action", 
						type: 'post', 
						data: {dataType: 'json'}, 
						processData: true, 
						dataType: 'json',
						async: true,
						timeout: 50000, 
						context: $("#result"),
						beforeSend: function(jqXHL,options){
							console.log('-------beforeSend Start-------------');
							for(var i = 0; i < arguments.length; i++){
								console.log(arguments[i]);
							}
							console.log('-------beforeSend End-------------');
						},
						xhr: function(){
							console.log('-------xhr Start-------------');
							console.log('-------xhr End-------------');
							var xhr = new XMLHttpRequest();
							return xhr;
						},
						dataFilter: function(response, dataType){
							console.log('-------dataFilter Start-------------');
							for(var i = 0; i < arguments.length; i++){
								console.log(arguments[i]);
							}		
							console.log('-------dataFilter End-------------');
							return response;
						},
						success: function(response,textStatus,jqXHL){
							console.log('-------success Start-------------');
							for(var i = 0; i < arguments.length; i++){
								console.log(arguments[i]);
							}	
							console.log('-------success End-------------');
							$(this).text(jqXHL.responseText);
						},
						error: function(jqXHL,textStatus,error){
							console.log('-------error Start-------------');
							for(var i = 0; i < arguments.length; i++){
								console.log(arguments[i]);
							}		
							console.log('-------error End-------------');
						},
						complete: function(jqXHL,textStatus){
							console.log('-------complete Start-------------');
							for(var i = 0; i < arguments.length; i++){
								console.log(arguments[i]);
							}
							console.log('-------complete End-------------');
						}						
					}); 
					
					console.log('jqXHL = ' + jqXHL);
				});
			});
		</script>
		<style type="text/css">
			div {
				width: 450px;
				height: 100px;
				background-color: pink;
			}
		</style>
	</head>
	<body> 
  		<div id="result">结果区域</div><br />
  		<button id="btn1">使用缓存的test.html</button> <button id="btn2">不使用缓存的test.xml</button><br /><br />
  		<input type="file" id="photo" placeholder="免冠照片" /><button id="btn3">上传文件</button> <br /><br />
  		<button id="btn4">获取test.js</button> <button id="btn5">回调函数</button>
	</body>
</html>

9.7. 新建JqueryAjax.java

package com.rjbd.ja;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class JqueryAjax extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String dataType = req.getParameter("dataType");
		
		FileReader fr = new FileReader(getServletContext().getRealPath("test." + dataType));
		BufferedReader br = new BufferedReader(fr);
		
		StringBuffer sb = new StringBuffer();
		String result = null;
		while((result = br.readLine()) != null) {
			sb.append(result);
		}
		br.close();
		fr.close();
		
		if("js".equals(dataType)) {
			dataType = "javascript";
		}
		// 响应客户端的内容类型是text/html 编码是UTF-8(包含字符编码和网页编码)
		resp.setContentType("text/" + dataType + ";charset=UTF-8");
		resp.getWriter().write(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

9.8. 新建UploadFile.java

package com.rjbd.ja;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadFile extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 创建一个磁盘文件的工厂, 然后将它 传递到servletFileUplaod的实例中
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

		// 根据request对象获取所有的文件集合, 这里包括input标签输入的值也属于FileInput
		try {
			List<FileItem> fileItemList = servletFileUpload.parseRequest(req);
			Iterator<FileItem> iterator = fileItemList.iterator();
			
			while (iterator.hasNext()) {
				FileItem fileItem = (FileItem) iterator.next();
				if (fileItem.isFormField()) { // 是否是表单提交域, 可以分区是否上传的附件
					String name = fileItem.getFieldName(); // input标签的name
					String value = fileItem.getString(); // input表单的value

					System.out.println("name = " + name + ", value= " + value);
				} else {
					String fieldName = fileItem.getFieldName(); // 表单提交过来的file input标签中name的属性值
					String fileName = fileItem.getName(); // file input上传的文件名
					String contentType = fileItem.getContentType(); // 获得上传文件的类型
					long size = fileItem.getSize(); // 上传文件的大小

					String filePath = getServletContext().getRealPath("/") + fileName;
					File saveFile = new File(filePath);
					fileItem.write(saveFile); // 将文件写入磁盘中
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

9.9. 修改web.xml

9.10. 导入commons-fileupload-1.4.jar和commons-io-2.8.0.jar做文件上传使用

9.11. 运行项目

9.12. 使用缓存的test.html

9.13. 不使用缓存的test.xml

9.14. 上传文件

9.15. 运行脚本

9.16. 回调函数

猜你喜欢

转载自blog.csdn.net/aihiao/article/details/112396902