模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤。

项目经理体验了各个页面的交互功能,发现每个页面的弹出框样式都不太一致,有的是高度高一些,有的是字体大了些,有的是按钮歪了些。 于是我们就需要将这些页面中的弹出框归一化。

我们首先要做的就是创建一个基本提示框基类,然后其他提示框类只需要在继承的基础上,拓展自己所需即可了吧,这样日后需求再变动我们修改基础类就可以使所有提示框的样式都统一化了。

基本提示框,它有一个提示内容、一个关闭按钮和确定按钮

// 模板类 基础提示框 data 渲染数据

var Alert = function(data) {
// 没有数据则返回,防止后面程序执行
if(!data) return;
// 设置内容
this.content = data.content;
// 创建提示框模板
this.panel = document.createElement('div');
// 创建提示内容组件
this.contentNode = document.createElement('p');
// 创建确定按钮组件
this.confirmBtn = document.createElement('span');
// 创建关闭按钮组件
this.closeBtn = document.createElement('b');
// 为提示框模板添加类
this.panel.className = 'alert';
// 为关闭按钮添加类
this.closeBtn.className = 'a-closse';
// 为确定按钮添加类
this.confirmBtn.className = 'a-confirm';
// 为确定按钮添加文案
this.confirmBtn.innerHTML = data.confirm || '确认';
// 为提示内容添加文本
this.contentNode.innerHTML = this.content;
// 点击确定按钮执行方法 如果data中有success方法则为success方法,否则为空函数
this.success = data.success || function();
// 点击关闭按钮执行方法
this.fail = data.fail || function();
}

模板的原型方法

既然这个基本提示框是可创建的,那么它也应该具有一些基本方法,比如应该有init方法来组装提示框, bindEvent方法来绑定点击确定或关闭按钮事件,等等。

// 提示框原型方法
Alert.prototype = {
// 创建方法
init: function() {
// 生成提示框
this.panel.appendChild(this.closeBtn);
this.panel.appendChild(this.contentNode);
this.panel.appendChild(this.confirmBtn);
// 插入页面中
document.body.appendChild(this.panel);
// 绑定事件
this.bindEvent();
// 显示提示框
this.show();
},
bindEvent: function() {
var me = this;
// 关闭按钮点击事件
this.closeBtn.onclick = function() {
// 执行关闭取消方法
me.fail();
// 隐藏弹层
me.hide();
}
// 确定按钮点击事件
this.confirmBtn.onclick = function() {
// 执行关闭确认方法
me.success();
// 隐藏弹层
me.hide();
}
},
// 隐藏弹层方法
hide: function() {
this.panel.style.display = 'none';
},
// 显示弹层方法
show: function() {
this.panel.style.display = 'block';
},
// 确认方法
success: function() {
console.log('success');
}
// 取消方法
fail: function() {
console.log('fail');
}
}

有了这个提示框基类,再想拓展其他类型弹层则容易多了,比如右侧按钮提示框

// 右侧按钮提示框
var RightAlert = function(data) {
// 继承基本提示框的构造函数
Alert.call(this. data);
// 为确认按钮添加right类设置位置偏右
this.confirmBtn.className = this.confirmBtn.className + ' right';
} // 继承基本提示框方法
RightAlert.prototype = new Alert();

取消按钮提示框

// 取消按钮提示框

var CancelAlert = function(data) {
Alert.call(this, data);
this.cancelBtn = document.createElement('span');
this.cancelBtn.innerHTML = data.cancelText || '取消';
this.cancelBtn.className = 'a-cancel btn';
} CancelAlert.prototype = new Alert(); CancelAlert.prototype.init = function() {
Alert.prototype.init.call(this);
this.panel.appendChild(this.cancelBtn);
}

右侧取消按钮提示框

/ 右侧取消按钮提示框
var RightCancelAlert = function(data) {
// 继承取消提示框的构造函数
CancelAlert.call(this, data);
this.cancelBtn.className = this.cancelBtn.className + ' right'
} RightCancelAlert.prototype = new CancelAlert(); RightCancelAlert.prototype.init = function() {
CancelAlert.prototype.init.call(this);
}

javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式的更多相关文章

  1. javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件

    有一个需求要为document对象绑定click事件来是想隐藏提示框的交互功能,于是小白写了如下代码: document.onclick = function(e) { e.preventDefaul ...

  2. javascript设计模式(张容铭) 第14章 超值午餐-组合模式 学习笔记

    JS 组合模式更常用于创建表单上,比如注册页面可能有不同的表单提交模块.对于这些需求我们只需要有基本的个体,然后通过一定的组合即可实现,比如下面这个页面样式(如图14-2所示),我们来用组合模式实现. ...

  3. JavaScript设计模式之观察者模式(学习笔记)

    设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...

  4. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  5. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  6. 《JavaScript DOM 编程艺术》 学习笔记

    目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...

  7. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  8. JavaScript闭包(Closure)学习笔记

    闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  9. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

随机推荐

  1. 【OpenJ_Bailian - 1328】Radar Installation (贪心)

    Radar Installation 原文是English,直接上中文 Descriptions: 假定海岸线是无限长的直线.陆地位于海岸线的一侧,海洋位于另一侧.每个小岛是位于海洋中的一个点.对于任 ...

  2. 基于IDEA采用springboot+Mybatis搭建ssm框架简单demo项目的搭建配置流程

    一.通过对比可以原始SSM搭建流程,spring boot省去了大量的配置,极大提高了开发者的效率.原始SSM框架搭建流程见博客: https://www.cnblogs.com/No2-explor ...

  3. 你了解SVN, CVS等版本控制器吗?

    版本控制器SVN, CVS是两种版本控制器, 需要配套相关的SVN, CVS服务器, SCM是xcode里面配置版本控制的地方, 版本控制的原理就是A和B同时开发一个项目, A写完当天的代码之后把代码 ...

  4. 茅台【思维/数学/剪枝】By cellur925

    题目传送门 给你\(n\)根木棍,问有多少种方法,使得选出的三根木棍能组成三角形. 开始想要用搜索的,但是写着写着卡壳了(?),于是改用贪心,开始对拍,觉得很稳,只是最后两个数据可能有点卡.很第一题难 ...

  5. eclipse svn 相关

    eclipse本身带有cvs插件,我们也可以在eclipse里面加上svn插件,请参考eclipse安装svn插件,以及使用,但是在eclipse的左边栏,.svn,.cvs的文件会显示出来,目录拉的 ...

  6. PostgreSQL - 模糊查询

    前言 like.not like在SQL中用于模糊查询,%表示任意个字符,_表示单个任意字符,如果需要在模糊查询中查询这两个通配符,需要用ESCAPE进行转义,如下: select * from ta ...

  7. nginx之location、rewrite配置

    https://www.cnblogs.com/koal/p/6915106.html rewrite  地址重写 如上配置对于: /images/ttt/test.png 会重写到/mic?file ...

  8. HTML表格的基本结构标记

    <table>标记 1.基本格式:<table 属性1="属性值1" 属性2="属性值2" ... ...>表格内容</table ...

  9. 使用Yeoman 创建 angular应用

    一.安装 Yeoman npm install yo -g 如果提示当前nodejs版本和npm版本太低,先升级下再安装yeoman. 安装成功后,默认只有webapp和Mocha这两个生成器. 二. ...

  10. [已读]了不起的Node.js

    2015/1/22 昨天下班前看完了这本,也不算看完,redis与mysql部分没有去翻,觉得暂时用不上. 觉得第一部分的内容还不错. 第二部分主要讲fs,tcp和http这三个模块. 第三个部分是例 ...