概念:
在传统的Web应用中,每次请求服务器都会生成新的页面,用户在提交请求后,总是要等待服务器的响应,如果
前一个请求没有得到响应,则后一个请求就不能发送。由于这是一种独占式的请来,因此如果服务器响应没有结
束,用户就只能等待或者不断地剧新页面。在等待期间,由于新的页面没有生成,整个浏览器将是一片空白,而用
户只能继续等待。对于用户而言,这是一种不连续的体验 同时,频繁地剧新页面也会使服务器的负担加重。
AX技术正是为了弥补以上不足而诞生的。Alax 应用使用JavaScript异步发送请求,不用每次请求都重新加载页
面,发送请求时可以继续其他的操作,在服务器响应完成后,再使用javaScript将响应展示给用户。
使用Ajax技术从用户发送请求到获得响应,当前用户界面在整个过程中不会受到干扰而且我们可以在必要的时
候只更新页面的一小部分,而不用刷新整个页面,即“无刷新”技术
问题:
传统的Web 开发技术和Ajax 技术有什么区别?
解答:
无论使用哪种开发技术,流程都是先由客户端发送HTTP 请求,然后由服务器对请求生成响应。但传统的Web 开
发技术和Ajax 技术之间还是存在很多差异的。
差异1: 发送请求方式不同。
传统Web 应用通过浏览器发送请求,而Ajax 技术则是通过JavaScript 的 XMLHttpRequest 对象。
差异2: 服务器响应不同。
针对传统Web 应用,服务器的响应是一个完整的页面,而采用Ajax 技术后服务器的响应只是需要的数据。
差异3: 客户端处理的响应方式不同。
传统的web应用发送请求后,浏览器将等待服务器响应完成后重新加载整个页面。而采用Aiax技术后,浏览器不
再空用等待请求的响应,而只是通过javaScript动态更新页面中需要更新的部分
Ajax简介
Ajax技术的主要开发语言:
1、javaScript:Ajax技术的主要开发语言
2、XML/JSON/HTML等:用来封装请求或响应的数据格式
DOM(文档对象模型):通过DOM属性或方法修改页面元素,实现页面局部刷新
CSS:改变样式,美化页面效果,提升用户体验度
Ajax引擎:即XMLHTTPRequest对象,以异步方式在客户端与服务器之间传递数据
XMLHTTPRequest
1、创建XMLHTTPRequest对象
语法:
老版本IE(IE5 和 IE6)
XMLHTTPRequest =new ActiveXObect("Microsoft.XMLHTTP");
新版本(推荐使用)
XMLHTTPRequest = new XMLHTTPRequest ();
2、XMLHTTPRequest对象常用属性和方法
方法名称 | 说明 |
---|---|
open( String method, String url, boolean async, String user, String password ) | 用于创建一个新的HTTP请求 参数:method:设置HTTP请求方式,如 POST、get 等,对大小写不敏感 参数 url:请求的URL地址 参数:async :可选,指定此请求是否为异步方法,默认为true 参数 user:可选,如果服务器需要验证,此处需要指定用户名:否则会弹出验证窗口 参数password:可选,验证信息中的密码,如果用户名为空,此值将被忽略 |
send( String data ) | 发送请求到服务器端 参数data:字符串类型,通过此请求发送的数据。此参数数值取决于open方法中的method参数。method值为post,可以指定参数。get为null |
abort( ) | 取消当前请求 |
setRequestHeader( String header, String value ) | 单独设置请求的某个HTTP头信息 参数 header:要指定的HTTP头名称 参数value:要指定的HTTP头名称所对应的值 |
getResponseHeader(String header) | 从响应的所有HTTP头信息 参数header:要获取的指定HTTP头 |
getAllResponseHeader( ) | 获取响应的所有HTTP头信息 |
onreadystatechange | 指定回调函数 |
readyState | 返回请求的当前状态: 常用值: 0:XMLHttpRequest对象未完成初始化 1:XMLHttpRequest对象开始发送请求 2:XMLHttpRequest对象的请求发送完成 3:XMLHttpRequest对象开始读取响应 4:XMLHttpRequest对象读取响应结束 |
status | HTTP的状态码 常用值: 200:服务器正确返回响应 404:请求的资源不存在 500:服务器内部错误 403:没有访问权限 |
statusText | 返回当前请求的响应行状态 |
responseText | 以文本形式获得响应的内容 |
responseXML | 将XML格式的响应内容解析成 DOM对象返回 |
小案例:问题分析:
实现无刷新用户名验证
当用户名文本框失去焦点时,发送请求到服务器,判断用户名是否存在
如果已经存在提示 “用户名已被使用”,如果不存在则提示 “用户名可以使用”
不实现提交:只做判断
参考代码:
body:主页面代码
注:使用jQuery需要先引用架包
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="../jar/jquery-1.12.4.js"></script>
<script type="text/javascript" src="../js/User_GET.js"></script>
<title>用户注册</title>
</head>
<body>
<form action="" method="post" name="myform">
<p>
注册邮箱:<input type="email" name="userEmail" id="userEmail"> <span
id="errorEmail"></span>
</p>
<p>
用户名:<input type="text" name="userName" id="userName">
</p>
<p>
密码:<input type="password" name="userPwd" id="userPwd">
</p>
<p>
确认密码:<input type="password" name="renPwd" id="renPwd">
</p>
<input type="submit" name="submit" id="submit" value="提交">
</form>
</body>
</html>
js代码:给用户名框注册鼠标离开事件
$(function(){
//邮箱文本框失去焦点事件
$("#userEmail").blur(function(){
//获取用户输入的邮箱
var email=$("#userEmail").val();
if(email==null||email=="")
{
$("#errorEmail").text("邮箱不能为空");
}else{
//1.创建XMLHttpRequest对象
var req=xmlHttpRequest();
//2.设置回调函数
req.onreadystatechange=callBack;
/**
* 3.初始化XMLHttpRequest组件
* 服务器端URL地址,name为用户名文本框获取的值
*/
var url="/jsp_day10/userInfo?email="+email;
req.open("GET",url,true);
//4.发送请求
req.send(null);
//5.回调函数
function callBack()
{
//判断返回请求的状态
if(req.readyState==4&&req.status==200)
{
var date=req.responseText;
alert(date);
if(date=="true")
{
$("#errorEmail").text("邮箱已注册");
$("#errorEmail").css("color","red");
}else if(date=="false"){
$("#errorEmail").text("邮箱可以使用");
$("#errorEmail").css("color","#00FF00");
}
}
}
}
});
function xmlHttpRequest()
{
if(window.XMLHttpRequest)
{
return new XMLHttpRequest();
}else{
return new ActiveXObect("Microsoft.XMLHTTP");
}
}
});
Servlet类:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class userInfo
*/
@WebServlet("/userInfo")
public class userInfo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public userInfo() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//指定编码格式
request.setCharacterEncoding("UTF-8");
//获取请求的值
String email=request.getParameter("email");
//模拟邮箱用户成员
//Map<String,String> list=new HashMap<String,String>();
List<String> list=new ArrayList<String>();
list.add("[email protected]");
list.add("[email protected]");
list.add("[email protected]");
//标识是否存在该邮箱
boolean flag=false;
//判断输入的邮箱是否存在
if(list.contains(email))
{
flag=true;//重新赋值
}
response.setContentType("text/html;charset=UTF-8");
//向页面相应数据
PrintWriter out=response.getWriter();
out.print(flag);
//刷新缓冲区
out.flush();
//关闭out
out.close();
}
}
以上是get 请求模式:
修改代码为 post:只修改改动js代码,第三步和第四部
GET请求和POST请求的区别
使用jQuery实现Ajax
1、传统方式实现Ajax的不足步骤繁琐,方法、属性、常用值较多不好记忆,处理复杂结构的响应数据
(如XML格式)比较烦琐,浏览器兼容问题
语法:
$ . ajax([setting]);
参数setting 是$ . ajax()方法的参数列表,用于配置Ajax请求的键值对集合。常用配置参数如下:
url | String | 发送请求的地址,默认为当前页地址 |
type | String | 请求方式,默认为GET |
data | PlainObject 或 String 或 Array |
发送到服务器的数据 |
dataType | String | 预期服务器返回的数据类型,包括:XML、HTML、Script、JSON、JSONP、text |
timeout | Number | 设置请求超时时间 |
global | Boolean | 表示是否触发全局Ajax事件,默认为true |
beforeSend | Function ( jqXHR jqxhr, PlainObject settings ) |
发送请求前调用的函数,可用于设置请求头等,返回false将终止请求 参数:jqxhr:可选,jqXHR是XMLHTTPRequest的超集。 参数:setting:可选当前Ajax()方法的setting对象 |
success | Function( 任意类型 result, String textStatus, jqXHR jqxhr ) |
请求成功后调用的函数 参数result:可选,由服务器返回的数据 参数:textStatus:可选,描述请求状态的字符串 参数,jqxhr:可选 |
error | Function ( jqXHR jqxhr, String textStatus, String errorThrown ) |
请求失败时调用的函数 参数,jqxhr:可选 参数,textStatus:可选,错误信息 参数:errorThrown :可选,文本描述的HTTP状态 |
complete | Function ( jqXHR jqxhr, String textStatus ) |
请求完成后(无论成功还是失败)调用的函数 参数:jqxhr:可选 参数:textStatus:可选,描述请求状态的字符串 |
与上述同样的问题:使用$ . ajax() 实现
js代码:get请求
$(function(){
//邮箱文本框失去焦点事件
$("#userEmail").blur(function(){
//获取用户输入的邮箱
var email=$("#userEmail").val();
if(email==null||email=="")
{
$("#errorEmail").text("邮箱不能为空");
}else{
$.ajax({
"url":"/jsp_day10/userInfo",//要提交的URl路径
"type":"GET",//发送的请求方式
"data":"email="+email,//要发送到服务器的数据
//"data":{"email":email},
"dataType":"text",//指定返回的数据格式
"success":function(data)//响应成功后要执行的代码:data入参表示响应结果
{
if(data=="true")
{
$("#errorEmail").text("邮箱已注册");
$("#errorEmail").css("color","red");
}else
{
$("#errorEmail").text("邮箱可以使用");
$("#errorEmail").css("color","#00FF00");
}
},
"error":function()//请求失败后要执行的代码
{
alert("用户ing验证错误,请稍后再试或与管理员联系!!!");
}
});
}
});
});
POST请求:没有什么太大区别
$(function(){
//邮箱文本框失去焦点事件
$("#userEmail").blur(function(){
//获取用户输入的邮箱
var email=$("#userEmail").val();
if(email==null||email=="")
{
$("#errorEmail").text("邮箱不能为空");
}else{
$.ajax({
"url":"/jsp_day10/userInfo",//要提交的URl路径
"type":"POST",//发送的请求方式
//"data":"email="+email,//要发送到服务器的数据
"data":{"email":email},
"dataType":"text",//指定返回的数据格式
"success":function(data)//响应成功后要执行的代码:data入参表示响应结果
{
if(data=="true")
{
$("#errorEmail").text("邮箱已注册");
$("#errorEmail").css("color","red");
}else
{
$("#errorEmail").text("邮箱可以使用");
$("#errorEmail").css("color","#00FF00");
}
},
"error":function()//请求失败后要执行的代码
{
alert("用户ing验证错误,请稍后再试或与管理员联系!!!");
}
});
}
});
});
Ajax封装方法:
由于通过原生javaScript 实现 Ajax并处理响应相对比较复杂,还要考虑浏览器兼容性等一系列问题,JQuery中将
Ajax相关的操作都进行了封装,提供了$.ajax() 方法以简化Ajax开发
1、$.ajax()
2、$.get()
3、$.post()
4、$.getJSON()
5、.load()
……
1、$.get()方法 与 $.post()方法相同
语法:
$.get( url [, data] [, success] [, dataType] );
小栗子:同样实现上述小栗子需求
实现无刷新用户名验证
当用户名文本框失去焦点时,发送请求到服务器,判断用户名是否存在
如果已经存在提示 “用户名已被使用”,如果不存在则提示 “用户名可以使用”
js 关键代码:
$(function() {
// 邮箱文本框失去焦点事件
$("#userEmail").blur(function() {
// 获取用户输入的邮箱
var email = $("#userEmail").val();
if (email == null || email == "") {
$("#errorEmail").text("邮箱不能为空");
} else {
$.get("/jsp_day10/userInfo", "email=" + email, callBack);// 发送请求
//$.post("/jsp_day10/userInfo",{"email":email},callBack,"Text");
function callBack(data) {
if (data == "true") {
$("#errorEmail").text("邮箱已注册");
$("#errorEmail").css("color", "red");
} else {
$("#errorEmail").text("邮箱可以使用");
$("#errorEmail").css("color", "#00FF00");
}
}
}
});
});
2、$.getJSON方法
语法:
$.getJSON( url [, data] [, success] );
关键代码:
Servlet:
if (oper.equals("list")) {
//拼接JSON数据格式的响应内容
StringBuffer newsJSON=new StringBuffer();
newsJSON.append("[\"uName\",");
newsJSON.append("\"uAge\",");
newsJSON.append("\"uSex\",");
newsJSON.append("\"uOccupation\",");
newsJSON.append("\"uaddress\",");
newsJSON.append("\"uPhone\"]");
//System.out.println(jsonStr);
out.print(newsJSON);
}
js代码:
//getJSON格式返回数据
$("#button").bind("click", function() {
/**
* Servlet发送getJSON请求 data:返回的数据 textStatus:请求状态描述
*/
$.getJSON("/jsp_day11/GetJson", "oper=list", function(data, textStatus, jqxhr) {
$.each(data, function(i, dom) {
$("#frist").append("<p>" + dom + "</p>")
});
});
});
3、使用Ajax方法直接加载HTML内容
js关键代码:
//使用Ajax返回HTML内容
$("#button1").bind("click", function() {
$.ajax({
"url":"/jsp_day11/GetJson",//访问的路径
"type":"post",//请求的格式
"data":"oper=listHTML",//请求携带的参数
"dataType":"html",//返回预期的类型
"success":function(data){//回调函数
$("#frist1").html(data);
},
"error":function(){//异常调用函数
alert("异常");
}
});
});
Servlet关键代码:
if (oper.equals("listHTML")) {
out.print("<p>我是Ajax返回的html内容</p>");
}
4、load()方法
也可以通过load方法直接加载HTML内容到指定的元素中。
语法:
$( selector ).load( url [, data] [, complete] );
.load()不是全局函数,而是针对与选择器匹配的元素执行
包含匿名回调函数,自动将返回值设置为匹配元素的HTML内容
栗子:关键代码
Servlet:
if (oper.equals("listHTML")) {
out.print("<p>我是Ajax返回的html内容</p>");
}
js:代码
//使用load()返回HTML内容
$("#button2").bind("click", function() {
$("#frist2").load("/jsp_day11/GetJson","oper=listHTML");
});
扩展知识:
.load()方法还可以加载远程文档的某个部分,通过url 参数的特殊的特殊语法可以实现。URL参数中可以通过空格
连接决定加载内容的JQuery选择器。
语法:
$("#frist4").load("index.jsp #Dfrist1");
栗子:
index.jsp页面:
<body>
<div id="Dfrist">
<p>我是测试网页版本第一个</p>
</div>
<div id="Dfrist1">
<p>我是测试网页版本第二个</p>
</div>
</body>
js:代码读取某一部分内容:
//使用load()方式二:返回HTML内容
$("#button4").bind("click", function() {
$("#frist4").load("index.jsp #Dfrist1");
});
提示:读取的内容id为 #Dfrist1整个元素
完整栗子:
使用 JSONObject生成和解析json
JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集。采用完
全独立语言的文本格式。JSON类似于实体类对象,通常用来在客户端和服务器之间传递数据。在Ajax出现之初,
客户端脚本和服务器之间传递数据使用的是XML,但XML难于解析,体积也比较大。当JSON出现时,它的轻量级
易于解析的优点,很快受到业界的广泛关注,现在大有将XML取而代之的趋势。
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
在eclipse中使用JSONObject需要引用org.json包,推荐通过maven引用,如果不会使用maven,搭建maven项目
可参考这篇文章:https://blog.csdn.net/qjyong/article/details/9098213
引用json则参考这篇文章:https://blog.csdn.net/woshimeihuo/article/details/49758645
2、直接构建JSON对象
JSONObject obj = new JSONObject();
obj.put(key, value);
直接构建即直接实例化一个JSONObject对象,而后调用其put()方法,将数据写入。put()方法的第一个参数为key
值,必须为String类型,第二个参数为value,可以为boolean、double、int、long、Object、Map以及Collection
等。当然,double以及int等类型只是在Java中,写入到json中时,统一都会以Number类型存储。
栗子:
import org.json.JSONObject;
public class JSONObjectSample {
public static void main(String[] args) {
createJson();
}
private static void createJson() {
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.put("sex", "male");
obj.put("age", 22);
obj.put("is_student", true);
obj.put("hobbies", new String[] {"hiking", "swimming"});
//调用toString()方法可直接将其内容打印出来
System.out.println(obj.toString());
}
}
输出结果为:
{"hobbies":["hiking","swimming"],"sex":"male","name":"John","is_student":true,"age":22}
这里可以看到,为了压缩大小以便于更高效地传输,json把所有空格、换行符等空白符全部去掉了。如果想要直观
点看其内容,可以用一些在线的json解析器看,例如:http://www.jsoneditoronline.org/
2.1、使用HashMap构建:
使用HashMap构建json,实际上即先创建好一个HashMap对象并且将数据打包进去,而后在创建JSONObject时将
其作为一个参数传进去。
public class JSONObjectSample {
public static void main(String[] args) {
createJsonByMap();
}
private static void createJsonByMap() {
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "John");
data.put("sex", "male");
data.put("age", 22);
data.put("is_student", true);
data.put("hobbies", new String[] {"hiking", "swimming"});
JSONObject obj = new JSONObject(data);
System.out.println(obj.toString());
}
}
2.2、使用JavaBean构建
相较于前两种方法,实际开发中应用JavaBean构建json的情况更为常见,因为这样代码的重用率更高。
栗子:
javabean:
public class PersonInfo {
private String name;
private String sex;
private int age;
private boolean isStudent;
private String[] hobbies;
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public void setStudent(boolean isStudent) {
this.isStudent = isStudent;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
//getter不能少
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getAge() {
return age;
}
public boolean isStudent() {
return isStudent;
}
public String[] getHobbies() {
return hobbies;
}
}
main:
import org.json.JSONObject;
public class JSONObjectSample {
public static void main(String[] args) {
createJsonByJavaBean();
}
private static void createJsonByJavaBean() {
PersonInfo info = new PersonInfo();
info.setName("John");
info.setSex("male");
info.setAge(22);
info.setStudent(true);
info.setHobbies(new String[] {"hiking", "swimming"});
JSONObject obj = new JSONObject(info);
System.out.println(obj);
}
}
需要注意一点,JavaBean一定要有getter方法,否则会无法访问存储的数据。
3. 解析json
解析json主要是基本类型如Number、boolean等,与数组Array。
基本类型的解析直接调用JSONObject对象的getXxx(key)方法,如果获取字符串则getString(key),布尔值则
getBoolean(key),以此类推。
数组的解析稍微麻烦一点,需要通过JSONObject对象的getJSONArray(key)方法获取到一个JSONArray对象,再
调用JSONArray对象的get(i)方法获取数组元素,i为索引值。
范例:
首先在工程目录"src/main/java"下创建一个json文件,用于解析。
demo.json:
{
"hobbies": [
"hiking",
"swimming"
],
"sex": "male",
"name": "John",
"is_student": true,
"age": 22
}
在pom.xml中加入对commons-io的依赖,以便于使用FileUtils进行文件访问:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.studying</groupId>
<artifactId>myjson</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myjson</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!--加入对commons-io的依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
主类:
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;
public class JSONObjectSample {
public static void main(String[] args) throws IOException {
File file = new File("src/main/java/demo.json");
String content = FileUtils.readFileToString(file);
//对基本类型的解析
JSONObject obj = new JSONObject(content);
System.out.println("name:" + obj.getString("name"));
System.out.println("sex:" + obj.getString("sex"));
System.out.println("age" + obj.getInt("age"));
System.out.println("is_student" + obj.getBoolean("is_student"));
//对数组的解析
JSONArray hobbies = obj.getJSONArray("hobbies");
System.out.println("hobbies:");
for (int i = 0; i < hobbies.length(); i++) {
String s = (String) hobbies.get(i);
System.out.println(s);
}
}
}
使用FastJSON生成JSON字符串
随着JSON的广泛使用,在服务器端生成JSON字符串成了一件麻烦的工作,效率低且易出错FastJSON一个性能很
好的、Java实现的JSON解析器和生成器。来自阿里巴巴。其代码托管在GitHub服务器上,在
https://github.com/alibaba/fastjson/releases 页面可以找到不同版本的jar文件和源代码下载路径
将Java对象序列化成JSON字符串
将JSON字符串反序列化得到Java对象
使用FastJSON
入口类:com.alibaba.fastjson.JSON,基本上常用的操作都可以通过该类的静态方法直接完成。
枚举类型 SerializerFeature 定义了多种序列化属性
栗子:
// 包含值为 null 的字段,数值为 null 输出0,String 为 null 输出“”
String strJSON = JSON.toJSONString ( javaObject,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullStringAsEmpty );
jQuery让渡$操作符3-2
jQuery不是唯一使用 $ 的脚本库,项目中有其他同样使用 $ 的脚本库时就会引起冲突
// Prototype的 $ 会覆盖jQuery的 $
<script type="text/javascript" src="../js/jquery-1.12.4.min.js" />
<script type="text/javascript" src="../js/prototype.js" />
或者
// jQuery的 $ 会覆盖Prototype的 $
<script type="text/javascript" src="../js/prototype.js" />
<script type="text/javascript" src="../js/jquery-1.12.4.min.js" />
jQuery定义了jQuery.noConflict()方法,放弃对$的使用权,以免与其他脚本库冲突
jQuery.noConflict(); // 让渡$使用权,后续jQuery代码使用jQuery代替$
jQuery( document ).ready( … );
或者重新指定一个替代符号:
var $j = jQuery.noConflict(); // 让渡$使用权,并指定用 $j 代替$
$j( document ).ready( … );
提示:但是无论采用哪种方式,都会改变jQuery的编码风格,不仅更加烦琐,而且对于已有jQuery代码的重用
也会产生不利影响。
为了在解决冲突的同时尽量减少对jQuery代码的影响,建议采用以下方式:
jQuery.noConflict(); // 让渡$使用权,其他脚本库可以使用$
jQuery( document ).ready( function( $ ) {
// 在这里继续使用$编写jQuery代码
$( "#show" ).click( … );
} );
或者
jQuery.noConflict(); // 让渡$使用权,其他脚本库可以使用$( function( $ ) {
// 在这里继续使用$编写jQuery代码
$( document ).ready( function() {
$( "#show" ).click( … );
} );
} )( jQuery );
======仅供参考:如有问题麻烦评论指正 :三克油====