首页 > 开发 > AJAX > 正文

Jquery ajax基础教程

2024-09-01 08:33:04
字体:
来源:转载
供稿:网友

这篇文章主要介绍了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文件加载到网页中。例如:

 

 
  1. //load方法加载html文件  
  2. $('#letter-a a').click(function(){  
  3. $('#dictionary').load('a.html');  
  4. return false;  
  5. }); 

这里a.html也是放在服务器端的一个已经编写好的页面文件,直接调用load,就可以让所匹配的目标内载入HTML内容。

b.加载JSON文件

把编写好的JSON文件加载到网页中。例如:

 

 
  1. //加载json文件  
  2. $('#letter-b a').click(function(){  
  3. $.getJSON('b.json',function(data){  
  4. var html = '';  
  5. $.each(data,function(entryIndex, entry){  
  6. html += "<div class='entry'>";  
  7. html += "<h3 class='term'>" + entry.term + "</h3>";  
  8. html += "<div class='part'>" + entry.part + "</div>";  
  9. html += "<div class='definition'>";  
  10. html += entry.definition;  
  11. if(entry.quote){  
  12. html += '<div class="quote">';  
  13. $.each(entry.quote, function(lineIndex, line){  
  14. html += '<div class="quote-line">' + line + '</div>';  
  15. });  
  16. if(entry.author){  
  17. html += '<div class="quote-author">' + entry.author + '</div>';  
  18. }  
  19. }  
  20. html += "</div>";  
  21. html += "</div>";  
  22. });  
  23. $('#dictionary').html(html);  
  24. });  
  25. return false;  
  26. }); 

getJSON方法第一个参数是指加载的文件路径,第二个参数是一个加载完成以后的回调函数。通过这个回调函数,就可以对加载好的data进行操作。重复的部分使用each循环处理。最后将拼凑好的html字符串使用html方法加入到目标id=dictionary的元素中。

c.加载Javascript文件

加载Javascript文件和加载HTML文件类似。这里需要注意的是,使用getScript方法加载进来的Javascript会根据当下Javascript环境直接运行。例如:

 

 
  1. //执行脚本  
  2. $('#letter-c a').click(function(){  
  3. $.getScript('c.js');  
  4. return false;  
  5. }); 

d.加载XML文件

jQuery中可以使用get方法加载XML文件。例如:

 

 
  1. //加载XML文档  
  2. $('#letter-d a').click(function(){  
  3. $.get('d.xml',function(data){  
  4. $('#dictionary').empty();  
  5. $(data).find('entry').each(function(){  
  6. var $entry = $(this);  
  7. var html = '<div class="entry">';  
  8. html += '<h3 class="term">' + $entry.attr('term') + '</h3>';  
  9. html += '<div class="part">' + $entry.attr('part') + '</div>';  
  10. html += '<div class="definition">';  
  11. html += $entry.find('definition').text();  
  12. var $quote = $entry.find('quote');  
  13. if($quote.length)  
  14. {  
  15. html += '<div class="quote">';  
  16. $quote.find('line').each(function(){  
  17. html += '<div class="quote-line">';  
  18. html += $(this).text() + '</div>';  
  19. });  
  20. if($quote.attr('author')){  
  21. html += '<div class="quote-author">';  
  22. html += $quote.attr('author') + '</div>';  
  23. }  
  24. html += '</div>';  
  25. }  
  26. html += '</div>';  
  27. html += '</div>';  
  28. $('#dictionary').append($(html));  
  29. });  
  30. });  
  31. return false;  
  32. }); 

XML文件有一个特点就是,你可以像用jQuery操作HTML那样操作XML的那些元素。如使用attr方法、text方法等等。

2.基于Get方法向服务器获取数据

之前的例子都是从服务器上静态的获取数据文件。而Ajax的价值不只于此,通过get方法从服务器动态的获取数据,为web页面无刷新的实现提供了莫大的帮助。

下面就使用get方法从服务器获取一段所需要的数据。这里,本人结合J2EE的Struts2框架和TOMCAT搭建的服务器端。具体服务器端多种多样,可以是php+apache或者其他什么的都可以。

