假设这一系列函数都没有返回值,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元素的操作
例程: <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>9、使用Form.Element操作表单控件
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
<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()方法创建对象能够提供一些面向对象的支持
该表单既能够是表单的id属性,也能够是表单本身。
Form.Element.Observer(element,interval,callback):假设表单控件element的值发生改变,interval秒后自己主动触发callback函数。
该element既能够是表单控件的id属性,也能够是表单控件本身。
例程:
//仅仅要不论什么表单控件的值被改变就触发 <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>16、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
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()方法
<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("对不起,页面载入出错!
"); } }; //为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页面的某个元素中显示出来。