`
hbc8848
  • 浏览: 17072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Javascript 的函数式对象(八)DOM对象管理器

阅读更多

开发一个交互式的Web页面,用来显示信息或接受用户输入的对话框必不可少。

 

对话框的创建对应着页面上若干DOM节点的生成和插入,考虑到移除这些DOM节点的开销,

 

对话框的关闭只是将这些DOM节点在页面上设置为不显示。下面是一个js生成对话框的示例:

 

var Dialog = function(){
	
	this.element = document.createElement('div'); //创建对话框对应的DOM节点
	this.element.style.display = 'none'; // 指定div不显示
	this.element.style.position = 'absolute'; // 指定div的定位模式为绝对坐标模式
	this.element.style.border = 'gray solid'; //为Dialog加上灰色的边框
	this.element.className = 'dialog';
	// 在页面的body标签中插入刚创建的div标签
	document.getElementsByTagName('body')[0].appendChild(this.element);
};

Dialog.prototype = { //将无状态方法定义在Dialog对象的原型中
	show: function(x,y, contentHTML){
		//将传入的HTML字符串作为对话框内容,插入到新创建的div标签里
		this.element.innerHTML = contentHTML;
		this.element.style.left = x + 'px'; //指定div标签左侧的坐标
		this.element.style.top = y + 'px'; //指定div标签顶端的坐标
		this.element.style.display = 'block'; // 指定div显示
	},
	
	hide: function(){
		this.element.style.display = 'none'; // 指定div不显示
	},
	
	isVisible: function(){
		if(this.element.style.display == 'none'){
			return false;
		}else return true;
	}
};

var myDialog = new Dialog();
myDialog.show(200,100, '<h1>This is a dialog!</h1>');

 

上述代码虽然避免了移除对话框的DOM节点带来的开销,但是创建对话框DOM节点的过程依然会带来开销。

 

如果用户不断地重复“打开”+“关闭”对话框这一操作,大量DOM节点的产生,将迟滞浏览器响应速度,影响用户体验,

 

在DOM树结构较为复杂的页面上,尤为明显(早期的ExtJS上也曾出现过类似问题,在后来的版本中得以修正)。

 

下面这段代码将创建一个对话框对象管理器,托管页面上的所有对话框,其原理类似线程池:

 

当需要一个对话框显示内容的时候,首先遍历管理器,如果存在未被使用的对话框,这个对话框将用来显示内容。

 

如果当前所有的对话框都处在被使用的状态,则管理器负责新建一个对话框用来显示内容,并加入管理队列。

 

//定义对话框管理器,重用已创建的对话框。当管理器中的对话框不足时,将创建新的对话框
var DialogManager = (function(){

	var createdDialogs = []; //利用闭包创建的私有数组,
	
	return {
		display: function(x, y, contentHTML){
			//遍历管理器中的对话框,如果存在没有被使用的对话框,则用它显示内容,
			var hiddenIndex = 0;
			for(var i=0, len=createdDialogs.length; i<len; i++ ){
				
				if(!createdDialogs[i].isVisible()){
					createdDialogs[i].show(x, y, contentHTML);
					hiddenIndex = i;
					break;
				}
			}
			//如果所有对话框都处于显示的状态,那么创建一个新的对话框用于显示内容
			if(hiddenIndex == 0){
				var newDialog = new Dialog();
				newDialog.show(x, y, contentHTML);
				createdDialogs.push(newDialog);
				console.log('Dialog '+createdDialogs.length+' has been created!');
			}
		}
	}
})();

//调用管理器显示对话框内容
DialogManager.display(300,200,'<h1>This is a managed dialog!</h1>');
DialogManager.display(300,300,'<h1>This is another managed dialog!</h1>');

 

在涉及到DOM节点的创建和删除这类对性能有较大影响的操作时,对它们生命周期的托管是所有js框架的重要内容。

 

甚至大型js对象本身,如一些包含复杂数据类型的json对象,在频繁地创建和删除它们之前,都需要考虑性能上的影响。

 

 

0
2
分享到:
评论

相关推荐

    javascript DOM 编程艺术

    从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本设计,从XML(E4X)到Ajax及JSON,从...

    JS 函数式编程指南

    在纯函数式编程语言中,你必须使用 monad 才能打印变量或者读取 DOM 节点。JavaScript 则简单得多,可以作弊走捷径,因为毕竟我们的目的是学写纯函数式代码。JavaScript 也更容易入门,因为它是一门混合范式的语言,...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part1.rar

     2.5.1 为什么需要JavaScript日志对象   2.5.2 myLogger()对象   2.6 小结   第3章 DOM2核心和DOM2 HTML   3.1 DOM不是JavaScript,它是文档   3.2 DOM的级别   3.2.1 DOM 0 级   3.2.2 ...

    javascript函数的解释

    javascript函数的解释,解释了具体函数的功能,一、函数JavaScript函数集合 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document-&gt;html-&gt;(head,body) 4.一个浏览器窗口中的DOM顺序是:...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part3.rar

     2.5.1 为什么需要JavaScript日志对象   2.5.2 myLogger()对象   2.6 小结   第3章 DOM2核心和DOM2 HTML   3.1 DOM不是JavaScript,它是文档   3.2 DOM的级别   3.2.1 DOM 0 级   3.2.2 ...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part2.rar

     2.5.1 为什么需要JavaScript日志对象   2.5.2 myLogger()对象   2.6 小结   第3章 DOM2核心和DOM2 HTML   3.1 DOM不是JavaScript,它是文档   3.2 DOM的级别   3.2.1 DOM 0 级   3.2.2 ...

    源文件程序天下JAVASCRIPT实例自学手册

    1.3.2 选择JavaScript脚本编辑器 1.4 如何引入JavaScript脚本代码 1.4.1 通过[removed]与[removed]标记对引入 1.4.2 通过[removed]标记的src属性引入 1.4.3 通过JavaScript伪URL引入 1.4.4 通过HTML文档事件处理程序...

    JavaScript王者归来part.1 总数2

     6.1.1.2 JavaScript函数的奥妙——魔法代码   6.1.2 函数的调用   6.2 函数的参数   6.2.1 形参与实参   6.2.2 Arguments对象   6.2.2.1 一个使用Arguments对象检测形参的例子   6.2.2.2 一个使用...

    JavaScript基础和实例代码

    JavaScript电子书,包括了JavaScript的大部分知识,可以帮助读者快速入门。内容如下: 第1章 JavaScript语言概述 1.1 JavaScript是什么 1.1.1 JavaScript简史 1.1.2 JavaScript有何特点 1.2 JavaScript能做什么 ...

    JavaScript模式中文[pdf] 百度云

     类式继承模式#2——借用构造函数  类式继承模式#3——借用和设置原型  类式继承模式#4——共享原型  类式继承模式#5——临时构造函数  Klass  原型继承  通过复制属性实现继承  借用方法  小结  第7章 ...

    JavaScript权威指南(第6版)

    8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类继承 9.4 类的扩充 9.5 类和类型 9.6 JavaScript中的面向对象技术 9.7 子类 9.8 ECMAScript 5 中的类 9.9 模块 第10章 ...

    JavaScript权威指南(第6版)(附源码)

    8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类继承 9.4 类的扩充 9.5 类和类型 9.6 JavaScript中的面向对象技术 9.7 子类 9.8 ECMAScript 5 中的类 9.9 模块 第10章 ...

    《精通Javascript+jQuery》光盘源码

    第1部分 JavaScript.cCSS与DOM基础篇   第1章 ccJavaScript概述  1.1 JavaScript的起源  1.2 浏览器之争  1.2.1 DHTML  1.2.2 浏览器之间的冲突  1.2.3 标准的制定  1.3 JavaScript的实现  1.3.1...

    JavaScript权威指南(第6版)中文版pdf+源代码

     8.8 函数式编程194  第9章 类和模块201  9.1 类和原型202  9.2 类和构造函数203  9.3 JavaScript中Java式的类继承207  9.4 类的扩充210  9.5 类和类型212  9.6 JavaScript中的面向对象技术217  9.7 子类...

    JavaScript权威指南(第6版)(中文版)

    8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类继承 9.4 类的扩充 9.5 类和类型 9.6 JavaScript中的面向对象技术 9.7 子类 9.8 ECMAScript 5 中的类 9.9 模块 第10章 ...

    JavaScript 权威指南(第四版).pdf

     8.8 函数式编程194  第9章 类和模块201  9.1 类和原型202  9.2 类和构造函数203  9.3 JavaScript中Java式的类继承207  9.4 类的扩充210  9.5 类和类型212  9.6 JavaScript中的面向对象技术217  9.7 子类...

    JavaScript权威指南(第6版)中文文字版

    8.8 函数式编程 194 第9章 类和模块 201 9.1 类和原型 202 9.2 类和构造函数 203 9.3 javascript中java式的类继承 207 9.4 类的扩充 210 9.5 类和类型 212 9.6 javascript中的面向对象技术 217 9.7 子类 230 9.8 ...

    1.JavaScript面试真题-210页.pdf

    但它也是一门多范式语言,支持函数式编程和事件驱动编程。 动态类型:JavaScript是一种动态类型语言,变量无需声明类型,并且可以随时更改其值的类型。这使得开发过程更灵活,但也需要注意类型转换和错误处理。 第...

    深入浅出JavaScript(中文版)

    《深入浅出JavaScript(中文版)》覆盖了所有的javascript基本知识,从基本网络编程技巧,如变量、函数和循环语句,到高级一些的专题,如表单验证、dom操作、客户端对象、脚本程序调试——甚至是aiax!赶快做好准备……...

Global site tag (gtag.js) - Google Analytics