js写插件教程
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
#demo-1,#demo-2{width: 200px;height: 200px;border: 1px solid #ddd;}
</style>
</head>
<body>
<h3>点击add可以添加个自input的内容到div里并实现变颜色</h3>
<!--组件实例1-->
<div id="demo-1">
<input type="" name="" id="" value="好的" />
<button id="add-1">add</button>
</div>
<br /> <br />
<!--组件实例2-->
<div id="demo-2">
<input type="" name="" id="" value="吗的" />
<button id="add-2">add</button>
</div>
<script type="text/javascript">
//这里是插件的代码;我为了方便都写到一个html中了;请把这个script标签中的内容单独写在一个js文件里
//整个插件写在一个立即执行函数里这不用啰嗦了吧;就是(function(){}());
//头部的win啊,doc啊 $ 啊都tm是底部的window,document,jQuery的映射;方便内部直接调用;
//当然你不引用jq的话头部的$和底部的jQuery干掉;你若引用了更过的依赖可以依次添加;
//最后面的undefined可不写;最好写了;保证里面再出现的undefined是未定义的意思;不被其他东西赋值;
//好了下面是时候展现真正的技术了
//插件的开头为!号(叹号)或者;(分号)这不是写错了,为了防止那个二货写的js结束没有分号;而发生报错
/*
;(function(win,doc,$,undefined){//我们随便写一个插件吧 比如你要
var addHtml = function(){
}
}(window,document,jQuery))// 我下面就不引用jq 了
*/
;(function(win,doc,undefined){
//我们随便写一个插件吧 比如你要点击按钮 添加input的值到 div里
var addHtml = function(demo,btn){//插件名,调用的时候直接new一下插件名就行了并传参数或者传对象(一般这个函数名手写字母大写比较好,构造函数嘛,其实也是函数)
//很明显我要传id名;这里传什么都可以的其实;
this.div = doc.getElementById(demo);//为什么把获取的id传给this.div呢?this的指向为调用的实例;我们此时姑且认为this就指向这个函数;因为这样我们之后再想获取这个div就可以直接用this.div了好吗;而不是在document.getElementById(。。。。)
this.btn = doc.getElementById(btn);
this.Input = this.div.getElementsByTagName("input")[0];//既然找到了div我们在找下div下面的input;当然你要不input用获取id的形式传参数我没有意见
this.num = 0;//你也可以写一些其他的默认的东西;比如默认的变量啦;方便下面调用;这里写了什么都不会报错;只是有用没用的问题这行可以忽略
this.author = "连小壮";
this.init();//执行下你下面写的函数吧;你想想;如果整个插件没有执行函数;多不好;一堆方法function就不调用;对;这里是调用的时候最开始执行的函数
}
//万物皆对象;给addHtml对象原型里添加属性(方法)
addHtml.prototype = {//给函数写方法;我艹;这里可能不止一个函数;你还记得你在全局里写一个个的function吗;贼几8乱;
//找也不好找;把一个个函数都写到对象的属性里;调用函数就直接调用对象的属性;
constructor:addHtml,//构造器指向原型对象;你还记得吗;这行其实不写没啥毛病;不过有时候防止构造器指向Object的情况;你还是装逼写上吧;
init:function(){//这里的init;你也可以写成 nimade:function(){ }都没有问题;就是在addHtml函数里this.init();执行下;你明白了这里的this了吧;你吗整个插件里this都是只得这个函数(实例);除非你又引入了其他的函数里的(其他函数里的可能指向就是window了)
var _self = this;////把this保存下来防止在局部函数内部取不到(局部函数内部取得this可能是别的)
this.btn.onclick = function(){
var _val = _self.Input.value;
var tempdiv = doc.createElement("div");//创建临时div存放获取input的值
tempdiv.innerHTML = _val;
//console.log(tempdiv);
_self.div.appendChild(tempdiv);
_self.setColor();//你把所有方法都写在init里绝对没问题;还是那句话;说好的松耦合呢;说好的不写一堆堆的function一层层乱j8套呢
};
},
setColor:function(){
//console.log(this.div)
this.div.style.color= "red"
}/*,
otherFun(){
//当然你还可以扩展其他方法;这些方法之间都可以互相调用;
只要用this.方法名 就行了;如果在取不到this比如上面的click函数中的this指向点击的button;只要在写var _self = this;就可以用_self 代替this(函数实例)了;当然_self 也可以写成别的 比如$this等自定义的
}*/
}
win.addHtml = addHtml;//把这个对象附给window底下的 名字叫addHtml的对象;要不你调用的时候 new addHtml() 怕在window的环境下找不到;
}(window,document))
</script>
<script type="text/javascript">
new addHtml("demo-1","add-1");//这里是实例1调用插件的代码
new addHtml("demo-2","add-2"); //这里是实例2调用插件的代码
//是不是明白为什么要写插件了;要封装;两个相同组件即使有相同的class名在dom操作的时候也不会相互冲突;因为他们都new出来了个自的实例;有自己的this;有自己的一套方法了(其实方法都在原型里是公用的;操作各自的dom)
</script>
<!--这里是最简单的插件写法;当然还有传对象参数的插件等等。。。。-->
</body>
</html>
js写插件教程的更多相关文章
- js写插件教程深入
原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处 js 写插件教程深入 1.介绍具有安全作用域的构造函数 function Fn(name){ t ...
- js写插件教程入门
原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处 1. 点击add可以添加个自input的内容到div里并实现变颜色 <div id=& ...
- 自己动手写插件底层篇—基于jquery移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
- 为jQuery写插件
很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...
- jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档。
jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档. jquery.cookie中的操作: jquery.cookie.js是一个基于jquer ...
- js写的复制功能,只支持IE
如果用js写,只能支持IE,如果想全支持,需要用jQuery的插件:jquery.zclip.js 下面是用js写的: var copyHref = function(){ ...
- 关于如何使用three.js的小教程<一>
昨天看了看three.js这个东西,身为一个3D引擎,他还是非常强大的.官网上有个tutorial讲的不甚具体.http://aerotwist.com/tutorials/getting-start ...
- windows下Eclipse安装Perl插件教程
windows下Eclipse安装Perl插件教程 想用eclipse编写perl.网上看了很多资料.但EPIC插件的下载连接都失效了.无奈,只好自己动手写个教程记录一下. 准备工作: 安装好Ecli ...
- knob.js进度插件
关于knob.js进度插件的使用 关于这个插件,妹的,第一次使用坑死爹了,各种不会,幸亏我有持之以恒的精神,最终还是让其臣服于我的胯下.... 1. 引入 head 部分添加knob.js,同时引 ...
随机推荐
- php最新微信扫码在线支付接口。ecshop和shopex,shopnc下完美无错
最近为客户的一个在线商城做了一个微信扫码在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件.2 微信提供2种扫码方式,大家可以根据自己 ...
- JSON对象、JSON字符串的相互转换
JSON对象.JSON字符串的相互转换 json的格式: 第一种方式: 单一的json字符串,转换成json对象时,需要 eval('(' + json + ')');这样的格式,中间需要加括号 va ...
- struts2 之 Action的优化配置
总结:struts2种action的配置文件会随着业务的增加而增加,导致配置文件膨胀.struts2中提供了三种方案来解决这个问题: 1. 动态方法调用来实现. 2. 通配符配置来解决. 3. 使用注 ...
- jquery实现图片上传前本地预览
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- js中将yyyy-MM-dd格式的日期转换
1.转换为yyyy年MM月dd日 var str = "2017-02-16"; var reg =/(\d{4})\-(\d{2})\-(\d{2})/; var date = ...
- redis skiplist (跳跃表)
redis skiplist (跳跃表) 概述 redis skiplist 是有序的, 按照分值大小排序 节点中存储多个指向其他节点的指针 结构 zskiplist 结构 // 跳跃表 typede ...
- CF #271 F Ant colony 树
题目链接:http://codeforces.com/contest/474/problem/F 一个数组,每一次询问一个区间中有多少个数字可以整除其他所有区间内的数字. 能够整除其他所有数字的数一定 ...
- Lambda表达式随笔
1.Lambda表达式是一个匿名函数,其本质其实还是一个函数,因此任何一个Lambda表达式都可以以其它的方式通过普通的函数实现或者代替. 2.Lambda表达式云算符:=>,该运算符读为&qu ...
- python基本数据类型——tuple
一.元组的创建与转换: ages = (11, 22, 33, 44, 55) ages = tuple((11, 22, 33, 44, 55))ages = tuple([]) # 字符串.列表. ...
- 开发一款直播APP系统软件应该有哪些功能,如何开发?
1.技术实现层面: 技术相对都比较成熟,设备也都支持硬编码.IOS还提供现成的 Video ToolBox框架,可以对摄像头和流媒体数据结构进行处理,但Video ToolBox框架只兼容8.0以上版 ...