1.JavaScript增強,涉及到ECMAScript語法、BOM對象、DOM對象以及事件。javascript
2.Ajax傳統編程。php
3.jQuery框架,九種選擇器爲核心學習內容css
4.JQuery UI插件html
5.jQuery Ajax編程java
6.jQuery第三方插件node
7.反向Ajax編程(彗星)jquery
JavaScript是在瀏覽器內容運行,無需編譯、解釋執行動態腳本語言,是一種弱類型語言,全部變量使用var定義。web
JavaScript的3個組成部分分別爲:核心(ECMAScript)、文檔對象模型(DOM)、瀏覽器對象模型(BOM)ajax
①:代碼編寫位置正則表達式
分爲內部JS和外部JS【使用src進行引入】
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>JavaScript程序編寫</title>
<!-- 內部JS -->
<script type="text/javascript">
// 編寫JavaScript代碼
alert(1);
</script>
<!-- 外部JS-->
<script type="text/javascript" src="1.js"></script>
②:學習順序
JavaScript依次從變量(標示符、關鍵字),運算符,程序結構(if while for),以及函數來進行學習。
(1)全部的變量使用var來定義,是弱類型變量,不表明沒有類型,變量自己仍是有類型的。【var a=10,var b=1.5;他們分別爲整數以及浮點數類型】
(2)每行結尾分號無關緊要,建議編寫。
(3)註釋和Java相似,支持單行註釋(//)和多行註釋(/* */)
③:數據類型
JavaScript分爲原始數據類型和引用數據類型,分別存儲於棧和堆中。
原始數據類型:number、string、boolean、null和undefined
引用數據類型:存在不少種,每種都是object對象
可使用typeof查看數據類型,使用instanceof判斷變量數據類型
Demo:
<script type="text/javascript">
// 定義全部變量都用var,可是變量自己具備類型
var a = 10; // 整數
var b = 1.5; // 浮點數
var c = true; // 布爾
var d = "abc"; // 字符串 基本數據類型
var e = 'abc'; // 字符串
// 經過typeof查看數據類型
alert(typeof d);
// 經過instanceof判斷變量數據類型
alert(d instanceof Object);//falae
alert(a instanceof Object);//falae
var s = new String("abc"); // 對象類型
alert(s instanceof Object);
</script>
④:null和undefined的區分
null:對象不存在;
undefined:對象存在,訪問屬性或者方法不存在(對象未初始化)
ECMAScript經常使用的有7個對象,依次爲String、Number、Boolean、Math、Date、Array以及Regxp。
①:String類型經常使用屬性方法
建議查看手冊,這裏須要注意的爲length屬性以及match方法
charAt()、concat()、indexOf()、lastIndexOf()、match()、replace()、split()、substr()、substring()、toLowerCase()、toUpperCase()
Java中提供matches方法 例如:"1234".matches("\\d+") ---- 返回true
JavaScript 與 matches方法等價的那個方法,是 RegExp 對象提供test方法
例如:/^\d+$/.test("1234") --- 返回true
/^\d+$/ 等價於 new RegExp("^\\d+$")
"1234".match("^\\d+$") 返回是匹配正則表達式內容,而不是布爾值,等價於 /^\d+$/.exec("1234")
②:Math經常使用屬性和方法
PI 屬性
round(x) 把數四捨五入爲最接近的整數
random() 返回 0 ~ 1 之間的隨機數
pow(x,y) 次冪
sqrt(x) 平方根
③:Date經常使用屬性和方法
toLocaleString() 返回當地本地化日期格式 2012年12月12日 11:07:52
getTime() 返回從1970年1月1日到目前爲止 毫秒值
Demo:
<script type="text/javascript">
var s1 = "abc"; // s1是基本數據類型
var s2 = new String("abc") ; // s2是對象類型
//alert(s1 == s2); //
//alert("98"==98);// true
//alert("true"==true); // false
//alert(1==true); // true
var d = 010;// 八進制
var d2 = 0x10; // 十六進制
// match方法 相似 Java中 matches,有區別
//alert(/^\d+$/.test("1234abc")); // 等價於 java中matches
//alert("1234".match("^\\d+$")); // math方法返回的是匹配正則表達式內容,而不是布爾值
//alert(/^\d+$/.exec("1234abc1234"));// 返回匹配的內容
// Date使用
var date = new Date(); //當前日期
alert(date.toLocaleString());// 返回當地國際化日期格式
var dateStr = date.getFullYear()+"-"+date.getMonth()
+"-"+date.getDate()+" "+date.getHours()+":"+date.getMinutes()
+":"+date.getSeconds();
alert(dateStr);
</script>
④:Array經常使用屬性方法
push() 加入元素到數組
pop() 從數組移除最後一個元素
reverse()反轉
join() 鏈接數組元素 經過特定內容 返回字符串
sort() 排序
slice() 截取數組中指定元素 從start到end
Demo:
<script type="text/javascript">
// 定義數組 使用Array對象
// 方式一
var arr1 = [1,2,3];
// 數組的遍歷 經過長度和下標
for(var i=0;i< arr1.length ; i++){
//alert(arr1[i]);
}
// 方式二
var arr2 = new Array(3);// 定義長度爲3的數組
arr2[0] = "aa";
arr2[1] = "bb";
arr2[2] = "cc"
arr2["100"] = "dd";
//alert(arr2.length);
//alert(arr2[4]);
// 方式三
var arr3 = new Array(1,2,3);// 數組三個元素 1, 2 ,3
//alert(arr3.join("-")); // 1-2-3
alert(arr3.slice(1,3)); // 從1下標,截取到3下標,1下標包含,3下標不包含
</script>
①:函數定義的三種方式
注意:第二種方式使用愈來愈多,第三種不經常使用,第一種經常使用
<script type="text/javascript">
// 方式一
function add(a,b){ // 沒有返回值,形參不須要聲明類型
return a+b; // 能夠返回
}
//alert(add(1,2));
// 方式二 function 匿名函數, sub成爲函數名稱
var sub = function(a,b){
return a-b;
}
//alert(sub(10,8));
// 方式三 使用Function對象 定義函數
// 語法 new Funtion(arg1,arg2 ... , body)
var mul = new Function("a","b","return a*b;"); // 不經常使用
//alert(mul(10,20));
// 全部函數 都是Function實例
alert(mul instanceof Function);// true
</script>
②:JavaScript全局函數(內置函數)
一組與編碼解碼相關的函數
encodeURI()&decodeURI()
encodeURIComponent()&decodeURIComponent()
escape()&unescape()
此塊具體內容請參照W3C文檔查看。
Java是面向對象,寫Java程序,寫類和對象。JavaScript是基於對象,寫Js,不用建立類,使用Js內部已經定義好的對象。
①:定義JavaScript對象的兩種方式
方式一:使用已經存在的對象,經過關鍵字進行建立
var s = new String("aaaa");
var o = new Object();
var date = new Date();
//alert(date instanceof Object);// true
// JS對象 相似一個map結構
var arr = new Array(3);
arr[0] = 100;// 使用數組下標 爲數組元素賦值
arr['aaa'] = 1000; // 定義對象屬性
//alert(arr['aaa']);
arr.showInfo = function(){// 定義對象方法
alert(arr.join(","));
};
//arr.showInfo(); //100, ,
Js其實就是一個相似map結構,key爲屬性名和方法名,value爲屬性值和方法定義
方式二:經過{}建立
var obj = {
name : '張三',
age : 20,
getName : function(){
// 訪問對象屬性 經過關鍵字 this
return this.name;
}
};
// 訪問對象 屬性 [] 和 .
//alert(obj.name);
//alert(obj["age"]);
alert(obj.getName());
// 添加一個方法到 obj對象
obj.getAge = function(){
return this.age;
}
alert(obj.getAge());
JavaScript中的對象是經過 new function建立的,在Js中function等同於一個類結構
// 定義類 結構
var Product = function(name,price){
this.name = name; // 保存name的值 到對象屬性中
this.price = price;
}
// 基於類結構建立對象,使用new 關鍵字
var p1 = new Product("冰箱",1000);
var p2 = new Product("洗衣機",1500);
//alert(p1.name);
//alert(p1.price);
function自己表明一個函數,JavaScript對象經過new function來得到的,理解function就是對象構造函數
②:Object和function的關係
JavaScript中全部引用類型都是對象Object實例 ------- Function instanceOf Object //true
JavaScript 中全部對象都是經過 new Function實例(function) 得到 ------ Object instance Function //true
JavaScript全部對象構造函數都是function實例;JavaScript全部對象都是object實例,function也是object實例。
使用JavaScript的傳遞性進行推論!
A:function是用來定義一個函數,全部函數實例都是Function對象
B:JavaScript中,全部對象都是經過new function獲得的
Var Object = function(){...}
Var String = function(){...}
Var Array = function(){...}
Var Date = function(){...}
結論:全部對象構造器都是Function實例
alert(String instanceOf Function) //true
alert(Object instanceOf Function) //true
C:建立一個對象,須要使用new function
Var s = new String()
Var o = new Object()
Var arr = new Array()
Var date = new Date()
結論:JavaScript中,一切對象都是object實例
alert(s instanceOf Object) //true
alert(Function instanceOf Object) //true
var f = new Function(); // 實例化Function對象
var o = new Object(); // 實例化Object對象
alert(f instanceof Function); // true
alert(f instanceof Object); // true
alert(o instanceof Function); // false
alert(o instanceof Object); // true
③:function原型屬性
JavaScript全部對象都由function構造函數得來的 ,經過修改 function構造函數 prototype屬性,動態修改對象屬性和方法。
④:繼承
A:使用原型鏈完成JavaScript單繼承
var A = function(){
this.name = 'xxx';
}
var B = function(){
this.age = 20;
}
// 方式一 能夠經過 prototype原型完成單繼承 B的原型指向A
B.prototype = new A(); // 從A實例中,繼承全部屬性
var b = new B();
alert(b.name);
// 練習:經過prototype爲String類添加一個trim方法
String.prototype.trim = function(){
return this.replace(/(^\s*)(\s*$)/g, "");
}
B:對象冒充完成多繼承
var C = function(){
this.info = 'c';
}
var D = function(){
this.msg = 'd';
}
var E = function(){
// 同時繼承C和D
this.methodC = C;
this.methodC();
delete this.methodC;
this.methodD = D;
this.methodD();
delete this.methodD;
this.desc = 'e';
}
var e = new E();
//alert(e.info);
//alert(e.msg);
//alert(e.desc);
⑤:動態方法調用
能夠改變this的指向,能夠完成對象多繼承
// 定義函數
function printInfo(){
alert(this.name);
}
// 屬性name 值 張三
var o = {name: '張三'};
//o.printInfo();// 函數不屬於對象o
// JS提供動態方法調用兩個方法,容許一個對象調用不是屬於它本身的方法(call apply)
//printInfo.call(o);
//printInfo.apply(o);
function add(a,b){
this.sum = a+b;
}
// call傳 多個參數
//add.call(o,8,10);
// apply 傳遞參數數組
add.apply(o,new Array(8,10));
//alert(o.sum);
// 動態方法調用 ,實現多重繼承,原理就是對象冒充
var A = function(){
this.info = 'a';
}
var B = function(){
// 動態方法調用繼承
A.call(this);
}
var b = new B();
alert(b.info);
DOM Window 表明窗體
DOM History 歷史記錄
DOM Location 瀏覽器導航
DOM Navigator 瀏覽器信息 不講
DOM Screen 屏幕 不講
重點:window、history、location ,最重要的是window對象
Window 對象表示瀏覽器中打開的窗口,若是文檔包含框架(frame 或 iframe 標籤),瀏覽器會爲 HTML 文檔建立一個 window 對象,併爲每一個框架建立一個額外的 window 對象
window.frames 返回窗口中全部命名的框架
parent是父窗口(若是窗口是頂級窗口,那麼parent==self==top)
top是最頂級父窗口(有的窗口中套了好幾層frameset或者iframe)
self是當前窗口(等價window)
opener是用open方法打開當前窗口的那個窗口
①:父子窗體之間的通信
在頁面內嵌入一個iframe,在iframe中提供一個輸入項,輸入後,在iframe外面窗口中顯示內容
顯示結果如上圖所示,實現思路以下:
子窗體:2.html
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Untitled Document</title>
<script type="text/javascript">
function showOutter(){
// 得到輸入內容
var content = document.getElementById("content").value;
// 將輸入的內容顯示到主窗體info 中
window.parent.document.getElementById("info").innerHTML = content;
}
</script>
</head>
<body>
<h1>子窗體</h1>
<input type="text" id="content" />
<input type="button" value="顯示到主窗體" onclick="showOutter();"/>
</body>
主窗體:1.html
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>父子窗體通訊</title>
<script type="text/javascript">
function showContent(){
// 用主窗體讀取子窗體內容
var content = window.frames[0].document.getElementById("content").value;
alert(content);
}
</script>
</head>
<body>
<h1>主窗體</h1>
<div id="info"></div>
<!-- 在主窗體中得到子窗體內容 -->
<input type="button" value="獲取子窗體輸入內容" onclick="showContent();" />
<iframe src="2.html"></iframe>
</body>
②:window的open close
<head>
<title>打開關閉窗體</title>
<meta http-equiv="content-type" content="text/html; charset=gbk">
<script type="text/javascript">
//用一個變量記錄打開的網頁
var openNew;
function openWindow(){
openNew = window.open("http://www.itcast.cn");
}
//關閉的時候須要注意關閉的是打開的網頁,而不是自己
function closeWindow(){
openNew.close();
}
</script>
</head>
<body>
<input type="button" value="打開傳智播客網頁" onclick="openWindow()">
<input type="button" value="關閉傳智播客網頁" onclick="closeWindow()">
</body>
③:window彈出對話框相關的3個方法
alert()警告框 confirm()確認框 prompt()輸入框
<script type="text/javascript">
alert("這是警告框!")
var con = confirm("你想好了嗎?");
alert(con);
var msg = prompt("請輸入姓名","張三");
alert(msg);
</script>
④:定時操做setInterval & setTimeout
setInterval:定時任務會重複執行
setTimeout:定時任務只執行一次
在頁面動態顯示當前時間
<script type="text/javascript">
window.onload = function(){
var date = new Date();
document.getElementById("time1").innerHTML =date.toLocaleString();
document.getElementById("time2").innerHTML =date.toLocaleString();
setInterval("show1();",1000); //間隔1秒後重復執行
setTimeout("show2();",1000);//1秒後執行,執行1次
}
function show1(){
var date = new Date();
document.getElementById("time1").innerHTML =date.toLocaleString();
}
function show2(){
var date = new Date();
document.getElementById("time2").innerHTML =date.toLocaleString();
setTimeout("show2();",1000);//不終止
}
</script>
<body>
<div id="time1"></div>
<div id="time2"></div>
</body>
表明歷史記錄,經常使用來製做頁面中返回按鈕
<input type="button" value="返回" onclick="history.back();" />
<input type="button" value="返回" onclick="history.go(-1);" />
表明瀏覽器導航 在js函數中發起href連接效果
location.href='跳轉後url' ; 等價於 <a href='xxx'></a>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>History和Location使用</title>
</head>
<body>
<input type="button" value="返回" onclick="history.back();" />
</body>
</html>
DOM 解析模型,將文檔加載到 內存,造成一個樹形結構 <html> 就是根節點,每一個標籤會成爲一個元素節點、標籤的屬性成爲屬性節點,標籤內部的文本內容成爲文本節點
注意:屬性節點,它不屬於DOM樹形結構,不屬於任何節點父節點,也不屬於任何節點的子節點 ,屬性節點依附於元素節點上 一種附加節點
【上面代碼 產生6個元素節點,5個屬性節點,9個文本節點】
HTML 自己也是 XML,全部可使用XML DOM API規範
DOM Element
DOM Attr
DOM Text
DOM Document
HTML DOM是對XML DOM的擴展, HTML DOM比XML DOM 開發JS來講更加簡單方便!
HTML DOM最優秀的地方是,操做form對象和table數據
學習DOM 編程,從Document對象開始,document表明當前HTML網頁文檔對象,是window對象一個屬性,能夠直接使用 ,全部HTML DOM對象都是Document子對象
window.document 表明整個HTML文檔
①:經過document得到Node節點對象
document.forms 得到頁面中全部form元素集合
document.body 訪問頁面中<body> 元素
document.cookie 用JS操做網頁cookie信息
全局檢索提供了三個重要的方法:
document.getElementById():經過id屬性檢索,得到Node節點(Element元素)
document.getElementsByName 經過name 屬性檢索 ,得到NodeList
document.getElementsByTagName 經過標籤元素名稱 得到NodeList
其中NodeList能夠做爲數組進行操做
Demo:在每個h1標籤後追加itcast
<script type="text/javascript">
//在每個h1標籤內追加一個itcast
window.onload = function(){
var nodeList = document.getElementsByTagName("h1");
for(var i=0; i<nodeList.length;i++){
// var h1 = nodeList[i];
var h1 = nodeList.item(i);
alert(h1.innerHTML);
h1.innerHTML += "itcast";
}
}
</script>
<body>
<h1>AAA</h1>
<h1>BBB</h1>
<h1>CCC</h1>
<h1>DDD</h1>
</body>
②:得到node後
若是node是元素,去操做裏面的文本內容 innerHTML (HTML頁面內全部元素,必定是HTML 元素,innerHTML 是全部HTML元素通用屬性 )
XML 取得一個元素內部文本內容 element.firstChild.nodeValue(看批註32)
③:經過節點Node相對位置關係訪問元素
childNodes
firstChild
lastChild
nextSibling
parentNode
previousSibling
用2種方式打印——明天休息
<h1 id="h1">明天休息</h1> <br>
var h1 = document.getElementById("h1");
alert(h1.innerHTML);//方式一
alert(h1.firstChild.nodeValue);//方式二
DOM 獲取節點:節點查詢 參上
DOM 改變節點: 元素屬性修改setAttribute(name,value)
內部文本元素的修改 innerHTML
DOM 刪除節點:removeChild 刪除子元素 、removeAttribute(name)刪除節點指定屬性
* 要刪除節點o o.parentNode.removeChild(o)
DOM 替換節點:replaceChild:父節點.replaceChild(新節點,被替換節點) ;
若是對於一個已經存在節點,執行 appendChild、 replaceChild都會形成該節點一個移動效果,能夠採起先克隆再複製來消除此效果。
DOM 建立節點:document對象提供createElement() 建立元素、createAttribute(name) 建立屬性、createTextNode() 建立文本節點
DOM 添加節點 appendChild 父元素.appendChild(新的子節點) ;
insertBefore 父節點.insertBefore(新子節點, 已經存在子節點)
DOM 克隆節點 源節點.cloneNode(true); 該方法能夠返回一個節點的克隆節點, 克隆節點包含原節點的屬性和子元素
此節內容有大量的練習,建議你們作寫,加強代碼的熟練度。
事件一般與函數配合使用,這樣就能夠經過發生的事件來驅動函數執行。事件是基於對象存在,事件一般能夠修飾多種對象。
①:在HTML元素中添加對象的事件
<head>
<title>事件</title>
<meta http-equiv="content-type" content="text/html; charset=gbk">
<script type="text/javascript">
function overtest(){
alert("移動到圖片上方");
}
</script>
</head>
<body>
<img src="1.jpg" width="200" height="300" onmouseover = "overtest()";/>
</body>
②:在JS代碼中爲元素添加事件
<head>
<title>事件</title>
<meta http-equiv="content-type" content="text/html; charset=gbk">
<script type="text/javascript">
function overtest(){
alert("移動到圖片上方");
}
window.onload = function(){
document.getElementById("myimg").onmouseover = overtest;
}
</script>
</head>
<body>
<img src="1.jpg" width="200" height="300" id="myimg";/>
</body>
總結:優先使用第二種,將js代碼與HTML元素代碼分離開,更加方便統一管理維護。
問題:HTML 元素添加事件, 與JS添加事件是否能夠徹底等價?
在實際開發中,若是傳參數,使用HTML元素綁定事件,若是不傳參數,使用JS綁定事件。傳參數也可使用與JS綁定事件【使用匿名函數】。示例代碼以下:
<head>
<title>HTML事件綁定與JS綁定</title>
<meta http-equiv="content-type" content="text/html; charset=gbk">
<script type="text/javascript">
function clicktest(o){
alert(o);
}
window.onload = function(){
document.getElementById("mybutton").onclick = function(){
clicktest('次奧');
}
}
</script>
</head>
<body>
<input type="button" id="mybutton" value="點擊我!">
<input type="button" value="別碰我!" onclick = "clicktest('次奧')"/>
</body>
Mousemove: 鼠標移動時觸發事件 鼠標跟隨效果
Mouseover: 鼠標從元素外,移動元素之上,信息提示、字體變色
Mouseout: 鼠標從元素上,移出元素範圍,和mouseover一塊兒使用
click 鼠標單擊事件
dbclick 鼠標雙擊事件
mousedown/mouseup 鼠標按下、按鍵彈起 click = mousedown + mouseup;
oncontextmenu 鼠標右鍵菜單事件 (不是瀏覽器兼容事件)
focus 聚焦 頁面焦點定位到目標元素
blur 離焦 頁面焦點由目標元素移開
Demo:
<script type="text/javascript">
window.onload= function(){
//頁面加載後,在輸入框加入默認值,並以灰色顯示
document.getElementById("username").value= "用戶名";
document.getElementById("username").style.color="gray";
//聚焦事件
document.getElementById("username").onfocus= function(){
document.getElementById("username").value="";
document.getElementById("username").style.color="black";
}
//離焦事件
document.getElementById("username").onblur=function(){
var name = document.getElementById("username").value;
if(name==""){
document.getElementById("username").value="張三";
document.getElementById("username").style.color="gray";
}
}
}
</script>
</head>
<body>
請輸入用戶名:<input type="text" id="username"><br/>
</body>
使用場景:沒有提交按鈕,咱們通常採用回車進行提交
Demo:
<script type="text/javascript">
window.onload = function(){
document.getElementById("message").onkeypress = function(e){
// 判斷用戶 按鍵是否爲 回車鍵
if(e && e.which){
// 火狐瀏覽器
if(e.which == 13){
alert("提交")
}
}else{
// IE瀏覽器
if(window.event.keyCode ==13 ){
alert("提交")
}
}
}
}
</script>
<body>
發送消息 <input type="text" name="message" id="message"/>
</body>
IE 中window對象,提供event屬性,因此在IE中能夠直接使用 event對象
火狐沒有全局event對象,必須在發生事件時,產生一個event對象 ,傳遞默認方法
submit/reset
onsubmit = "return validateForm" 對錶單進行校驗
onchange 製做select聯動效果 ---- 省市聯動
重點 : onclick 、onchange 、onblur、 onsubmit
使用場景極爲常見,超連接用戶點擊後,取消了不發生跳轉。
<script type="text/javascript">
// 阻止默認事件發生
function confirmDel(e){
var isConfirm = window.confirm("確認刪除嗎?");
if(!isConfirm){// 用戶選擇了取消
// 阻止默認事件
if(e && e.preventDefault){
// 火狐
e.preventDefault();
}else{
// IE
window.event.returnValue = false;
}
}
}
// 阻止事件冒泡
function aclick(e){
alert("a");
if(e && e.stopPropagation){
// 火狐瀏覽器
e.stopPropagation();
}else{
// IE 瀏覽器
window.event.cancelBubble = true;
}
}
function divclick(){
alert("div");
}
</script>
<body>
<h1>默認事件</h1>
<!-- 刪除時,詢問用戶是否刪除,而後再跳轉-->
<a href="del?id=1" onclick="confirmDel(event);">這是一個連接</a>
<h1>事件傳播</h1>
<!-- 事件冒泡傳播 -->
<div onclick="divclick();"><a href="#" onclick="aclick(event);">這個連接 會觸發兩個事件執行</a></div>
</body>
HTML DOM Event對象
提供preventDefault()用於阻止默認事件的發生, 該方法IE 不支持 ,在IE中使用 returnValue
提供stopPropagation()用與阻止事件傳播,該方法IE不支持,在IE中 cancelBubble
①:2種交互模式的流程
②:2種交互模式用戶體驗
同步交互模式:客戶端提交請求,等待,在響應回到客戶端前,客戶端沒法進行其餘操做
異步交互模型:客戶端將請求提交給Ajax引擎,客戶端能夠繼續操做,由Ajax引擎來完成與服務武器端通訊,當響應回來後,Ajax引擎會更新客戶頁面,在客戶端提交請求後,用戶能夠繼續操做,而無需等待 。
①:開發步驟
1).建立XMLHttpRequest對象
2).將狀態觸發器綁定到一個函數
3).使用open方法創建與服務器的鏈接
4).向服務器端發送數據
5).在回調函數中對返回數據進行處理
Demo:
<script type="text/javascript">
// 第一步 建立XMLHttpRequest
function createXMLHttpRequest(){
try {
xmlHttp = new XMLHttpRequest();
}catch (tryMS) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch (otherMS) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch (failed) {
xmlHttp = null;
// 這裏能夠報一個錯誤,沒法得到 XMLHttpRequest對象
}
}
}
return xmlHttp;
}
var xmlHttp = createXMLHttpRequest();
// 第二步 響應從服務器返回後,Ajax引擎須要更新頁面,綁定一個回調函數
xmlHttp.onreadystatechange = function(){
// 第五步,響應返回後執行
// 狀態依次 是 0 - 4
// 0 未初始化 1 正在加載 2 已經加載 3 交互中 4 響應完成
if(xmlHttp.readyState == 4){
// 判斷數據是否正確
if(xmlHttp.status == 200){
// 響應有效
alert("響應返回了..." + xmlHttp.responseText);
}
}
};
// 第三步 創建與服務器鏈接
//xmlHttp.open("GET","helloworld?name=張三");//helloworld表明 Servlet URL
xmlHttp.open("POST","helloworld");
// 第四步 發送數據
// xmlHttp.send(null);
xmlHttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
xmlHttp.send("name=李四");
</script>
②:XMLHttpRequest對象的屬性及方法
屬性:
1)onreadystateonchange:狀態回調函數
2)readystate:對象狀態
3)status:服務器返回的http狀態碼
4)reqsponseText/responseXML:服務器響應的字符串
5)statusText:服務器返回的http狀態信息
方法:
1)open:
2)send:
③:客戶端向服務器提交數據
1)get方式發送數據
xmlHttp.open("GET","url?key=value"); // 參數已經在url上
xmlHttp.send(null);
2)post方式發送數據
xmlHttp.open("POST","url"); // 不須要寫參數
xmlHttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded"); // post發送參數前,須要設置編碼格式
xmlHttp.send("name=xxx&pwd=xxx"); // 發送post數據
④:Ajax編程圖解
說明:查看時,請將文檔放到爲180%較爲合適!
結合編程圖解,咱們將第一個案例的代碼進行解剖:
常見的服務器響應數據類型:html片斷、JSON格式數據、xml格式數據
①:HTML片斷的數據處理
練習1:驗證用戶名是否有效
Ø 經過xmlhttp.responseText得到返回數據
Ø 經過Dom查找得到元素
Ø 調用元素的innerHTML進行操做
說明:三個文件的具體內容請雙擊方框內的圖標便可查看,這裏推薦使用Notepad++進行關聯
效果圖展現:(數據使用list存儲,abc和def存在)
注意:在register.html文件中,與服務器創建鏈接是,url必定要寫對,不然返回數據時出現404錯誤!【"/Ajax/CheckUsernameServlet?username="】
②:JSON格式數據處理
練習2:經過連接得到table數據,顯示 --- 返回HTML片斷
經過product.jsp 生成HTML片斷,返回客戶端,客戶端Ajax引擎接收,經過innerHTML 將table元素嵌入到頁面內部,其思路與案例一相似,這裏不作詳細介紹。這裏須要提出的是第二種解決方案JSON(HTML片斷容易形成返回數據帶回過多冗餘的HTML標籤元素)
JSON是一種JavaScript輕量級數據交互格式,主要應用於Ajax編程。易於人閱讀和編寫,同時也易於機器解析和生成。
格式一: {key:value,key:value,key:value } 鍵值對直接用 , 分開,鍵值之間用 : 鍵自己必須是字符串常量
{name : '張三'}
{'name':'張三'}
是等價的。
值加不加引號,是有區別的,不加引號是變量,加引號是常量字符串
格式二: [值1, 值2 ,值3 ] 數組結構
組合後複雜格式
[{name:'aaa'}, {name:'bbb'}, {name:ccc}] 表示三個對象數組
JSON應用場景: AJAX請求參數和響應數據
問題: 服務器端如何生成 json格式數據------->>依賴第三方開源類庫
③:JSON-lib的使用
是java類庫 ,支持javabean map list array轉換json格式字符串, 支持將json字符串轉換javabean對象(反過來只支持這一種,使用不多)
在使用JSON-lib時必須導入至少5個jar包
開發時咱們使用6個jar包,雙擊json-lib-all.zip便可獲取所需jar包。
1)將數組/list集合解析成JSON串
使用JSONArray能夠解析Array類型
JSONArray jsonArray = JSONArray.fromObject(list變量);
2)將Javabean/Map解析成JSON串
使用JSONObject能夠解析javabean類型
JSONObject jsonObject = JSONObject.fromObject(javabean);
3)對象屬性過濾轉換JSON串
經過JsonConfig對象配置對象哪些屬性不參與轉換。
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[]{"price"});
運行效果:
④:XML格式數據處理
練習3:select完成省級聯動
1) XStream的使用
問題:服務器端如何將java對象,生成XML格式數據?須要第三方類庫支持XStream
XStream is a simple library to serialize objects to XML and back again.
XStream主要完成Java對象的序列化(xstream-1.3.1.jar)以及解析(xpp3_min-1.1.4c.jar)
2) XStream的核心方法
Ø xStream.toXML(obj):將對象序列化XML
Ø xStream.fromXML(inputStream/xml片斷):將xml信息解析成對象
Ø xStream.alias(String name,Class):將類型解析或者序列化時,取一個別名
代碼案例:(序列化)
解析xml時,要注意別名的命名規則要與序列化時保持一致!
3) XStream註解
在Javabean中進行註解
把某屬性的名稱取別名爲city:@XStreamAlias(value="city")
註解生效:xStream.autodetectAnnotations(true);
@XStreamAsAttribute 設置變量生成屬性
@XStreamOmitField 設置變量不生成到XML
@XStreamImplicit(itemFieldName = 「hobbies」) 設置集合類型變量別名
jQuery 1.4 是企業主流版本,從jQuery1.6 開始引入大量新特性。最新版本 2.1.1,這裏講解以1.8.3爲主(新版本主要是瀏覽器兼容問題以及新特性)
jQuery 提供 jquery-1.8.3.js 和 jquery-1.8.3.min.js
jquery-1.8.3.js jQuery框架源碼,沒有被精簡,體積較大 (主要用來研究 jQuery源碼),企業開發時,須要導入 jquery-1.8.3.min.js (精簡過)
window.onload = function() {...}
等價於$(document).ready(function(){...});
①:jQuery基本使用
傳統Js寫法:
<script type="text/javascript">
window.onload = function(){
alert("傳統JS,Ok");
}
</script>
jQuery寫法:
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
alert("ok");
});
$(document).ready(function(){
alert("OK");
});
</script>
②:jQuery核心函數
1)jQuery(callback) // 頁面onload 函數
2)jQuery(expression, [context]) // 查找指定對象 ------ 九種選擇器
3)jQuery(elements) // 將dom對象轉換爲jQuery對象
* document 是DOM對象 jQuery(document) 成爲了jQuery對象
4)jQuery(html, [ownerDocument]) // 將html轉換jQuery對象
* jQuery("<p>hello</p>") ----- 獲得 jQuery對象
Demo:
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 得到div對象
var domObject = document.getElementById("mydiv"); // 得到DOM對象
domObject.innerHTML = "ITCAST";
// 經過包裝DOM對象,成爲jQuery對象
var $jQueryObject = $(domObject); // DOM對象成爲 jQuery對象
$jQueryObject.html("傳智播客"); // html()是jQuery對象的方法
// 經過訪問jQuery對象下標0 元素,得到DOM對象
var dom1 = $jQueryObject[0]; // 轉換jQuery對象爲DOM對象
var dom2 = $jQueryObject.get(0);
dom2.innerHTML = "傳智播客ITCAST";
});
</script>
<body>
<div id="mydiv">hello</div>
</body>
jQuery對象沒法使用DOM對象屬性方法,DOM對象也沒法使用jQuery對象屬性方法。可是咱們可使用jQuery提供方法,將DOM對象經過jQuery()函數包裝成爲jQuery對象,一樣咱們能夠把jQuery對象轉化成DOM對象。
jQuery--->DOM對象:$jQuery對象[0]或者$jQuery對象.get(0);
DOM對象--->jQuery:$(DOM對象)
選擇器是jQuery 的根基, 在 jQuery 中, 對事件處理, 遍歷 DOM 和 Ajax 操做都依賴於選擇器
jQuery(expression, [context]) 在覈心函數jQuery中傳入表達式,對頁面中元素進行選擇======================jQuery核心函數第二種!
①:基本選擇器
根據元素id屬性、class屬性、元素名稱 對元素進行選擇
id選擇器: $("#元素id屬性")
class選擇器:$(".元素class屬性")
元素名稱選擇器:$("元素名稱")
多個選擇器同時使用 selector1,select2 例如 : $("#xxid ,.xxxclass") 同時選擇id 和 class匹配兩類元素
練習1:
² 經過each() 在每一個div元素內容前 加入 「傳智播客」
² 經過size() / length 打印頁面中 class屬性爲 itcast 的元素數量
² 經過index() 打印 id屬性爲foo 的div標籤 是頁面內的第幾個div標籤
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 選中全部div 獲得集合
$("div").each(function(){
// 在每一個div內容前加入「傳智播客」
//this.innerHTML = "傳智播客" + this.innerHTML ;
$(this).html("傳智播客" + $(this).html());
});
// 經過size() / length 打印頁面中 class屬性爲 itcast 的元素數量
//alert($(".itcast").size());
alert($(".itcast").length);
// 經過index() 打印 id屬性爲foo 的div標籤 是頁面內的第幾個div標籤
alert($("div").index($("#foo")));
});
</script>
<body>
<div>DIVAAAA</div>
<div class="itcast">DIVBBBB</div>
<div>DIVCCCC</div>
<div>DIVDDDD</div>
<div class="itcast">DIVEEEE</div>
<div id="foo">DIVFFFF</div>
<p>PAAAA</p>
<p class="itcast">PBBBB</p>
<p>PCCCC</p>
</body>
②:層級選擇器
根據祖先、後代、父子關係、兄弟關係 進行選擇
ancestor descendant 獲取ancestor元素下邊的全部元素 $("form input")
parent > child 獲取parent元素下邊的全部直接child 子元素 $("form > input")
prev + next 獲取緊隨pre元素的後一個兄弟元素 $("label + input")
prev ~ siblings 獲取pre元素後邊的全部兄弟元素 $("form ~ input")
練習2:
² 將class屬性值爲itcast的元素下全部a元素字體變爲紅色
² 將class屬性值爲itcast的元素下直接a元素字體變爲藍色
² 將div元素後全部兄弟a元素,字體變爲黃色,大小變爲30px
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 將class屬性值爲itcast的元素下全部a元素字體變爲紅色
$(".itcast a").css("color","red");
// 將class屬性值爲itcast的元素下直接a元素字體變爲藍色
$(".itcast>a").css("color","blue");
// 將div元素後全部兄弟a元素,字體變爲黃色,大小變爲30px
$("div~a").css({color:'yellow','font-size':'30px'});
</script>
<body>
<div class="itcast">
<a>div link</a>
<p>info
<a>p link</a>
</p>
</div>
<a>link</a>
<p class="itcast">
<a>p link</a>
</p>
<a>link</a>
</body>
③:基本過濾選擇器
:first 選取第一個元素 $("tr:first")
:last 選取最後一個元素 $("tr:last")
:not(selector) 去除全部與給定選擇器匹配的元素 $("input:not(:checked)")
:even 選取全部元素中偶數索引的元素,從 0 開始計數 $("tr:even") ----- 選取奇數元素
:odd 選取全部元素中奇數索引的元素 ,從0 開始計數 $("tr:odd") ------ 選取偶數元素
:eq(index) 選取指定索引的元素 $("tr:eq(1)")
:gt(index) 選取索引大於指定index的元素 $("tr:gt(0)")
:lt(index) 選取索引小於指定index的元素 $("tr:lt(2)")
:header 選取全部的標題元素 如:h1, h2, h3 $(":header")
:animated 匹配全部正在執行動畫效果的元素
練習3:
² 設置表格第一行,顯示爲紅色
² 設置表格除第一行之外 顯示爲藍色
² 設置表格奇數行背景色 黃色
² 設置表格偶數行背景色 綠色
² 設置頁面中全部標題 顯示爲灰色
² 設置頁面中正在執行動畫效果div背景黃色,不執行動畫div背景綠色
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 設置表格第一行,顯示爲紅色
$("tr:first").css("color","red");
// 設置表格除第一行之外 顯示爲藍色
//$("tr:not(:first)").css("color","blue");
$("tr:gt(0)").css("color","blue");
// 設置表格奇數行背景色 黃色 /設置表格偶數行背景色 綠色
$("tr:even").css("background-color","yellow");
$("tr:odd").css("background-color","green");
// 設置頁面中全部標題 顯示爲灰色
$(":header").css("color","gray");
// 設置頁面中正在執行動畫效果div背景黃色,不執行動畫div背景綠色
// 沒法選中正在執行動畫的元素
$("div:not(:animated)").css("background-color","green");
$("div").click(function(){
$(this).css("background-color","yellow"); //設置執行動畫元素
});
});
</script>
<body>
<h1>表格信息</h1>
<h2>這是一張商品表</h2>
<table border="1" width="600">
<tr>
<th>商品編號</th>
<th>商品名稱</th>
<th>售價</th>
<th>數量</th>
</tr>
<tr>
<td>001</td>
<td>冰箱</td>
<td>3000</td>
<td>100</td>
</tr>
<tr>
<td>002</td>
<td>洗衣機</td>
<td>2000</td>
<td>50</td>
</tr>
<tr>
<td>003</td>
<td>熱水器</td>
<td>1500</td>
<td>20</td>
</tr>
<tr>
<td>004</td>
<td>手機</td>
<td>2188</td>
<td>200</td>
</tr>
</table>
<div>
slideDown(speed, [callback])
概述
經過高度變化(向下增大)來動態地顯示全部匹配的元素,在顯示完成後可選地觸發一個回調函數。
這個動畫效果只調整元素的高度,可使匹配的元素以「滑動」的方式顯示出來。在jQuery 1.3中,上下的padding和margin也會有動畫,效果更流暢。
參數
speedString,Number三種預約速度之一的字符串("slow", "normal", or "fast")或表示動畫時長的毫秒數值(如:1000)
callback (可選)FunctionFunction在動畫完成時執行的函數
</div>
<div>
fadeOut(speed, [callback])
概述
經過不透明度的變化來實現全部匹配元素的淡出效果,並在動畫完成後可選地觸發一個回調函數。
這個動畫只調整元素的不透明度,也就是說全部匹配的元素的高度和寬度不會發生變化。
參數
speedString,Number三種預約速度之一的字符串("slow", "normal", or "fast")或表示動畫時長的毫秒數值(如:1000)
callback (可選)Function在動畫完成時執行的函數
</div>
</body>
④:內容過濾選擇器
內容選擇器是對子元素和文本內容的操做
:contains(text) 選取包含text文本內容的元素 $("div:contains('John')") 文本內容含有john 的全部div
:empty 選取不包含子元素或者文本節點的空元素 $("td:empty") td元素必須爲空
:has(selector) 選取含有選擇器所匹配的元素的元素 $("div:has(p)").addClass("test"); 含有p子元素的div
:parent 選取含有子元素或文本節點的元素 $("td:parent") 全部不爲空td元素選中
練習4:
² 設置含有文本內容 」傳智播客」 的 div 的字體顏色爲紅色
² 設置沒有子元素的div元素 文本內容 」這是一個空DIV「
² 設置包含p元素 的 div 背景色爲黃色
² 設置全部含有子元素的span字體爲藍色
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 設置含有文本內容 」傳智播客」 的 div 的字體顏色爲紅色
$("div:contains('傳智播客')").css("color","red");
// 設置沒有子元素的div元素 文本內容 」這是一個空DIV「
$("div:empty").html('這是一個空DIV');
// 設置包含p元素 的 div 背景色爲黃色
$("div:has(p)").css("background-color","yellow");
// 設置全部含有子元素的span字體爲藍色
$("span:parent").css("color","blue");
</script>
<body>
<div>今天是個晴天</div>
<div>明天要去傳智播客學 java</div>
<div><span>JavaScript</span> 是網頁開發中腳本技術</div>
<div>Ajax 是異步的 JavaScript和 XML</div>
<div> <p>jQuery</p> 是 JavaScript一個 輕量級框架</div>
<div></div>
</body>
⑤:可見性過濾選擇器
根據元素的可見與不可見狀態來選取元素
:hidden 選取全部不可見元素 $("tr:hidden")
:visible 選取全部可見的元素 $("tr:visible")
練習5:
² 爲表單中全部隱藏域 添加 class屬性,值爲itcast
² 設置table全部 可見 tr 背景色 黃色
² 設置table全部 隱藏tr 字體顏色爲紅色,顯示出來 ,並輸出tr中文本值
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
// 爲表單中全部隱藏域 添加 class屬性,值爲itcast
$("input:hidden").