操作如下,用户点击Eavesdrop则发送get方法到服务器,取得Eavesdrop的数据,并且返回json值,然后在jQuery中装配。

代码如下:

 

 
  1. //GET方法加载服务器内容  
  2. $('#letter-e a').click(function(){  
  3. var requestData = {term:$(this).text().toUpperCase()};  
  4. $.get('EGet.action', requestData, function(data){  
  5. //返回的数据包结构根据Struts2配置如下:  
  6. //{"resultMSG":"{ 内部另一个json结构 }","success":"true"}  
  7. //先将返回的数据包拆包  
  8. var responseObj = eval("("+data+")");  
  9. if(responseObj.success == 'true')  
  10. {  
  11. $('#dictionary').empty();  
  12. //返回成功,接下来再次解包resultMSG  
  13. var dataObj = eval("("+responseObj.resultMSG+")");  
  14. var html = "";  
  15. html += "<div class='entry'>";  
  16. html += "<h3 class='term'>" + dataObj.term + "</h3>";  
  17. html += "<div class='part'>" + dataObj.part + "</div>";  
  18. html += "<div class='definition'>";  
  19. html += dataObj.definition;  
  20. if(dataObj.quote){  
  21. html += '<div class="quote">';  
  22. $.each(dataObj.quote, function(lineIndex, line){  
  23. html += '<div class="quote-line">' + line + '</div>';  
  24. });  
  25. if(dataObj.author){  
  26. html += '<div class="quote-author">' + dataObj.author + '</div>';  
  27. }  
  28. }  
  29. html += "</div>";  
  30. html += "</div>";  
  31. $('#dictionary').html(html);  
  32. }  
  33. else 
  34. {  
  35. var $warning = $('<div>Sorry, your term was not found!</div>');  
  36. $('#dictionary').html($warning);  
  37. }  
  38. });  
  39. return false;  
  40. }); 

这里要说明的是由于struts2配置,返回的时候在需要的数据外又打了一层包,用于表示结果内容的resultMSG和是否ajax访问成功的success字段。所以使用了2次eval解包。

这里我后台java程序传递过来的并非配置好的HTML,而是仅仅是json类型的数据,本人认为在java层面编写html并传递不如直接传递数据方便,以后修改样式或者页面结构也都不如直接修改javascript方便。

通过get方法获得服务器数据,相当于向服务器提交如下这种请求:EGet.action?term=XXX

下面放出java后台文件代码:

