Ajax學習筆記(二)

來源:互聯網
上載者:User

標籤:style   http   java   color   使用   os   



二、prototype庫詳解

1、prototype庫的使用
//匯入下載好的prototype.js檔案
<script type="text/javascript" src="prototype.js"></script>
//在自己的js中直接使用Prototype對象
<script type="text/javascript">
document.writeln("Prototype庫的版本是:"+Prototype.Version+"<br/>");
document.writeln("我的庫的版本是:"+zpc.version+"<br/>"+"我的年齡:"+zpc.age+"<br/>");
document.writeln("用戶端是否為Chrome:"+Prototype.Browser.WebKit+"<br/>");
alert(Prototype.K("測試字串"));
</script>
2、使用$()函數和$$()函數訪問文檔中的HTML元素
   $(String tagName)函數:直接獲得id為tagName的HTML元素
   $(String tagName1,String tagName2):獲得id為tagName1、tagName2的HTML元素數組
   $$()的參數是一個或多個合法的CSS選取器
3、$A()函數用於將一個參數轉換成數組,如果傳入的參數不是一個集合,而是一個普通變數,$A()函數將返回一個空數組,而不是只有一個元素的數組。
   $F()函數用於擷取表單控制項的值,比如input、textArea、select等元素。
   $()函數是擷取HTML元素本身,而$F()函數用於擷取表單控制項的值,而不是表單域本身。
   可以這樣說:$()函數返回的是一個HTML元素對象,而$F()函數返回的只是一個字串值。
   使用這兩個函數時都應該讓HTML元素的id屬性和name屬性保持一致(保證IE)
4、$H()函數:將js對象轉換成Hash對象,Hash類是Prototype庫提供的一個類,類似於Java語言裡的Map資料結構
5、使用Try.these()函數允許傳入一些列的函數作為參數,它將依次調用傳入的一系列函數,找到第一個能成功返回值的函數,並將該函數的返回值作為Try.these()函數的返回值。如果這一系列函數都沒有返回值,Try.these()將會返回undefined
   Try.these()的參數只能是函數引用
6、Prototype的json支援為Date、Object、Array、Hash、Number類增加了toJSON()方法,用於將這些對象轉換成一個JSON格式的字串
   此外,Prototype還為String類增加了如下三個與JSON相關的方法:
   isJSON():該方法判斷指定字串是否為合法的JSON字串
   evalJSON([sanitize=false]):將指定的字串轉換成json對象
   toJSON():用於將字串轉換成JSON字串
 
  常式:<body>  <script type="text/javascript">  var date=new Date();  document.writeln("日期是:"+date.toLocaleString()+"<br/>");  document.writeln("日期對應的JSON字串為:"+date.toJSON()+"<br/>");  var p={  name:"zpc",  age:25  };  //將對象轉換成JSON字串  document.writeln("普通對象的JSON字串為:"+Object.toJSON(p)+"<br/>");  var books=["周鵬程","鳥鵬"];  //document.writeln("數組的JSON字串為:"+books.toJSON()+"<br/>");  var hash=$H({name:'周鵬程',age:34});  document.writeln("Hash對象的JSON字串為:"+hash.toJSON()+"<br/>");  //document.writeln("數值的JSON字串為:"+(45).toJSON()+"<br/>");  var str='{"name":"zpc","gender":"male"}';  //將一個json格式的字串轉換成JSON對象  var zpc=str.evalJSON();  document.writeln("zpc對象的名字:"+zpc.name+"<br/>");  document.writeln("zpc對象的性別:"+zpc.gender+"<br/>");  </script>  </body>
7、使用Element對象:該類提供了一些方法簡化HTML元素的操作
8、使用ObjectRange對象:一個ObjectRange對象代表一個範圍
   常式:  <body><script type="text/javascript" src="prototype-1.6.0.3.js"></script>  <script type="text/javascript">  //直接用new建立一個ObjectRange對象var range=new ObjectRange(2,9,true);//true表示不包含9range.each(function(ele,index){document.writeln("索引"+index+"處的值:"+ele+"<br/>")});//使用$R()函數建立一個ObjectRange對象var ra=$R('a','g');document.writeln($A(ra));alert(ra.include('b'));  </script>  </body>
9、使用Form.Element動作表單控制項
   Form.Element專門用於動作表單控制項,使用它可以啟用表單控制項,可以判斷某個表單控制項是否為空白,可以清空系列表單控制項
