Ajax学习笔记(二)

二、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表示不包含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操作表单控件

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页面的某个元素中显示出来。

Ajax学习笔记(二)

时间: 2024-10-03 17:03:44

Ajax学习笔记(二)的相关文章

AJax 学习笔记二(onreadystatechange的作用)

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

[ajax 学习笔记] json数据格式

之前写过ajax传送数据可以用普通文本和XML两种格式.这里记一下json数据格式. json:javascript object notation. 之前分析过,用文本和XML传送数据各有优劣.而json可以轻松地将javascript对象转换成可以随时发送的数据. 一个json数据例子: var people = { "programmers": [ { "firstName": "Brett", "lastName":&

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t