這篇文章主要介紹了Jquery ajax基礎教程的相關資料,需要的朋友可以參考下
jQuery的Ajax帶來了無需刷新的web頁面革命。這里就詳細介紹一下jQuery所涉及到的Ajax操作。(無需特殊說明,均需要有服務器配置,這里本人用的是Tomcat 7)
1.基于請求加載文件數據
這里的請求通常都是網頁的某些操作,如點擊等。
而其加載數據的類型歸類為以下四種:a.加載HTML文件;b.加載JSON文件;c.加載Javascript文件;d.加載XML文件。
其對應的四種加載方法分別是:load、getJSON、getScript、get。
a.加載HTML文件
把編寫好的HTML文件加載到網頁中。例如:
- //load方法加載html文件
- $('#letter-a a').click(function(){
- $('#dictionary').load('a.html');
- return false;
- });
這里a.html也是放在服務器端的一個已經編寫好的頁面文件,直接調用load,就可以讓所匹配的目標內載入HTML內容。
b.加載JSON文件
把編寫好的JSON文件加載到網頁中。例如:
- //加載json文件
- $('#letter-b a').click(function(){
- $.getJSON('b.json',function(data){
- var html = '';
- $.each(data,function(entryIndex, entry){
- html += "<div class='entry'>";
- html += "<h3 class='term'>" + entry.term + "</h3>";
- html += "<div class='part'>" + entry.part + "</div>";
- html += "<div class='definition'>";
- html += entry.definition;
- if(entry.quote){
- html += '<div class="quote">';
- $.each(entry.quote, function(lineIndex, line){
- html += '<div class="quote-line">' + line + '</div>';
- });
- if(entry.author){
- html += '<div class="quote-author">' + entry.author + '</div>';
- }
- }
- html += "</div>";
- html += "</div>";
- });
- $('#dictionary').html(html);
- });
- return false;
- });
getJSON方法第一個參數是指加載的文件路徑,第二個參數是一個加載完成以后的回調函數。通過這個回調函數,就可以對加載好的data進行操作。重復的部分使用each循環處理。最后將拼湊好的html字符串使用html方法加入到目標id=dictionary的元素中。
c.加載Javascript文件
加載Javascript文件和加載HTML文件類似。這里需要注意的是,使用getScript方法加載進來的Javascript會根據當下Javascript環境直接運行。例如:
- //執行腳本
- $('#letter-c a').click(function(){
- $.getScript('c.js');
- return false;
- });
d.加載XML文件
jQuery中可以使用get方法加載XML文件。例如:
- //加載XML文檔
- $('#letter-d a').click(function(){
- $.get('d.xml',function(data){
- $('#dictionary').empty();
- $(data).find('entry').each(function(){
- var $entry = $(this);
- var html = '<div class="entry">';
- html += '<h3 class="term">' + $entry.attr('term') + '</h3>';
- html += '<div class="part">' + $entry.attr('part') + '</div>';
- html += '<div class="definition">';
- html += $entry.find('definition').text();
- var $quote = $entry.find('quote');
- if($quote.length)
- {
- html += '<div class="quote">';
- $quote.find('line').each(function(){
- html += '<div class="quote-line">';
- html += $(this).text() + '</div>';
- });
- if($quote.attr('author')){
- html += '<div class="quote-author">';
- html += $quote.attr('author') + '</div>';
- }
- html += '</div>';
- }
- html += '</div>';
- html += '</div>';
- $('#dictionary').append($(html));
- });
- });
- return false;
- });
XML文件有一個特點就是,你可以像用jQuery操作HTML那樣操作XML的那些元素。如使用attr方法、text方法等等。
2.基于Get方法向服務器獲取數據
之前的例子都是從服務器上靜態的獲取數據文件。而Ajax的價值不只于此,通過get方法從服務器動態的獲取數據,為web頁面無刷新的實現提供了莫大的幫助。
下面就使用get方法從服務器獲取一段所需要的數據。這里,本人結合J2EE的Struts2框架和TOMCAT搭建的服務器端。具體服務器端多種多樣,可以是php+apache或者其他什么的都可以。
操作如下,用戶點擊Eavesdrop則發送get方法到服務器,取得Eavesdrop的數據,并且返回json值,然后在jQuery中裝配。
代碼如下:
- //GET方法加載服務器內容
- $('#letter-e a').click(function(){
- var requestData = {term:$(this).text().toUpperCase()};
- $.get('EGet.action', requestData, function(data){
- //返回的數據包結構根據Struts2配置如下:
- //{"resultMSG":"{ 內部另一個json結構 }","success":"true"}
- //先將返回的數據包拆包
- var responseObj = eval("("+data+")");
- if(responseObj.success == 'true')
- {
- $('#dictionary').empty();
- //返回成功,接下來再次解包resultMSG
- var dataObj = eval("("+responseObj.resultMSG+")");
- var html = "";
- html += "<div class='entry'>";
- html += "<h3 class='term'>" + dataObj.term + "</h3>";
- html += "<div class='part'>" + dataObj.part + "</div>";
- html += "<div class='definition'>";
- html += dataObj.definition;
- if(dataObj.quote){
- html += '<div class="quote">';
- $.each(dataObj.quote, function(lineIndex, line){
- html += '<div class="quote-line">' + line + '</div>';
- });
- if(dataObj.author){
- html += '<div class="quote-author">' + dataObj.author + '</div>';
- }
- }
- html += "</div>";
- html += "</div>";
- $('#dictionary').html(html);
- }
- else
- {
- var $warning = $('<div>Sorry, your term was not found!</div>');
- $('#dictionary').html($warning);
- }
- });
- return false;
- });
這里要說明的是由于struts2配置,返回的時候在需要的數據外又打了一層包,用于表示結果內容的resultMSG和是否ajax訪問成功的success字段。所以使用了2次eval解包。
這里我后臺java程序傳遞過來的并非配置好的HTML,而是僅僅是json類型的數據,本人認為在java層面編寫html并傳遞不如直接傳遞數據方便,以后修改樣式或者頁面結構也都不如直接修改javascript方便。
通過get方法獲得服務器數據,相當于向服務器提交如下這種請求:EGet.action?term=XXX
下面放出java后臺文件代碼:
1.EGet.java
- package lhb;
- import com.opensymphony.xwork2.ActionSupport;
- public class EGet extends ActionSupport
- {
- private String term;
- private Terms sampleTerm;
- private String success;
- private String resultMSG;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- public String execute() throws Exception
- {
- initData();
- if(term.equals(sampleTerm.getTerm()))
- {
- success = "true";
- resultMSG = "{/"term/": /""+sampleTerm.getTerm()+"/","+
- "/"part/": /""+sampleTerm.getPart()+"/","+
- "/"definition/": /""+sampleTerm.getDefinition()+"/","+
- "/"quote/": ["+
- "/"Is public worship, then, a sin,/","+
- "/"That for devotions paid to Bacchus/","+
- "/"The lictors dare to run us in,/","+
- "/"And resolutely thump and whack us?/""+
- "],"+
- "/"author/": /""+sampleTerm.getAuthor()+"/"}";
- }
- else{
- success = "false";
- resultMSG = "fail";
- }
- return SUCCESS;
- }
- //初始化數據
- private void initData()
- {
- String partEAVESDROP = "v.i.";
- String definitionEAVESDROP = "Secretly to overhear a catalogue of the crimes and vices of another or yourself.";
- String quoteEAVESDROP[] = {"A lady with one of her ears applied",
- "To an open keyhole heard, inside,",
- "Two female gossips in converse free —",
- "The subject engaging them was she.",
- "/"I think,/" said one, /"and my husband thinks",
- "That she's a prying, inquisitive minx!/"",
- "As soon as no more of it she could hear",
- "The lady, indignant, removed her ear.",
- "/"I will not stay,/" she said, with a pout,",
- "/"To hear my character lied about!/""};
- String authorEAVESDROP = "Gopete Sherany";
- Terms EAVESDROP = new Terms();
- EAVESDROP.setTerm("EAVESDROP");
- EAVESDROP.setPart(partEAVESDROP);
- EAVESDROP.setDefinition(definitionEAVESDROP);
- EAVESDROP.setQuote(quoteEAVESDROP);
- EAVESDROP.setAuthor(authorEAVESDROP);
- sampleTerm = EAVESDROP;
- }
- public String getTerm()
- {
- return term;
- }
- public void setTerm(String term)
- {
- this.term = term;
- }
- public String getSuccess()
- {
- return success;
- }
- public void setSuccess(String success)
- {
- this.success = success;
- }
- public String getResultMSG()
- {
- return resultMSG;
- }
- public void setResultMSG(String resultMSG)
- {
- this.resultMSG = resultMSG;
- }
- }
這個action中的數據本人直接配置了,這里只是做一個示范使用。真正的這些數據在項目中一般是存放在數據庫中的。由于這主要是jQuery方面的小示例,就不弄那么麻煩了。
2.Terms.java
- package lhb;
- public class Terms
- {
- private String term;
- private String part;
- private String definition;
- private String quote[];
- private String author;
- public String getTerm()
- {
- return term;
- }
- public void setTerm(String term)
- {
- this.term = term;
- }
- public String getPart()
- {
- return part;
- }
- public void setPart(String part)
- {
- this.part = part;
- }
- public String getDefinition()
- {
- return definition;
- }
- public void setDefinition(String definition)
- {
- this.definition = definition;
- }
- public String[] getQuote()
- {
- return quote;
- }
- public void setQuote(String[] quote)
- {
- this.quote = quote;
- }
- public String getAuthor()
- {
- return author;
- }
- public void setAuthor(String author)
- {
- this.author = author;
- }
- }
這個類純粹就是一個pojo類。沒有什么特別的方法。
3.struts.xml
這個是struts2的json方式傳遞配置
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
- "http://struts.apache.org/dtds/struts-2.3.dtd">
- <struts>
- <!-- 指定全局國際化資源文件 -->
- <constant name="struts.custom.i18n.resources" value="i18n"/>
- <!-- 指定國際化編碼所使用的字符集 -->
- <constant name="struts.i18n.encoding" value="GBK"/>
- <!-- JSON的action -->
- <package name="jsonInfo" extends="json-default">
- <action name="EGet" class="lhb.EGet">
- <result type="json">
- <param name="contentType">text/html</param>
- <param name="includeProperties">success, resultMSG</param>
- </result>
- </action>
- </package>
- </struts>
這里可以看到includeProperties里所配置的外面一層json,success和resultMSG。這在實際中很好用。如果服務器中沒有取得需要的值,雖然ajax訪問成功,但是獲得的結果并不算成功,因為沒有取得需要的值。這里加入了success標示,方便前臺jQuery操作。
基于其他方法獲取服務器數據從寫法上與get基本一致,如post方法、load方法。這里就不再贅述了。
3.動態提交表單
通過jQuery的AJAX支持,可以讓我們很方便的動態提交表單而不用刷新頁面。
如下面例子:
- $('#letter-f form').submit(function(){
- //調用preventDefault方法阻止事件冒泡,具體工作就是如果網頁有腳本錯誤,那么則會阻止提交form表單
- event.preventDefault();
- var formValues = $('input[id="term"]').val();
- var requestStr = {'term':formValues.toUpperCase()};
- $.get('EGet.action', requestStr, function(data){
- var responseObj = $.parseJSON(data);
- if(responseObj.success == 'true')
- {
- var html = '';
- var dataObj = $.parseJSON(responseObj.resultMSG);
- html += "<div class='entry'>";
- html += "<h3 class='term'>" + dataObj.term + "</h3>";
- html += "<div class='part'>" + dataObj.part + "</div>";
- html += "<div class='definition'>";
- html += dataObj.definition;
- if(dataObj.quote){
- html += '<div class="quote">';
- $.each(dataObj.quote, function(lineIndex, line){
- html += '<div class="quote-line">' + line + '</div>';
- });
- if(dataObj.author){
- html += '<div class="quote-author">' + dataObj.author + '</div>';
- }
- }
- html += "</div>";
- html += "</div>";
- $('#dictionary').html(html);
- }
- else{
- var warning = $('Sorry, your term was not found!');
- $('#dictionary').html(warning);
- }
- });
- });
這個例子援引的數據還是上一個EGet.action所用的那個數據。程序的操作過程基本是:
首先調用這個 preventDefault();這個方法在注釋里也說明了,用于阻止事件冒泡帶來的不便與麻煩。
接下來通過$()獲得input的元素,使用val方法獲得其值,接下來的使用方法與上例基本相同。
這里也可以使用serialize方法將input元素序列化成如下格式“term=xxx”這樣。不過由于服務器端的java程序中的那些數據時硬編碼的,所有,不是太方便用,就沒用。
4.關于Ajax的觀察員函數
jQuery包含了2個全局的ajax觀察員函數:ajaxStart和ajaxStop。
分別在執行ajax操作的起始和結束時調用。例如:
- //ajax的觀察員函數 ajaxStart 和 ajaxStop
- $('<div id="loading">Loading...</div>').insertBefore('#dictionary')
- .ajaxStart(function(){
- $(this).show();
- }).ajaxStop(function(){
- $(this).hide();
- });
這里無論哪個a標簽觸發ajax操作,包括靜態載入文件和動態服務器訪問,都會觸發ajaxStart和ajaxStop。
關于錯誤處理,常用的三個函數:success、complete、error。
下面以error為例:
- .error(function(jqXHR){
- $('#dictionary').html('An Error occurred:'+ jqXHR.status).append(jqXHR.responseText);
- });
可以以連綴的寫法將error方法放置于get方法之后:“$.get().error()”這樣。
剛才看了一下,這個可以將Tomcat的報錯,加載到頁面之上。這在有的時候還是很有用的。如圖:
不過不知道為何這個將我原有樣式也覆蓋了一些,如果有哪位網友知道,麻煩指正一下問題所在。謝謝了。
5.Ajax和事件
Ajax動態訪問服務器以后生成的元素,如果想綁定事件的話,一種方法是每次取到都重新綁定處理程序,這種相對來說比較簡單,但是不適合DOM結構經常變化的場景。如果DOM結構經常變化,那么就需要用live方法,實現事件委托。
live用法與bind一樣。
關于jquery ajax基礎教程今天小編就給大家介紹到這里,后續還會持續給大家介紹,希望大家繼續關注腳本之家網站,有你們的關注我們會做的更好,謝謝!
新聞熱點
疑難解答
圖片精選