10、使用Form動作表單。注意:Form.Element是操作指定表單控制項,而Form是操作指定表單(或者表單內的全部控制項)
11、使用Hash對象
    Hash對象是一種類似於Java中Map的資料結構,它是一個Key-Value對的集合。Hash對象的每個Item是包含兩個元素的數組,前一個是Key後一個是Value
    藉助$H函數可以將一個普通的對象轉換為Hash對象,再藉助Hash對象的方法可以方便的訪問該對象的全部屬性和屬性值
12、使用Event來簡化事件編程
 
<body>   <table border="1">   <tr><td><div><input id="ok" type="button" value="click me"/></div>table的Inner</td></tr>     </table>   <div id="d">e</div>   <script type="text/javascript" src="prototype.js"></script>   <script type="text/javascript">Event.observe("ok","click",function(event){document.writeln("是否為左擊事件:"+event.isLeftClick());document.writeln("事件來源:"+event.element().value);document.writeln("最近的td元素:"+event.findElement("td").innerHTML);});$("d").innerHTML="<h2>哈哈<h2>";   </script>  </body>//上面的代碼不在使用原始的事件模型,而是使用基於Event提供的事件簡化,這種簡化消除了事件模型的瀏覽器差異。
13、使用Template
    有時我們要產生多個字串,這些字串中有大量重複內容,只有少量關鍵區段發生變化,這時就可以藉助Template對象了
常式:
<body><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">objArr = [ {book : 'Hadoop教程',author : "zpc"}, {book : 'Java教程',author : '錢剛'}, {book : '天龍八部',author : "金庸"} ];var template=new Template("書名是#{book},作者是#{author}.");for(var i=0;i<objArr.length;i++){document.writeln(template.evaluate(objArr[i]));}</script></body>
14、使用Class的create()方法建立對象可以提供一些物件導向的支援
15、兩個經常使用的監聽表單控制項及表單的監聽器
    Form.Observer(form,interval,callback):如果表單form內任何錶單控制項的值發生改變,interval秒後自動觸發callback函數。該表單既可以是表單的id屬性,也可以是表單本身。
   Form.Element.Observer(element,interval,callback):如果表單控制項element的值發生改變,interval秒後自動觸發callback函數。該element既可以是表單控制項的id屬性,也可以是表單控制項本身。
常式:
//只要任何錶單控制項的值被改變就觸發<body><form action="#" method="post" id="test">使用者名稱:<input type="text" id="user" name="user"/>密 碼:<input type="text" id="pass" name="pass"/></form><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">new Form.Observer("test",1,function(){alert(this.getValue());});</script></body>//使用者名稱輸入框值改變觸發<body><form action="#" method="post" id="test">使用者名稱:<input type="text" id="user" name="user"/>密 碼:<input type="text" id="pass" name="pass"/></form><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">new Form.Element.Observer("user",1,function(){alert(this.getValue());});</script></body>
16、Prototype庫不僅提供了一系列的自訂的類和對象,還擴充了某些JS中原有的類和對象。
常式:擴充的document
<body><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">//為document的loaded事件綁定監聽器document.observe("dom:loaded",function(event){$("show").innerHTML+=("頁面裝載完成<br/>");});//為document的a:b事件綁定事件監聽器document.observe("a:b",function(event){$("show").innerHTML+=("myEvent被觸發了<br/>");$("show").innerHTML+=("event.memo.book的屬性值:"+event.memo.book);});</script><input type="button" value="單擊我" onclick='document.fire("a:b",{book:"Hadoop權威指南"});'/><div id="show"></div></body>
//a:b是開發人員自訂的“人工合成”事件。單擊頁面中的“單擊我”按鈕時,程式使用document.fire()方法觸發a:b事件
//使用document、Element的observe()方法為“人工合成”事件綁定監聽器時,該事件的事件名稱格式必須為xx:xx
17、Prototype對Ajax的支援
(1)使用Ajax.Request類
常式:輸入提示效果
html頁面代碼:
<body>  <h3>請輸入您喜歡的水果</h3>  <div style="width:280px;font-size:9pt">輸入apple、banana、peach可以看到明顯效果</div><br/>  <input id="favorite" name="favorite" tyep="text" onblur="$('tips').hide();"/>  <div id="tips" style="width:160px;border:1px solid menu;background-color: #ffffcc;display: none;"></div><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">function searchFruit(){var url="/Ajax/fruit.jsp";//將favorite表單域的值轉化為請求參數,形如favorite=app&color=red....var params=Form.Element.serialize('favorite');//alert(params);//建立Ajax.Request對象,對應於發送請求var myAjax=new Ajax.Request(url,{method:'post',parameters:params,onComplete:showResponse,asynchronous:true});}//定義回呼函數function showResponse(request){//alert("回呼函數被觸發!");//在tip中顯示伺服器的響應$('tips').innerHTML=request.responseText;//顯示tip對象$('tips').show();}new Form.Element.Observer("favorite",1,searchFruit);</script>  </body>//JSP頁面嵌入的Java代碼<%String hdchar=request.getParameter("favorite");System.out.println(hdchar);if("apple".startsWith(hdchar)){out.println("apple");}else if("banana".startsWith(hdchar)){out.println("banana");}else if("peach".startsWith(hdchar)){out.println("peach");}else {out.println("other");}%>
(2)使用Form.request()方法
   該方法會將該表單控制項轉換為請求參數,預設向該表單action指定的URL發送非同步請求
常式:驗證使用者是否合法
html頁面代碼:
<body><h3>請輸入使用者名稱和密碼登入</h3><form id="login" action="/Ajax/login.jsp" method="post">使用者名稱:<input type="text" name="user" /><br />密 碼:<input type="password" name="pass"><br /><input type="button" value="驗證使用者" onclick="login();"/><br /><div id="d"></div></form><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">function login() {//直接使用Form的request方法發送非同步請求,request方法的參數是個json數組的格式!$("login").request( {//指定回呼函數onComplete : function(request) {$("d").innerHTML = request.responseText;}});}</script></body>jsp頁面嵌入的Java代碼<%String user=request.getParameter("user");String pass=request.getParameter("pass");if(user.equals("zpc")&&pass.equals("123456")){out.println("驗證通過!");}else{out.println("沒有通過驗證!");} %>

(2)使用Ajax.Responders對象

這個對象用於註冊Ajax事件監聽器,該對象註冊的Ajax事件監聽器不管是哪個XMLHttpRequest在發生互動,都能被自動觸發。因而Ajax.Responders註冊的事件監聽器是全域有效,可以用於監控整個Ajax的互動過程。

//增加了loading圖片的fruit.html<body><h3>請輸入您喜歡的水果</h3><div style="width: 280px; font-size: 9pt">輸入apple、banana、peach可以看到明顯效果</div><br /><input id="favorite" name="favorite" tyep="text"onblur="$('tips').hide();" /><img alt="loading" id="loading" src="/Ajax/images/loading.gif"style="display: none; width: 20px; height: 20px"><div id="tips"style="width: 160px; border: 1px solid menu; background-color: #ffffcc; display: none;"></div><script type="text/javascript" src="prototype.js"></script><script type="text/javascript">function searchFruit() {var url = "/Ajax/fruit.jsp";//將favorite表單域的值轉化為請求參數,形如favorite=app&color=red....var params = Form.Element.serialize('favorite');//alert(params);//建立Ajax.Request對象,對應於發送請求var myAjax = new Ajax.Request(url, {method : 'post',parameters : params,onComplete : showResponse,asynchronous : true});}//定義回呼函數function showResponse(request) {//alert("回呼函數被觸發!");//在tip中顯示伺服器的響應$('tips').innerHTML = request.responseText;//顯示tip對象$('tips').show();}//定義Ajax的全域事件處理器對象var myGlobalHandlers = {//剛剛開始Ajax互動時觸發該屬性指定的函數onCreate:function() {$("loading").show();},//互動完成時觸發該屬性的指定函數onComplete:function() {if (Ajax.activeRequestCount == 0) {$('loading').hide();}},//互動失敗時觸發該屬性指定的函數onFailure:function() {alert("對不起,頁面載入出錯!");}};//為Ajax事件綁定全域的事件處理器Ajax.Responders.register(myGlobalHandlers);new Form.Element.Observer("favorite", 1, searchFruit);</script></body>
(3)使用Ajax.Updater類
  這個類是Ajax.Updater類的簡化,使用該類無需使用回呼函數,該類可以自動將伺服器響應顯示在某個容器中。當伺服器響應完成時,用戶端html頁面無需使用回呼函數解析伺服器響應(當然也可以手動添加回呼函數),從而進一步簡化Ajax互動編程。
(4)使用Ajax.PeriodicalUpdater類
   它是一個周期性的Ajax.Updater類,周期性地向伺服器發送請求(當然也可以手動指定定時器對象),並將伺服器響應在用戶端HTML頁面的某個元素中顯示出來。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.