11.外观模式

外观模式:为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口使得系统接口的访问更容易。在javascript中有时也会用于对底层结构兼容性做统一封装来简化用户使用。

11.1添加一个点击事件

  

 1 document.onclick = function(e){
 2     e.preventDefault();
 3     if(e.target !== document.getElementById(‘myinput‘)){
 4         hidePage();
 5     }
 6 }
 7
 8 function hidePage(){
 9     //隐藏操作
10 }

为document绑定了onclick事件,但是你知道onclick是dom0事件,也就是说这种方式绑定的事件相当于为元素绑定一个事件方法。

0级DOM

分为2个:一是在标签内写onclick事件

      二是在JS写onlicke=function(){}函数

2级DOM

只有一个:监听方法,有两个方法用来添加和移除事件处理程序:addEventListener()和removeEventListener()。

它们都有三个参数:第一个参数是事件名(如click);

         第二个参数是事件处理程序函数;

           第三个参数如果是true则表示在捕获阶段调用,为false表示在冒泡阶段调用。

  • addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用。
  • removeEventListener():不能移除匿名添加的函数。

只有2级DOM包含3个事件:事件捕获阶段、处于目标阶段和事件冒泡阶段

刚说的是dom0 级事件,如果有另一个开发人员这么写:

1 document.onclick = function(){
2     //其它开发人员重新document绑定会覆盖前面定义的dom0级click事件
3 }

因此该使用dom2级事件处理程序提供的方法addEventListener来实现,然而老版本的ie<9 是不支持这个方法的,所以要使用attachEvent,当然如果有不支持dom2级事件处理程序的浏览器,你只能用onclick事件方法绑定事件。

这时下边提供一些   兼容所有浏览器的方式:

 1 function addEvent(dom, type, fn){
 2     //对于支持dom2级事件处理程序addEventListener 方法的浏览器
 3     if(dom.addEventListener){
 4         dom.addEventListener(type, fn, false);
 5         //对于不支持addEventListener方法,但支持attachEvent方法的浏览器
 6     }else if(dom.attachEvent){
 7         dom.attachEvent(‘on‘+ type, fn);
 8         //对于上边都不值,但支持onclick
 9     }else{
10         dom[‘on‘ + type] = fnl
11     }
12 }


这样对后续支持addEventListener 或 attachEvent 方法的浏览器就可以放心的绑定多个事件了,是多个事件!

 1 var myinput = document.getElementById(‘myinput‘);
 2 addEvent(myinput,‘click‘,fun1);
 3
 4 addEvent(myinput,‘click‘,fun2);
 5
 6 function fun1(){
 7     //绑定第一个事件
 8 }
 9 function fun2(){
10     //绑定第二个事件
11 }
11.2除此之外

  在ie低版本浏览器不兼容e.preventDefault()和 e.target  ,可以通过外观模式来解决

 1 //获取事件对象
 2 var getEvent = function(event){
 3     //标准浏览器返回event ,ie下window.event
 4     return event || window.event;
 5 }
 6
 7 //获取元素
 8 var getTarget = function(event){
 9     var event = getEvent(event);
10     //标准浏览器
11     if(event.preventDefault{
12         event.preventDefault();
13         //ie浏览器
14     }else{
15         event.returnValue = false;
16     }
17 }

用这个可以解决上边兼容问题

document.onclick = function(){

  //阻止默认行为

preventDefault(e);

//dosomething ...

}

10.3小型代码库(参考)

  

 1 //简约版
 2 var A = {
 3     //通过id获取元素
 4     g : function(id){
 5         return document.getElementById(id);
 6     },
 7     css : function(id, key, value){
 8         A.g(id).style[key] = value;
 9     },
10     html : function(id, html){
11         this.g(id).innerHtml = html;
12     }
13 }

通过这个调用更简单

A.css(‘xx‘,‘background‘,‘#ccc‘);

其它可以扩展

时间: 2024-08-24 18:33:34

11.外观模式的相关文章

设计模式——11.外观模式

1. 模式动机 2. 模式定义 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一种对象结构型模式. 3. 模式结构 外观模式包含如下角色: Facade: 外观角色 SubSystem:子系统角色 4. 时序图 5. 代码分析 #include <iostream> #include "Facade.h&

11.外观模式(Facade Pattern)

using System; namespace ConsoleApplication4 { class Program { /// <summary> /// 不使用外观模式的情况 /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统 /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口 /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作 /// 从而让客户和子系统之间避免了紧耦合 /// </summary> ///

设计模式-11 外观模式(结构型模式)

一  外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 关键代码:在客户端和复杂系统之间再加一层,这一次将调用顺序.依赖关系等处理好. 使用场景: JAVA 的三层开发模式 1.为复杂的模块或子系统提供外界访问的模块. 2.子系统相对独立. 3.预防低水平人员带来的风险. 类图

C#设计模式(11)——外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

11 结构型模式-----外观模式

模式动机(Facade Pattern):在设计一个复杂系统时,一般会将其分解为若干个具有特定功能的子系统以便于分析设计,这样的话就会导致数量众多的子系统接口出现,使得与调用者的交互变得复杂了.解决办法是在所有子系统的上一层提供一个外观类(Facade),其负责对所有子系统的统一调用,客户只需和外观类交互即可. 模式结构图: 模式代码: bt_外观模式.h: 1 #ifndef FP_H 2 #define FP_H 3 #include <iostream> 4 5 /* 6 定义子系统Su

NET设计模式 第二部分 结构性模式(11):外观模式(Fa&#231;ade Pattern)

外观模式(Façade Pattern) ——.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意

设计模式的征途—11.外观(Facade)模式

在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服务员一样的角色,由他来负责和多个业务类进行交互,而使用这些业务类的类只需要和该类进行交互即可.外观模式通过引入一个新的外观类来实现该功能,外观类充当了软件系统中的“服务员”,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互. 外观模式(Facade) 学习难度:★☆☆☆☆ 使用频率:

11.设计模式_外观模式

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

Java设计模式11:外观模式

外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一个子系统,按照部门职能,这个系统划分为挂号.门诊.划价.化验.收费.取药等.看病的人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事. 解决这种不便的方法便是引入外观模式,医院可以设置一个接待员的位置,由接待员负责代为挂号.划价.缴费.取药等.病人只需要接