假設這一系列函數都沒有返回值,Try.these()將會返回undefined
Try.these()的參數僅僅能是函數引用
六、Prototype的json支持爲Date、Object、Array、Hash、Number類添加了toJSON()方法,用於將這些對象轉換成一個JSON格式的字符串
此外,Prototype還爲String類添加了例如如下三個與JSON相關的方法:
isJSON():該方法推斷指定字符串是否爲合法的JSON字符串
evalJSON([sanitize=false]):將指定的字符串轉換成json對象
toJSON():用於將字符串轉換成JSON字符串
javascript
例程: <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>七、使用Element對象:該類提供了一些方法簡化HTML元素的操做
例程: <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表示不包括9 range.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>九、使用Form.Element操做表單控件
Hash對象的每個Item是包括兩個元素的數組,前一個是Key後一個是Value
藉助$H函數可以將一個普通的對象轉換爲Hash對象。再借助Hash對象的方法可以方便的訪問該對象的全部屬性和屬性值
十二、使用Event來簡化事件編程
html
<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提供的事件簡化,這樣的簡化消除了事件模型的瀏覽器差別。1三、使用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>1四、使用Class的create()方法建立對象可以提供一些面向對象的支持
該表單既可以是表單的id屬性,也可以是表單自己。java
Form.Element.Observer(element,interval,callback):假設表單控件element的值發生改變,interval秒後本身主動觸發callback函數。編程
該element既可以是表單控件的id屬性,也可以是表單控件自己。
例程:
json
//僅僅要不論什麼表單控件的值被改變就觸發 <body> <form action="#" method="post" id="test"> username:<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> //username輸入框值改變觸發 <body> <form action="#" method="post" id="test"> username:<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>1六、Prototype庫不只提供了一系列的本身定義的類和對象,還擴展了某些JS中原有的類和對象。
<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
1七、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()方法
<body> <h3> 請輸入username與password登陸 </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("回調函數被觸發!(3)使用Ajax.Updater類"); //在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("對不起,頁面載入出錯!app
"); } }; //爲Ajax事件綁定全局的事件處理器 Ajax.Responders.register(myGlobalHandlers); new Form.Element.Observer("favorite", 1, searchFruit); </script> </body>
當server響應完畢時,clienthtml頁面無需使用回調函數解析server響應(固然也可以手動加入回調函數),從而進一步簡化Ajax交互編程。 (4)使用Ajax.PeriodicalUpdater類 它是一個週期性的Ajax.Updater類,週期性地向server發送請求(固然也可以手動指定定時器對象),並將server響應在clientHTML頁面的某個元素中顯示出來。