⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 13.2.4.html

📁 《精通AJAX》光盘 要求: JDK1.4.2 以上版本 数据库采用MySQL 4.1.4 以上版本 服务器采用Tomcat 5 以上版本 开发工具采用Eclipse 3.0
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>New document</title>
</head>
<body>
<br/><br/><br/>
<a href="javascript:void(0)" onclick="setP1()">link1</a>
<a href="javascript:void(0)" onclick="setP2()">link2</a>
<a href="javascript:void(0)" onclick="setP3()">link3</a>
<p id="p1">p1</p>
<p id="p2">p2</p>
<p id="p3">p3</p>
<iframe name="hframe" src="history.html" style="display:none"></iframe>
</body>
</html>
<script language="JavaScript" type="text/javascript">
<!--
//prototype-1.3.1框架中为函数对象定义的bind方法,下面有介绍
Function.prototype.bind = function(object) { 
  var __method = this; 
  return function() { 
    __method.apply(object, arguments); 
  } 
}
//定义前进后退处理类及构造函数
function BackButtonFixer(){
	//用于存储需要进行状态记录的函数
	this.actions={};
	//Qs用于存储变化前的状态,以备比较哪些函数发生了变化,需要重新调用
	this.Qs="";
	//设置定时器用于检测隐藏框架的URL是否变化
	window.setInterval(this.load.bind(this),100);
}

//注册一个需要实现前进后退按钮的动作
BackButtonFixer.prototype.register=function(s,doAction,undoAction){
	//将一对函数记录下来
	this.actions[s]={doAction:doAction,undoAction:undoAction}
}

//每个注册的方法在调用时都需要改变隐藏框架的URL地址,以被浏览器记录
BackButtonFixer.prototype.toQs=function(s){
	var Qs=window.frames.hframe.location.search;
	Qs=Qs.slice(1,Qs.length);
	var arrQs=Qs.split(".");
	if(Qs.length==0)arrQs=[];
	var exist=false;
	for(var i=0;i<arrQs.length;i++){
		if(arrQs[i]==s){
			exist=true;
			break;
		}
	}
	if(!exist)arrQs.push(s);
	//改变隐藏框架的URL
	this.Qs=window.frames.hframe.location.search="?"+arrQs.join(".");
}

//根据框架页的查询字符串数据来进行调用
BackButtonFixer.prototype.load=function(){
	//获取框架也表示的查询字符串
	var Qs1=window.frames.hframe.location.search;
	//判断框架内的Qs地址是否发生变化,如果没变则直接返回
	if(this.Qs==Qs1)return;
	
	//获取当前的状态,以函数调用轨迹的形式表示
	Qs1=Qs1.slice(1,Qs1.length);
	var arrQs1=Qs1.split(".");
	if(Qs1.length==0)arrQs1=[];
	//将函数标识符做成哈希表的形式,方便后面的比较
	var objQs1={};
	for(var i=0;i<arrQs1.length;i++)objQs1[arrQs1[i]]=true;

	//获取新的状态
	var Qs2=this.Qs.slice(1,this.Qs.length);
	var arrQs2=Qs2.split(".");
	if(Qs2.length==0)arrQs2=[];
	//将函数标识符做成哈希表的形式,方便后面的比较
	var objQs2={};
	for(var i=0;i<arrQs2.length;i++)objQs2[arrQs2[i]]=true;
	
	//比较两个状态,找出新增加的函数,调用doAction中存储的函数
	for(var i=0;i<arrQs1.length;i++){
		//如果新增加了函数,则调用doAction
		if(!objQs2[arrQs1[i]])this.actions[arrQs1[i]].doAction();
	}

	//比较两个状态,找出减少的函数,调用undoAction中存储的函数
	for(var i=0;i<arrQs2.length;i++){
		//如果是减少了函数,则调用undoAction
		if(!objQs1[arrQs2[i]])this.actions[arrQs2[i]].undoAction();
	}

	//将切换完成的状态设置为当前状态
	this.Qs="?"+Qs1;
}


//创建对象
var bbf=new BackButtonFixer();
//注册函数
bbf.register("p1",setP1,undoSetP1);
bbf.register("p2",setP2,undoSetP2);
bbf.register("p3",setP3,undoSetP3);
function setContent(containerId,content){
	container=document.getElementById(containerId);
	container.innerHTML=content;
}
//设置p1结点的内容
function setP1(){
	setContent("p1","here is p1 content");
	//将状态存储到URL中
	bbf.toQs("p1");
}
//取消设置p1结点的内容
function undoSetP1(){
	setContent("p1","p1");
}

//设置p2结点的内容
function setP2(){
	setContent("p2","here is p2 content");
	bbf.toQs("p2");
}
//取消设置p2结点的内容
function undoSetP2(){
	setContent("p2","p2");
}

//设置p3结点的内容
function setP3(){
	setContent("p3","here is p3 content");
	bbf.toQs("p3");
}
//取消设置p3结点的内容
function undoSetP3(){
	setContent("p3","p3");
}
//-->
</script>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -