Json和Ajax
Json和Ajax
文章目錄
- Json和Ajax
- 一、jquery元素節點操作
- 1.文本內容的操作
- 2.HTML內容的操作
- 3.對元素值的操作
- 4.對于DOM節點的操作
- 5.修改CSS樣式
- 6.修改CSS的屬性
- 7.滾輪事件與函數節流
- 二、Json
- 1.json
- 2.json中的五種寫法:
- 三、ajax
- 1.簡介
- 2.常用參數簡介
- 四、Jsonp
- 1.jsonp
- 2.JSONP的優點是:
- 3.JSONP的缺點則是:
- 4.JQUERY對JSONP的支持
一、jquery元素節點操作
1.文本內容的操作
- 方法:①text() ②text(val)
例子:
$div = $(‘div’) //獲取div元素 Console.log($div.text()) //獲取文本內容 $div.text(“aaaaa”) //設置了文本的內容2.HTML內容的操作
- ①html():用于獲取第一個匹配元素的HTML內容
- ②html(val):用于設置全部匹配元素的HTML內容
注意:內容中包含HTML代碼可以被瀏覽器解析
3.對元素值的操作
主要對于input、check、radio元素
- ①val() //獲取值
- ②val(“”) //設置值
4.對于DOM節點的操作
- ①創建元素節點:
- ②插入節點:
- ③刪除節點:
- ④復制節點
- ⑤替換節點
- ⑥遍歷節點
- ⑦包裹節點:
5.修改CSS樣式
addClass(class)removeClass(class)toggleClass(class):若有這個class類就刪除,若無就添加6.修改CSS的屬性
方法:css(attr,value) 示例:$(“#btn”).bind(“click”,function(){$(“#box2”).css(“background-color”,”red”) //修改背景顏色的屬性console.log($(“#box2”).css(“background-color”)) //獲取值})7.滾輪事件與函數節流
- jquery.mousewheel插件使用
jquery中沒有鼠標滾輪事件,原生js中的鼠標滾輪事件不兼容,可以使用jquery的滾輪事件插件jquery.mousewheel.js。
- 函數節流
javascript中有些事件的觸發頻率非常高,比如onresize事件(jq中是resize),onmousemove事件(jq中是mousemove)以及上面說的鼠標滾輪事件,在短事件內多處觸發執行綁定的函數,可以巧妙地使用定時器來減少觸發的次數,實現函數節流。
二、Json
與json對象不同的是,json數據格式的屬性名稱和字符串值需要用雙引號引起來,用單引號或者不用引號會導致讀取數據錯誤。
1.json
- JSON(JavaScript Object Notation)一種簡單的數據格式,比xml更輕巧。JSON是JavaScript原生格式,這意味著在JavaScript中處理JSON數據不需要任何特殊的API或工具包。
- JSON的規則很簡單:對象是一個無序的“‘名稱:值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值'對”之間使用“,”(逗號)分隔。
規則如下:
- 1)映射用冒號(“:”)表示。名稱:值
- 2)并列的數據之間用逗號(“,”)分隔。名稱1:值1,名稱2:值2
- 3) 映射的集合(對象)用大括號(“{}”)表示。{名稱1:值1,名稱2:值2}
- 4) 并列數據的集合(數組)用方括號(“[]”)表示。
- 5 )元素值可具有的類型:string, number, object, array, true, false, null
2.json中的五種寫法:
- 1)傳統方式存儲數據,調用數據
代碼如下:
<script type="text/javascript"> //JS傳統方式下定義"類" function Person(id,name,age){ this.id = id; this.name = name; this.age = age; } //JS傳統方式下創建"對象" var p = new Person(20141028,"一葉扁舟",22); //調用類中的屬性,顯示該Person的信息 window.alert(p.id); window.alert(p.name); window.alert(p.age); </script>- 2)第一種樣式:
代碼如下:
<script type="text/javascript"> var person = { id:001, name:"一葉扁舟", age:23 } window.alert("編號:"+person.id); window.alert("用戶名:"+person.name); window.alert("年齡:"+person.age); </script>- 3)第二種樣式:
代碼如下:
<script type="text/javascript"> var p = [ {id:001,name:"一葉扁舟",age:22}, {id:002,name:"無悔",age:23}, {id:003,name:"無悔_一葉扁舟",age:24} ]; for(var i = 0; i < p.length; i++){ window.alert("編號:"+p[i].id); window.alert("用戶名:"+p[i].name); window.alert("年齡:"+p[i].age);} </script>- 4)第三種樣式:
代碼如下:
<script type="text/javascript"> var p = { "province":[ {"city":"福州"}, {"city":"廈門"}, {"city":"莆田"} ] }; window.alert("所在城市:" + p.province[0].city); </script>- 5)第四種樣式:
代碼如下:
<script type="text/javascript"> var p = { "ids":[ {"id":001}, {"id":002}, {"id":003} ], "names":[ {"name":"一葉扁舟"}, {"name":"無悔"}, {"name":"無悔_一葉扁舟"} ] }; for(var i = 0; i < p.names.length; i++){ window.alert("名字:"+p.names[i].name);} for(var i = 0; i < p.ids.length; i++){ window.alert("id:"+p.ids[i].id); }</script>- 6)第五種樣式:
代碼如下:
<script type="text/javascript"> var p = { "province":["福州","廈門","莆田"] }; window.alert("城市的個數:"+p.province.length); window.alert("分別是:\n"); for(var i=0;i<p.province.length;i++){ window.alert(p.province[i]); } </script>三、ajax
1.簡介
- ajax技術的目的是讓javascript發送http請求,與后臺通信,獲取數據和信息。ajax技術的原理是實例化xmlhttp對象,使用此對象與后臺通信。ajax通信的過程不會影響后續javascript的執行,從而實現異步
- 同步和異步
- 現實生活中,同步指的是同時做幾件事情, 異步指的是做完一件事后再做另外一件事,
- 程序中的同步和異步是把現實生活中的概念對調,也就是程序中的異步指的是現實生活中的同步,程序中的同步指的是現實生活中的異步。
- 局部刷新和無刷新
- ajax可以實現局部刷新,也叫做無刷新,無刷新指的是整個頁面不刷新,只是局部刷新,ajax可以自己發送http請求,不用通過瀏覽器的地址欄,所以頁面整體不會刷新,
- ajax獲取到后臺數據,更新頁面顯示數據的部分,就做到了頁面局部刷新。
- 同源策略
- ajax請求的頁面或資源只能是同一個域下面的資源,不能是其他域的資源,這是在設計ajax時基于安全的考慮。特征報錯提示
- 常用參數
- 以前的寫法:
- 新的寫法(推薦):
2.常用參數簡介
- 1.url
說明:發送請求的地址(默認為當前頁面),要求是String類型的參數,比如是.net下,"~wexin(控制器)/getweinxinmenu(動作)",
- 2.type
說明:請求方法(post或者get),默認是get,要求是String類型的參數。其他的htpp請求如(put、delete)等也支持,但是要瀏覽器支持
- 3.timeout
說明:設置請求超時時間(毫秒),要求是number類型的參數。此設置將覆蓋$.ajaxSetup()方法的全局設置。
- 4.async
說明:默認值為true,所有請求是異步,要求是Bool類型的參數,如果需要發送同步請求,將此項設置為false。注意:同步時瀏覽器會被鎖住。
- 5.cache
說明:默認為true(當datatype為script時,默認為false)從瀏覽器緩存中加載請求信息,要求是Bool類型的參數。
-
6.data
-
說明:發送到服務器的數據,要求是Object或string類型的參數。如果已經不是字符串,將自動轉換為字符串格式。
-
get請求中將附加在url后。防止這種自動轉換,可以查看processData選項。
-
對象必須為key/value格式,例如{foo1:“bar1”,foo2:“bar2”}轉換&foo1=bar1&foo2=bar2。如果是數組,JQuery將自動為不同值對應同一個名稱。
-
例如{foo:[“bar1”,“bar2”]}轉換為&foo=bar1&foo=bar2。
-
7.dataType:
-
說明:預期服務器返回的數據類型,要求為String類型的參數。如果不指定,
-
JQuery將自動根據http包mime信息返回responseXML或responseText,并作為回調函數參數傳遞。可用的類型如下:
- 8.beforeSend:
- 說明:發送請求前可以修改XMLHttpRequest對象的函數(也可以修改頁面一下信息),例如添加自定義HTTP頭
- 要求為Function類型的參數。在beforeSend中如果返回false可以取消本次ajax請求。XMLHttpRequest對象是惟一的參數。
- 9.complete:
- 說明:請求完成后調用的回調函數(請求成功或失敗時均調用)。
- 要求為Function類型的參數,參數:XMLHttpRequest對象和一個描述成功請求類型的字符串。
- 10.success:
說明:請求成功后調用的回調函數,要求為Function類型的參數,有兩個參數。
- (1)由服務器返回,并根據dataType參數進行處理后的數據。
- (2)描述狀態的字符串。
- 11.error:
**說明:請求失敗時被調用的函數。要求為Function類型的參數,**該函數有3個參數,即XMLHttpRequest對象、錯誤信息、捕獲的錯誤對象(可選)。ajax事件函數如下:
function(XMLHttpRequest, textStatus, errorThrown){//通常情況下textStatus和errorThrown只有其中一個包含信息this; //調用本次ajax請求時傳遞的options參數}- 12.contentType:
說明:內容編碼類型。要求為String類型的參數,當發送信息至服務器時,內容編碼類型默認為"application/x-www-form-urlencoded"。該默認值適合大多數應用場合。
- 13.dataFilter:
說明:給Ajax返回的原始數據進行預處理的函數。要求為Function類型的參數,提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。
function(data, type){//返回處理后的數據return data;}- 15.global:
要求為Boolean類型的參數,默認為true。表示是否觸發全局ajax事件。設置為false將不會觸發全局ajax事件,ajaxStart或ajaxStop可用于控制各種ajax事件。
- 16.ifModified:
要求為Boolean類型的參數,默認為false。僅在服務器數據改變時獲取新數據。服務器數據改變判斷的依據是Last-Modified頭信息。默認值是false,即忽略頭信息。
- 17.jsonp:
**要求為String類型的參數,在一個jsonp請求中重寫回調函數的名字。該值用來替代在"callback=?"這種GET或POST請求中URL參數里的"callback"部分,**例如
{jsonp:'onJsonPLoad'}會導致將"onJsonPLoad=?"傳給服務器。- 18.username:
要求為String類型的參數,用于響應HTTP訪問認證請求的用戶名。
- 19.password:
要求為String類型的參數,用于響應HTTP訪問認證請求的密碼。
- 20.processData
要求為Boolean類型的參數,默認為true。默認情況下,發送的數據將被轉換為對象(從技術角度來講并非字符串)以配合默認內容類型"application/x-www-form-urlencoded"。如果要發送DOM樹信息或者其他不希望轉換的信息,請設置為false。
- 21.scriptCharset:
要求為String類型的參數,只有當請求時dataType為"jsonp"或者"script",并且type是GET時才會用于強制修改字符集(charset)。通常在本地和遠程的內容編碼不同時使用。
- 22.$.each()函數:
$.each()函數不同于JQuery對象的each()方法,它是一個全局函數,不操作JQuery對象,而是以一個數組或者對象作為第1個參數,以一個回調函數作為第2個參數。回調函數擁有兩個參數:第1個為對象的成員或數組的索引,第2個為對應變量或內容。
- 23.案例代碼:
- $.ajax驗證登錄:
- 一般處理程序
四、Jsonp
1.jsonp
- 在同源策略下,在某個服務器下的頁面是無法獲取到該服務器以外的數據的,即一般的 ajax是不能進行跨域請求的。但 img、iframe 、script等標簽是個例外,這些標簽可以通過 src屬性請求到其他服務器上的數據。
- 利用 script標簽的開放策略,我們可以實現跨域請求數據,當然這需要服務器端的配合。
- ajax只能請求同一個域下的數據或資源,有時候需要跨域請求數據,就需要用到jsonp技術,jsonp可以跨域請求數據,它的原理主要是利用了<script>標簽可以跨域鏈接資源的特性。jsonp和ajax原理完全不一樣,不過jquery將它們封裝成同一個函數。
- Jquery中ajax 的核心是通過 XmlHttpRequest獲取非本頁內容,而jsonp的核心則是動態添加 <script>標簽來調用服務器提供的 js腳本。
- 當我們正常地請求一個JSON數據的時候,服務端返回的是一串 JSON類型的數據,而我們使用 JSONP模式來請求數據的時候服務端返回的是一段可執行的 JavaScript代碼。
- 因為jsonp 跨域的原理就是用的動態加載 script的src ,所以我們只能把參數通過 url的方式傳遞, 所以jsonp的 type類型只能是get !
示例:
其實jquery 內部會轉化成
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron 然后動態加載 <script type="text/javascript"src="http://192.168.1.114/yii/demos/test.php?backfunc= jQuery2030038573939353227615_1402643146875&action=aaron"></script>- 然后后端就會執行backfunc(傳遞參數 ),把數據通過實參的形式發送出去。
- 使用JSONP 模式來請求數據的整個流程:客戶端發送一個請求,規定一個可執行的函數名(這里就是 jQuery做了封裝的處理,自動幫你生成回調函數并把數據取出來供success屬性方法來調用,而不是傳遞的一個回調句柄)
- 服務器端接受了這個 backfunc函數名,然后把數據通過實參的形式發送出去
- (在jquery 源碼中, jsonp的實現方式是動態添加<script>標簽來調用服務器提供的 js腳本。jquery 會在window對象中加載一個全局的函數,當 <script>代碼插入時函數執行,執行完畢后就 <script>會被移除。同時jquery還對非跨域的請求進行了優化,如果這個請求是在同一個域名下那么他就會像正常的 Ajax請求一樣工作。)
2.JSONP的優點是:
它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調用callback的方式回傳結果。
3.JSONP的缺點則是:
- 它只支持GET請求而不支持POST等其它類型的HTTP請求;
- 它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。
- 沒有關于 JSONP調用的錯誤處理。
- 如果動態腳本插入有效,就執行調用;如果無效,就靜默失敗。
- 失敗是沒有任何提示的。例如,不能從服務器捕捉到404 錯誤,也不能取消或重新開始請求。不過,等待一段時間還沒有響應的話,就不用理它了。
4.JQUERY對JSONP的支持
從JQery 1.2以后,就開始支持JSONP的調用。JQuery對前臺做了很好的處理如自動生成全局回調函數等,但后臺還需要開發人員自己實現
$.getJSON("http://跨域的dns/xxx.do?callback=?",function(json){ // 業務邏輯執行代碼 });請求URL
$.ajax({url:"http://xxx.com/rest.do",dataType:"jsonp", //必須指定jsonp : "c", //若不指定則默認為callbackjsonpCallback:"test",//若不指定則Jquery自己生成隨機的名稱success:function(data){//業務邏輯執行代碼} });- 當dataType為JSONP時,JQUERY會為用戶生成一個全局函數名稱為jsonpCallback參數的值,這個函數內部調用了success方法JQUERY的實現原理及步驟
- 以GET方式請求目標地址,并在URL中拼接以jsonp參數值為key,以jsonpCallback值為value的參數
- 請求返回回調函數數據
- 觸發調用全局的回調函數,在全局函數回調中調用success方法并將數據傳遞給success方法
總結
- 上一篇: JQuery属性、事件相关操作
- 下一篇: 本地存储和移动端js框架及bootstr