1.EGet.java

 

 
  1. package lhb;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. public class EGet extends ActionSupport  
  4. {  
  5. private String term;  
  6. private Terms sampleTerm;  
  7. private String success;  
  8. private String resultMSG;  
  9. /**  
  10.  
  11. */ 
  12. private static final long serialVersionUID = 1L;  
  13. public String execute() throws Exception  
  14. {  
  15. initData();  
  16. if(term.equals(sampleTerm.getTerm()))  
  17. {  
  18. success = "true";  
  19. resultMSG = "{/"term/": /""+sampleTerm.getTerm()+"/","+  
  20. "/"part/": /""+sampleTerm.getPart()+"/","+  
  21. "/"definition/": /""+sampleTerm.getDefinition()+"/","+  
  22. "/"quote/": ["+  
  23. "/"Is public worship, then, a sin,/","+  
  24. "/"That for devotions paid to Bacchus/","+  
  25. "/"The lictors dare to run us in,/","+  
  26. "/"And resolutely thump and whack us?/""+  
  27. "],"+  
  28. "/"author/": /""+sampleTerm.getAuthor()+"/"}";  
  29. }  
  30. else{  
  31. success = "false";  
  32. resultMSG = "fail";  
  33. }  
  34. return SUCCESS;  
  35. }  
  36. //初始化数据  
  37. private void initData()  
  38. {  
  39. String partEAVESDROP = "v.i.";  
  40. String definitionEAVESDROP = "Secretly to overhear a catalogue of the crimes and vices of another or yourself.";  
  41. String quoteEAVESDROP[] = {"A lady with one of her ears applied",  
  42. "To an open keyhole heard, inside,",  
  43. "Two female gossips in converse free —",  
  44. "The subject engaging them was she.",  
  45. "/"I think,/" said one, /"and my husband thinks",  
  46. "That she's a prying, inquisitive minx!/"",  
  47. "As soon as no more of it she could hear",  
  48. "The lady, indignant, removed her ear.",  
  49. "/"I will not stay,/" she said, with a pout,",  
  50. "/"To hear my character lied about!/""};  
  51. String authorEAVESDROP = "Gopete Sherany";  
  52. Terms EAVESDROP = new Terms();  
  53. EAVESDROP.setTerm("EAVESDROP");  
  54. EAVESDROP.setPart(partEAVESDROP);  
  55. EAVESDROP.setDefinition(definitionEAVESDROP);  
  56. EAVESDROP.setQuote(quoteEAVESDROP);  
  57. EAVESDROP.setAuthor(authorEAVESDROP);  
  58. sampleTerm = EAVESDROP;  
  59. }  
  60. public String getTerm()  
  61. {  
  62. return term;  
  63. }  
  64. public void setTerm(String term)  
  65. {  
  66. this.term = term;  
  67. }  
  68. public String getSuccess()  
  69. {  
  70. return success;  
  71. }  
  72. public void setSuccess(String success)  
  73. {  
  74. this.success = success;  
  75. }  
  76. public String getResultMSG()  
  77. {  
  78. return resultMSG;  
  79. }  
  80. public void setResultMSG(String resultMSG)  
  81. {  
  82. this.resultMSG = resultMSG;  
  83. }  

这个action中的数据本人直接配置了,这里只是做一个示范使用。真正的这些数据在项目中一般是存放在数据库中的。由于这主要是jQuery方面的小示例,就不弄那么麻烦了。

2.Terms.java

 

 
  1. package lhb;  
  2. public class Terms  
  3. {  
  4. private String term;  
  5. private String part;  
  6. private String definition;  
  7. private String quote[];  
  8. private String author;  
  9. public String getTerm()  
  10. {  
  11. return term;  
  12. }  
  13. public void setTerm(String term)  
  14. {  
  15. this.term = term;  
  16. }  
  17. public String getPart()  
  18. {  
  19. return part;  
  20. }  
  21. public void setPart(String part)  
  22. {  
  23. this.part = part;  
  24. }  
  25. public String getDefinition()  
  26. {  
  27. return definition;  
  28. }  
  29. public void setDefinition(String definition)  
  30. {  
  31. this.definition = definition;  
  32. }  
  33. public String[] getQuote()  
  34. {  
  35. return quote;  
  36. }  
  37. public void setQuote(String[] quote)  
  38. {  
  39. this.quote = quote;  
  40. }  
  41. public String getAuthor()  
  42. {  
  43. return author;  
  44. }  
  45. public void setAuthor(String author)  
  46. {  
  47. this.author = author;  
  48. }  

这个类纯粹就是一个pojo类。没有什么特别的方法。

3.struts.xml

这个是struts2的json方式传递配置

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6. <!-- 指定全局国际化资源文件 -->  
  7. <constant name="struts.custom.i18n.resources" value="i18n"/>  
  8. <!-- 指定国际化编码所使用的字符集 -->  
  9. <constant name="struts.i18n.encoding" value="GBK"/>  
  10. <!-- JSON的action -->  
  11. <package name="jsonInfo" extends="json-default">  
  12. <action name="EGet" class="lhb.EGet">  
  13. <result type="json">  
  14. <param name="contentType">text/html</param>  
  15. <param name="includeProperties">success, resultMSG</param>  
  16. </result>  
  17. </action>  
  18. </package>  
  19. </struts> 

这里可以看到includeProperties里所配置的外面一层json,success和resultMSG。这在实际中很好用。如果服务器中没有取得需要的值,虽然ajax访问成功,但是获得的结果并不算成功,因为没有取得需要的值。这里加入了success标示,方便前台jQuery操作。

基于其他方法获取服务器数据从写法上与get基本一致,如post方法、load方法。这里就不再赘述了。

3.动态提交表单

通过jQuery的AJAX支持,可以让我们很方便的动态提交表单而不用刷新页面。

如下面例子:

 

 
  1. $('#letter-f form').submit(function(){  
  2. //调用preventDefault方法阻止事件冒泡,具体工作就是如果网页有脚本错误,那么则会阻止提交form表单  
  3. event.preventDefault();  
  4. var formValues = $('input[id="term"]').val();  
  5. var requestStr = {'term':formValues.toUpperCase()};  
  6. $.get('EGet.action', requestStr, function(data){  
  7. var responseObj = $.parseJSON(data);  
  8. if(responseObj.success == 'true')  
  9. {  
  10. var html = '';  
  11. var dataObj = $.parseJSON(responseObj.resultMSG);  
  12. html += "<div class='entry'>";  
  13. html += "<h3 class='term'>" + dataObj.term + "</h3>";  
  14. html += "<div class='part'>" + dataObj.part + "</div>";  
  15. html += "<div class='definition'>";  
  16. html += dataObj.definition;  
  17. if(dataObj.quote){  
  18. html += '<div class="quote">';  
  19. $.each(dataObj.quote, function(lineIndex, line){  
  20. html += '<div class="quote-line">' + line + '</div>';  
  21. });  
  22. if(dataObj.author){  
  23. html += '<div class="quote-author">' + dataObj.author + '</div>';  
  24. }  
  25. }  
  26. html += "</div>";  
  27. html += "</div>";  
  28. $('#dictionary').html(html);  
  29. }  
  30. else{  
  31. var warning = $('Sorry, your term was not found!');  
  32. $('#dictionary').html(warning);  
  33. }  
  34. });  
  35. }); 

这个例子援引的数据还是上一个EGet.action所用的那个数据。程序的操作过程基本是:

首先调用这个 preventDefault();这个方法在注释里也说明了,用于阻止事件冒泡带来的不便与麻烦。

接下来通过$()获得input的元素,使用val方法获得其值,接下来的使用方法与上例基本相同。

这里也可以使用serialize方法将input元素序列化成如下格式“term=xxx”这样。不过由于服务器端的java程序中的那些数据时硬编码的,所有,不是太方便用,就没用。

4.关于Ajax的观察员函数

jQuery包含了2个全局的ajax观察员函数:ajaxStart和ajaxStop。

分别在执行ajax操作的起始和结束时调用。例如:

 

 
  1. //ajax的观察员函数 ajaxStart 和 ajaxStop  
  2. $('<div id="loading">Loading...</div>').insertBefore('#dictionary')  
  3. .ajaxStart(function(){  
  4. $(this).show();  
  5. }).ajaxStop(function(){  
  6. $(this).hide();  
  7. }); 

这里无论哪个a标签触发ajax操作,包括静态载入文件和动态服务器访问,都会触发ajaxStart和ajaxStop。

关于错误处理,常用的三个函数:success、complete、error。

下面以error为例:

 

 
  1. .error(function(jqXHR){  
  2. $('#dictionary').html('An Error occurred:'+ jqXHR.status).append(jqXHR.responseText);  
  3. }); 

可以以连缀的写法将error方法放置于get方法之后:“$.get().error()”这样。

刚才看了一下,这个可以将Tomcat的报错,加载到页面之上。这在有的时候还是很有用的。如图:

不过不知道为何这个将我原有样式也覆盖了一些,如果有哪位网友知道,麻烦指正一下问题所在。谢谢了。

5.Ajax和事件

Ajax动态访问服务器以后生成的元素,如果想绑定事件的话,一种方法是每次取到都重新绑定处理程序,这种相对来说比较简单,但是不适合DOM结构经常变化的场景。如果DOM结构经常变化,那么就需要用live方法,实现事件委托。

live用法与bind一样。

关于jquery ajax基础教程今天小编就给大家介绍到这里,后续还会持续给大家介绍,希望大家继续关注脚本之家网站,有你们的关注我们会做的更好,谢谢!


注:相关教程知识阅读请移步到JavaScript/Ajax教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表