javascript设计模式系列01_单例模式应用_tooltip插件
2018-01-11 12:16
405 查看
效果图:
代码:
代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> *{ margin:0; padding:0; list-style: none; } #box1{ position:relative; width:200px; height:150px; background-color: brown; } #box2{ position:relative; width:300px; height:200px; background-color:green; } </style> </head> <body> <div id="box1"> </div> <br/><br/><br/><br/> <div id="box2"> </div> </body> </html> <script type="text/javascript"> function $(id){ return document.getElementById(id); } //1.......单例模式的提示框 let tooltipSingleton = ( function () { //默认属性值(提示框的默认数据,方便调用者,即调用者不传输宽,高,背景颜色等,也是可以出现提示框的) let defaultObj = { "domObj":document.body,// "width":100,//提示框默认的宽度是100 "height":30,//提示框默认的高度是30 "bgcolor":"#f1f1f1",//默认背景颜色 "color":"#600000",//默认字体颜色 "fontSize":"14px",//默认字体大小 "border":"1px solid black",//默认的边框样式 "title":"暂时无提示信息",//默认的提示信息 "isRadius":true,//默认带圆角 "radiusSize":5//默认圆角的大小是5px }; //给属性赋值(把传入的属性值和默认属性值进行合并) function assignAttribute(tooltipObj,obj) { //合并后的对象 let tmpObj = {}; //1、把默认属性值赋给tmpObj for(let key in defaultObj){ tmpObj[key] = defaultObj[key]; } //2、把传来的属性值赋给tmpObj for(let key in obj){ tmpObj[key] = obj[key]; } //给tooltip对象属性进行赋值; for(let key in tmpObj){ tooltipObj[key] = tmpObj[key]; } } //一、构造函数 function ToolTip(obj){ } //创建tooltip对象对应的dom元素 ToolTip.prototype.createUI=function () { //给父元素增加定位 this.domObj.style.position="relative"; //1、创建div this.toolTipDom = document.createElement("div"); this.toolTipDom.style.cssText="position:absolute"; } //修改tooltip对象对应dom元素的样式属性,并改变父元素(不同的提示框的外观不一样) ToolTip.prototype.updateUI=function () { //1、修改dom元素的样式属性 this.toolTipDom.style.left = (this.domObj.offsetWidth-this.width)/2+ "px"; this.toolTipDom.style.top = (this.domObj.offsetHeight-this.height)/2+"px"; this.toolTipDom.style.width = this.width+"px"; this.toolTipDom.style.height =this.height+ "px"; this.toolTipDom.style.backgroundColor=this.bgcolor; this.toolTipDom.style.color =this.color; this.toolTipDom.style.fontSize =this.fontSize; this.toolTipDom.style.border =this.border; if(this.isRadius){ this.toolTipDom.style.borderRadius = this.radiusSize+"px"; } this.toolTipDom.style.display = "block"; this.toolTipDom.innerHTML = this.title; //2、修改dom元素的父元素 this.domObj.appendChild(this.toolTipDom); } //隐藏提示框 ToolTip.prototype.hiddenUI=function () { this.toolTipDom.style.display = "none"; } //给需要提示框的元素绑定onmouseout事件 ToolTip.prototype.initEvent=function(){ this.domObj.onmouseout = (event)=>{ let evt = event || window.event; //如果目的地是toolTipDom元素的话,说明是离开父元素进入了子元素,不删除提示框 if(evt.toElement==this.toolTipDom){ return; } //把提示框隐藏起来 this.hiddenUI(); } } //二、对外开放一个函数,这个函数的目的是控制对构造函数的调用 let instance;//这个表示单例对象 return { getInstance : function (obj) { if(!instance){//首次使用该对象,就需要创建 //1、JavaScript对象 //1)、创建JavaScript的对象 instance=new ToolTip(obj); //2)修改JavaScript对象(instance)属性的值 assignAttribute(instance,obj); //2、javascript对象对应的dom对象 //1)、创建javascript对象对应的dom对象div instance.createUI(); //2)、修改dom对象的外观样式 instance.updateUI(); //3)、给dom元素加上事件 instance.initEvent(); }else{//不是首次使用该对象,就不需要创建,只需要修改它的属性值即可 //1、JavaScript对象 //1)、修改JavaScript对象(instance)属性的值 assignAttribute(instance,obj); //2、javascript对象对应的dom对象 //1)、修改dom对象的外观样式 instance.updateUI(); //2)、给dom元素加上事件 instance.initEvent(); } return instance; } } } )(); //2.......调用 window.onload = function () { $("box1").onmouseover = function(){ tooltipSingleton.getInstance({"domObj":this}); } $("box2").onmouseover = function(){ tooltipSingleton.getInstance({"domObj":this,"width":300,"title":"这是绿色的div"}); } } </script>
相关文章推荐
- [Professional ASP.NET Design Pattern 读书笔记系列] 01 成功应用的模式
- 设计模式学习总结系列应用实例
- Silverlight实用窍门系列:33.OOB模式下WebBrowser的简单应用--模拟浏览器和百度地图【附带源码实例】
- 设计模式系列课程01之【依赖、关联、聚合、组合的理解】
- Android那点事-系列之(三)MVP模式在Android中的应用
- JavaScript设计模式系列二:单例模式
- 《精通CSS:高级Web标准解决方案》系列(01):为样式找到应用目标
- 应用集成实战系列:服务总线中的发布订阅业务模式
- 应用系统菜单与主界面 构造模式 01
- JavaScript设计模式系列:模块模式(Module)
- 插件开发技术说明(17)---应用CRUD开发模式范例
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(十一)插件模式集成
- 大家一起学面向对象设计模式系列Chapter 01 本系列介绍
- 应用集成实战系列:服务总线中的同步业务交互模式
- JavaScript设计模式——单例模式的理解与应用
- JavaScript设计模式系列04_组合模式写的菜单
- JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
- 消息订阅、派送设计模式在“平台-插件”式软件架构设计中的应用
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
- 20171107L09-01老男孩Linux运维实战培训-Lamp系列-Apache服务生产实战应用指南04-基于IP的虚拟主机实战配置