js组件

把一个效果或者功能用面向对象的方法封装起来,只提供给用户一些相关的方法或者数据接口

1、特点

易扩展,易维护。相互之间不会有影响

2、组件的组成

①配置参数

  放在初始化函数里,这是一段关于拖拽的代码

  初始化函数

Drag.prototype.init=function(opt){
this.settings={
downFn:opt.downFn||function(){},
moveFn:opt.moveFn||function(){},
upFn:opt.upFn||function(){}
};
};

  默认参数

//这是默认参数,下面的程序都要用这里的参数
this.settings={
id:'', //这个属性是必传的
downFn:function(){},
moveFn:function(){},
upFn:function(){}
};

要拿用户传的参数,去覆盖默认参数,用for in方法

//初始化函数
Drag.prototype.init=function(opt){
//在初始化函数里面,拿用户传进来的参数去覆盖默认的参数,并且这个代码要放在init函数的最上面
for(var attr in opt){
if(this.settings.hasOwnProperty(attr)){
//如果默认参数里有这个属性的话,才拿用户传入的参数去覆盖
this.settings[attr]=opt[attr];
}
} this.obj=document.getElementById(this.settings.id); var This=this;
this.obj.onmousedown=function(ev){
This.down(ev);
};
};

②方法

  放在原型里的函数

Drag.prototype.down=function(ev){
this.settings.downFn.call(this); this.disX=ev.clientX-this.obj.offsetLeft;
this.disY=ev.clientY-this.obj.offsetTop; var This=this; document.onmousemove=function(ev){
This.move(ev);
};
document.onmouseup=function(){
This.up();
};
};

③自定义事件

  除了系统以外的事件

    需要用到事件绑定器、事件触发器

    自己定义的事件,除了系统提供以外的事件。有利于多人协作开发,可扩展js原有事件

    自定义事件其实就是调用函数,在指定的环境下让这个函数触发,就相当于事件了

 (1)自定义事件三要素

对象、事件名、事件处理函数

1、可以利用对象数据结构里的key:value的形式把事件名字与事件处理函数对应起来

2、把多个函数放到一个数组里,循环去执行数组里每个函数,就可以做到让所有函数都执行

(2)定义事件

obj.events={

'事件名1':[fn1,fn2],

'事件名2':[fn3,fn4,fn5],

}

//添加自定义事件
function customEvent(obj,eventName,fn){
obj.events=obj.events||{}; //如果obj身上已经有个这属性,就用自己的
obj.events[eventName]=obj.events[eventName]||[]; //如果events里面有内容了,就用自己的
obj.events[eventName].push(fn); //把事件用push的方法添加到数组里
}

(3)调用事件(循环去调)

obj.events['事件名1'].fn1();

obj.events['事件名1'].fn2();

//触发自定义事件
function trigger(obj,eventName){
//触发的时候要去看一下对象身上有没有这个事件,事件是放在对象身上的events下
if(obj.events[eventName]){
for(var i=0;i<obj.events[eventName].length;i++){
obj.events[eventName][i].call(obj);
}
}
};

调用事件

customEvent(box,'点击',function(){
console.log('box点击了');
});


JS难点--组件开发的更多相关文章

  1. 【2015上半年总结】js开源组件开发系列索引

    js开源组件开发系列一索引 2015.8 by 田想兵 个人网站 从3月份进入新公司以来,时经五个月,我以平均每周1个小组件的速度,已经完成的js组件有22个之余了,已基本上全部用到实际项目中,这些小 ...

  2. [js开源组件开发]network异步请求ajax的扩展

    network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loadin ...

  3. [js开源组件开发]数字或金额千分位格式化组件

    数字或金额千分位格式化组件 这次距离上一个组件<[js开源组件开发]table表格组件>时隔了一个月,由于最近的项目比较坑,刚挖完坑,所以来总结性提出来几个组件弥补这次的空缺,首先是金额和 ...

  4. [js开源组件开发]query组件,获取url参数和form表单json格式

    query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……, ...

  5. [js开源组件开发]localStorage-cache本地存储的缓存管理

    localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...

  6. [js开源组件开发]js手机端浮层控件,并有多种弹出小提示,兼容pc端浏览器

    js dialog组件,包含alert和confirm的实现 本组件所有的资源均在github上可以查看源代码 GitHub 本dialog的组件的例子请在这里查看 demo dialog js di ...

  7. [js开源组件开发]tip提示组件

    tip提示组件 常见的应用场景中,总是难免会遇到提示信息,比如显示不完全时需要鼠标移上去显示title,比如验证时的错误提示,比如操作按钮的辅助说明等,所以我独立出来了一个小的js组件,tip提示组件 ...

  8. [js开源组件开发]loading加载效果

    loading加载效果 由于程序和网络的原因,常常我们需要在交互的时候,给用户一个正在加载中的动画,于是,loading组件横空出世.不需要复杂的代码,也能完成大多数业务,这就是我做组件的原则. 效果 ...

  9. [js开源组件开发]table表格组件

    table表格组件 表格的渲染组件,demo请点击http://lovewebgames.com/jsmodule/table.html,git源码请点击https://github.com/tian ...

随机推荐

  1. 201521123062《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...

  2. 201521123057 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...

  3. php中文分词

    主要列出现知道的几个工具: 1,scws中文分词支持php7 http://www.xunsearch.com/scws/index.php 2,phpanalysis中文分词,主要使用了机械分词方法 ...

  4. 在centos6,7 上编译安装内核

      小编以前写过一篇软件的源码编译安装,今天小编再给大家带来一篇内核的编译安装.   今天,就以centos7 编译安装最新版本4.13.2 内核为例,给大家详解.编译安装之前,检查一下自己的磁盘空间 ...

  5. Oracle-更新字段-一张表的字段更新另一张的表的字段

    设备表ops_device_info中的终端号terminal_id值是以 'D'开头的字符串,而终端表ops__terminal_info中的终端号terminal_id是8位字符串, 它们之间是通 ...

  6. mybatis-java-依赖注入

    第一种 setXXX形式的注入 我们的所有dao都会继承自定义的BaseDao,因此在BaseDao中完成对所有dao的注入 在DaoUtil中增加方法injectDao()来注入具体的dao pac ...

  7. eclipse安装java ee插件方法步骤

    1.本人以前使用的MyEclipse进行Javaweb开发,但是后来由于myeclipse实在太臃肿,经常在运行的过程中不流畅 (可能电脑内存也不是太高吧)   !所以坚决换用eclipse,但是问题 ...

  8. mongodb 与关系型数据库

    设计 MongDB 模式时应注意的问题 根据用户需求来设计模式. 如果想一起使用对象,请将这些对象合并到一个文档中,否则要将它们分开(但是要确保不需要连接). 经常复制数据(但要有一定限度),因为与计 ...

  9. CentOS7下安装MariaDB

    环境:Window10 上建立 VMWare 虚拟机,EasyInstaller 方式安装 CentOS 7 1. “失败”的经历 备份原 repo 文件,并更改 yum 源(方法详见修改yum源)为 ...

  10. CentOSv6.8 修改防火墙配置、修改SSH端口

    查看防火墙目前使用状况: service iptables status 修改防火墙配置: vi /etc/sysconfig/iptables 重启防火墙,让刚才修改的配置生效: service i ...