接着做关于alert组件的笔记

怎么又出来个中高级呢 对没错 就是出一个中高级来刷流量呵呵呵,但是中高级也不是白叫的 这次主要是增加了widget类,增加了自己绑定的事件和触发事件的方法!这么做是为什么呢 首先弥补浏览器自身事件交互的问题 最重要的就是 一个元素一个事件只能绑定一次!具体啥意思呢 就是一个元素只能添加一个click事件 要是在添加一个click事件就会把之前的click事件给覆盖掉(当然我就纳闷了你不会写一个事件里啊哈,但是说不定有特殊情况呢) 这是第一个原因,第二个原因就是尽量把一些关于dom的操作封装到组件的这个级别了,不要所有的事件操作都下降到dom这个层级 多了的化 会非常的乱套!为了解决上述两个问题,可以自己定义一个widget封装成一个类把事件绑定触发都放在这里,这样很多的时间绑定就可以直接写在调用组件的地方了 触发也简单了很多!不多说直接上图

下面是widget类

define(['jquery'] , function(){
function Widget(){
this.handlers = {};
}
Widget.prototype ={
on:function(type,handler){ if(typeof this.handlers[type] == 'undefined'){
this.handlers[type] = [];
}
this.handlers[type].push(handler);
return this;
},
fire:function(type,data){
if(this.handlers[type] instanceof Array){
var handlers = this.handlers[type]; for(var i = 0 ; i<handlers.length; i++){
handlers[i](data)
}
}
}
}
return {
Widget : Widget
}
})

把这个新的widget类引入到我们的组件中 如下是新window类

define(['jquery','widget'],function($,widget){
function Window(){
this.cfg = {
width:400,
height:200,
content:'我是默认文本内容',
handle:null,
title:'系统消息',
skinClassName:null,
hasCloseBtn:false,
hasMask:false,
handlerClosebtn:null
}
}
Window.prototype = $.extend({},new widget.Widget(),{
alert:function(cfg){ var that = this;
var CFG = $.extend(this.cfg,cfg);
//var boundingBox = $('<div class="window_boundingBox"></div>');
var boundingBox = $('<div class="window_boundingBox">'+
'<div class="window_header">'+CFG.title+'</div>'+
'<div class="window_body">'+CFG.content+'</div>'+
'<div class="window_footer"><input type="button" value="确定"></div>'+
'</div>'); boundingBox.appendTo('body') var btn = $('.window_footer input'); if(CFG.hasMask){ mask = $('<div class="window_mask"></div>');
mask.appendTo('body'); }
btn.appendTo(boundingBox);
btn.click(function(){
CFG.handle && CFG.handle();
boundingBox.remove();
mask && mask.remove();
}) boundingBox.css({
width:this.cfg.width + 'px',
height:this.cfg.height + 'px',
left:(CFG.x || (window.innerWidth - CFG.width)/2)+'px',
top:(CFG.y || (window.innerHeight - CFG.height)/2)+'px',
}) //右上角关闭按钮
if(CFG.hasCloseBtn){
var closeBtn = $('<span class="window_closeBtn">X</span>');
closeBtn.appendTo(boundingBox);
closeBtn.click(function(){
boundingBox.remove();
mask && mask.remove();
that.fire('close');
})
} //定制样式
if(CFG.skinClassName){
boundingBox.addClass(CFG.skinClassName);
} //绑定关闭样式
/*if(CFG.handlerClosebtn){
this.on('close',CFG.handlerClosebtn);
}*/
return this;
}
})
return {
Window:Window
}
})

最后在调用处的代码 很多触发事件代码就可以直接写在这里了很方便也简洁

require(['jquery','window'],function($,w){
var win = new w.Window();
win.alert({
width:500,
height:300,
content:'新年快乐',
title:'我是正确标题',
hasCloseBtn:true,
hasMask:true,
})
win.on('close' , function(){
alert('关闭');
})
})

自己封装js组件 - 中级中高级的更多相关文章

  1. 自己封装js组件 - 中级

    书接上文,上次弄了个基本版本的alert组件(其实就是十分钟前)但是很多功能都没有实现 没有关闭按钮 没有下面确定按钮 没有模态框 没有这那的 这次终极篇就都给它完善好弄个中级版本也是基本可用版本! ...

  2. 自己封装js组件 - 初级

    2天前抱着试试看的态度注册了此神博,心血来潮呕心沥血写了一篇关于vue 自定义组件的小文章 尼玛果然一个评论的没有!果然毫无人气!(当然了我这文章内容有限和大神们的比起来简直是粗制滥造...)索性我就 ...

  3. JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错

    前言:之前分享过两篇bootstrap下拉框的组件:JS组件系列——两种bootstrap multiselect组件大比拼  和 JS组件系列——Bootstrap Select2组件使用小结 ,收 ...

  4. JS组件系列——封装自己的JS组件,你也可以

    前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...

  5. JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

    前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ...

  6. JS组件系列——封装自己的JS组件

    前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...

  7. Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件

    1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...

  8. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)

    前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...

  9. JS组件系列——BootstrapTable 行内编辑解决方案:x-editable

    前言:之前介绍bootstrapTable组件的时候有提到它的行内编辑功能,只不过为了展示功能,将此一笔带过了,罪过罪过!最近项目里面还是打算将行内编辑用起来,于是再次研究了下x-editable组件 ...

随机推荐

  1. HDU 4828 (卡特兰数+逆元)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...

  2. JBoss AS 7之文件夹结构(The Return Of The King)

    1.2 JBoss As 7体系结构 以下介绍一下JBoss的体系结构,详细的文件夹结构. 假设熟悉曾经JBoss版本号的人,一定会发现JBoss AS 7与之前的JBoss的文件夹结构有了非常大的不 ...

  3. Darwin流媒体server在windows下搭建

    简单介绍 主页:   http://dss.macosforge.org/ Darwin Streaming Server (DSS) is an open sourceproject intende ...

  4. Handler.post与View.post的区别

    Android的线程分UI线程与非UI线程两类.而Handler是非UI线程向UI线程传递消息的桥梁. 除了非常常用sendMessage之外,Handler也提供了post(Runnable...) ...

  5. nyoj--1036--非洲小孩(区间相交问题)

    非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 家住非洲的小孩,都很黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不经常洗澡.(常年缺水,怎么洗 ...

  6. Binary Indexed Tree

    我借鉴了这个视频中的讲解的填坑法,我认为非常易于理解.有FQ能力和基本英语听力能力请直接去看视频,并不需要继续阅读. naive 算法 考虑一个这样的场景: 给定一个int数组, 我们想知道它的连续子 ...

  7. html 移动端关于长按图片弹出保存问题

    在做html5项目的时候有个需求是要拖动一个图片,但是又不要用户长时间按着弹出保存框.首先想到的就是在点图片的时候阻止默认事件的发生: js停止冒泡· function myfn(e){ window ...

  8. C++线程安全退出

    HANDLE m_EvtThreadExit[MaxVisionNum]; //定义 方法一 ;i<MaxVisionNum;i++) m_EvtThreadExit[index] = Crea ...

  9. 中文版 R-FCN: Object Detection via Region-based Fully Convolutional Networks

    R-FCN: Object Detection via Region-based Fully Convolutional Networks 摘要 我们提出了基于区域的全卷积网络,以实现准确和高效的目标 ...

  10. Ubuntu系统下安装Eclipse

    第一步:查看操作系统位数. 打开终端,输入file /sbin/init 可以看到笔者Ubuntu系统为32位,读者可以使用该命令获取自己机器上的操作系统位数. 这一步是最至关重要的一步,笔者机器处理 ...