js封装插件【组件】三种方式,含es6新特性。
1.先来说一下我使用到的es6的Object.assign。在jq里合并对象用的是extend方法,用来处理默认参数和传入参数做合并。es6里为我们提供了Object.assign,但是ie下全部撂倒。
解决办法:在使用Object.assign之前,写下:
if (!Object.assign) {
Object.defineProperty(Object, "assign", {
enumerable: false,
configurable: true,
writable: true,
value: function(target, firstSource) {
"use strict";
if (target === undefined || target === null)
throw new TypeError("Cannot convert first argument to object");
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
if (nextSource === undefined || nextSource === null) continue;
var keysArray = Object.keys(Object(nextSource));
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
var nextKey = keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey];
}
}
return to;
}
});
}
2.第一种,面向对象写法-挂载到window下
(function(win, doc) {
var defaultSettings = {
/* color: "red",
background: "blue",
border: "2px solid #000",
fontSize:"30px",
textAlign:"center",
width:"200px",
borderRadius:"5px" */
};
function SetStyles(options) {
var self = this;
//没传配置项自己丢错
if(!options) {
throw new Error("请传入配置参数");
}
if (!Object.assign) {
Object.defineProperty(Object, "assign", {
enumerable: false,
configurable: true,
writable: true,
value: function(target, firstSource) {
"use strict";
if (target === undefined || target === null)
throw new TypeError("Cannot convert first argument to object");
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
if (nextSource === undefined || nextSource === null) continue;
var keysArray = Object.keys(Object(nextSource));
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
var nextKey = keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey];
}
}
return to;
}
});
}
self = Object.assign(self, defaultSettings, options);
self.container = doc.querySelector(self.container) || doc.querySelectorAll(self.container);
self.init();
}
SetStyles.prototype = {
/* _changeStyles: function() {
var self = this;
for(var pro in self) {
if(pro == "container") {
continue;
}
if(pro == 'text' && typeof self[pro]== 'string') {
self.container.innerText = self[pro];
continue;
}else if(pro == 'text' && typeof self[pro]== 'function'){
self.container.innerText = self[pro]();
continue;
}
self.container.style[pro] = self[pro];
}
}, */
appendCss:function(){
var link=document.createElement('link');
link.href="./index.css";
link.type='text/css';
link.rel = 'stylesheet';
document.querySelector("head").appendChild(link);
},
appendHtml:function(){
var htmlin='<div class="box">'+
'<p>我是内容</p>'+'</div>';
var html=document.createElement("div");
html.innerHTML=htmlin;
document.querySelector("body").appendChild(html);
},
init:function(){
this.appendCss();
this.appendHtml();
}
}
win.SetStyles = SetStyles;
})(window, document)
//调用:
new SetStyles({
container:"#box",
background:"#fff",
textAlign:"center",
text:function(){
return "我是文本";
}
});
第二种:面向对象方法【推荐】
"use strict";
class websong{
constructor(opt){
const ops={
el:"",
css:"./class.css"
}
this.ops=Object.assign({},ops,opt)
}
appendCss(){
var thas=this;
var link=document.createElement("link");
link.href=thas.ops.css;
link.type='text/css';
link.rel = 'stylesheet';
link.setAttribute("id","main")
document.querySelector("head").appendChild(link); /* return link.onload = link.readystatechange = function () {
if (!link.readyState || /loaded|complete/.test(link.readyState)) {
//开始回调
link.onload = link.readystatechange = null;
}
} */ }
appendHtml(){
var thmlin='<div id="openBoxCtitle"><span>标题</span><span id="openBoxClose">【关闭】</span></div><div class="containnr"><p>我是生成的内容</p></div>';
var html=document.createElement("div");
html.setAttribute("id","openBoxContainer");
html.className="hide";
html.innerHTML=thmlin;
document.querySelector("body").appendChild(html);
var showdin="<div class='moveBg'></div>";
var showd=document.createElement("div");
showd.innerHTML=showdin;
document.querySelector("body").appendChild(showd);
}
evnet(){
var thas=this;
var el;
if((thas.ops.el).match(/[#.]/)){
el=document.querySelector(thas.ops.el);
if(!el){
return console.log("你传入的el没有查找到")
}
el.onclick=open;
}else{
el=document.querySelectorAll(thas.ops.el);
if(el.length==0){
return console.log("你传入的el没有查找到")
}
for(var i=0;i<el.length;i++){
el[i].onclick=open;
}
}
var container=document.querySelector("#openBoxContainer"); function open(){
container.className="";
}
openWinEvent();
function openWinEvent(){
(function (window) {
function $(id) {
return document.getElementById(id);
};
// 获取对象
var innerht = $("openBoxCtitle"), demo = $("openBoxContainer"), close = $("openBoxClose");
// 给innerht绑定鼠标事件
innerht.onmousedown = function (event) {
// 解决event兼容问题
var event = event || window.event;
// 获取鼠标在页面上坐标
var pageX = event.pageX || event.clientX + document.documentElement.scrollLeft;
var pageY = event.pageY || event.clientY + document.documentElement.scrollTop;
// 获取鼠标在innerht内部的坐标
var innerX = pageX - demo.offsetLeft;
var innerY = pageY - demo.offsetTop;
// 给document绑定鼠标移动事件,防止鼠标快速滑动时滑出innerht
document.onmousemove = function (event) {
//取消margin值,清除意外。
demo.style.margin=0
var event = event || window.event;
// 获取鼠标移动时的坐标
var moveX = event.pageX || event.clientX + document.documentElement.scrollLeft;
var moveY = event.pageY || event.clientY + document.documentElement.scrollTop;
// 鼠标移动时demo的位置坐标
var demoX = moveX - innerX;
var demoY = moveY - innerY;
// 到达边缘防止溢出
var ww = window.innerWidth;
var ow = demo.offsetWidth;
demoX < 0 ? demoX = 0 : "";
demoX + ow > ww ? demoX = ww - ow : "";
var wh=window.innerHeight;
var oh=demo.offsetHeight;
demoY<0?demoY=0:"";
demoY+oh>wh?demoY=wh-oh:'';
// 鼠标移动时demo的位置坐标
demo.style.left = demoX + "px";
demo.style.top = demoY + "px";
//清除选中文字
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
}
};
// 鼠标抬起清除拖拽效果
document.onmouseup = function () {
document.onmousemove = null;
};
// 点击关闭按钮关闭跟随框
close.onclick = function () {
this.parentNode.parentNode.className="hide";
};
})(window)
}
}
init(){
var thas=this;
thas.appendCss();thas.appendHtml();thas.evnet()
return thas;
}
} new websong({
"el":"#box"
}).init();
3.弹窗插件【网友的】借鉴其思路
(function(window,document){
var MaskShare = function(targetDom,options){
// 判断是用函数创建的还是用new创建的。这样我们就可以通过MaskShare("dom") 或 new MaskShare("dom")来使用这个插件了
if(!(this instanceof MaskShare))return new MaskShare(targetDom,options);
// 参数合并
this.options = this.extend({
// 这个参数以后可能会更改所以暴露出去
imgSrc:"../static/img/coupon-mask_1.png"
},options);
// 判断传进来的是DOM还是字符串
if((typeof targetDom)==="string"){
this.targetDom = document.querySelector(targetDom);
}else{
this.targetDom = targetDom;
}
var boxDom = document.createElement("div");
var imgDom = document.createElement("img");
// 设置默认样式 注意将z-index值设置大一些,防止其他元素层级比遮罩层高
boxDom.style.cssText = "display: none;position: absolute;left: 0;top: 0;width: 100%;height:100%;background-color: rgba(0,0,0,0.8);z-index:9999;";
imgDom.style.cssText = "margin-top:20px;width: 100%;";
// 追加或重设其样式
if(this.options.boxDomStyle){
this.setStyle(boxDom,this.options.boxDomStyle);
}
if(this.options.imgDomStyle){
this.setStyle(imgDom,this.options.imgDomStyle);
}
imgDom.src = this.options.imgSrc;
boxDom.appendChild(imgDom);
this.boxDom = boxDom;
// 初始化
this.init();
};
MaskShare.prototype = {
init:function(){
this.event();
},
extend:function(obj,obj2){
for(var k in obj2){
obj[k] = obj2[k];
}
return obj;
},
setStyle:function(dom,objStyle){
for(var k in objStyle){
dom.style[k] = objStyle[k];
}
},
event:function(){
var _this = this;
this.targetDom.addEventListener("click",function(){
document.body.appendChild(_this.boxDom);
_this.boxDom.style.display = "block";
// 打开遮罩层的回调
_this.options.open&&_this.options.open();
},false);
this.boxDom.addEventListener("click",function(){
this.style.display = "none";
// 关闭遮罩层的回调
_this.options.close&&_this.options.close();
},false);
}
};
// 暴露方法
window.MaskShare = MaskShare;
}(window,document));
js封装插件【组件】三种方式,含es6新特性。的更多相关文章
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
- 使用Net.Mail、CDO组件、JMail组件三种方式发送邮件
原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail 需要服务器认证,大部分服务器端口为25. { MailMessage mailMsg = mailMs ...
- js获取时间戳的三种方式
js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...
- js声明变量的三种方式
JS 声明变量的三种方式 (1)使用变量步骤:a.声明-->b.赋值-->3.调用 正确用法: <script type="text/javascript"> ...
- Eclipse中安装插件的三种方式
转载自:http://www.cnblogs.com/lcgustc/archive/2013/01/03/2843496.html Eclipse也用了很久,但是都没有怎么去研究过怎么安装插件,今天 ...
- JS基础语法---创建对象---三种方式创建对象:调用系统的构造函数;自定义构造函数;字面量的方式
创建对象三种方式: 调用系统的构造函数创建对象 自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象) 字面量的方式创建对象 第一种:调用系统的构造函数创建对象 //小苏举例子: //实例化对 ...
- JS创建事件的三种方式(实例)
1.普通的定义方式 <input type="button" name="Button" value="确定" onclick=&qu ...
- js声明变量的三种方式及作用域
js声明变量的三种方式及作用域 CreateTime--2017年9月11日17:19:11 Author:Marydon 一.参考链接 本篇文章的创作灵感来源于博主-奔跑的铃铛关于js中cons ...
- JS事件绑定的三种方式比较
js事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- Beanutils工具类,封装数据的三种方式,单例模式
org.apache.commons.beanutils.Beanutils; Beanutils setProperty(Object obj,String name,Object value) O ...
随机推荐
- 【题解】Berland.Taxi Codeforces 883L 模拟 线段树 堆
Prelude 题目传送门:ヾ(•ω•`)o Solution 按照题意模拟即可. 维护一个优先队列,里面装的是正在运营中的出租车,关键字是乘客的下车时间. 维护一个线段树,第\(i\)个位置表示第\ ...
- Spring 源码学习(4) —— 动态AOP使用示例
在实际工作中, 此bean可能是满足业务需要的核心逻辑, 例如test()方法中可能会封装着某个核心业务, 如果在test()方法前后加入日志来跟踪调试, 直接修改源码并不符合面向对象的设计模式, 而 ...
- POJ 2431 优先队列
汽车每过一单位消耗一单位油,其中有给定加油站可加油,问到达终点加油的最小次数. 做法很多的题,其中优先对列解这题是很经典的想法,枚举每个加油站,判断下当前油量是否小于0,小于0就在前面挑最大几个直至油 ...
- 重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)
你有一笔数据项(data item),需要额外的数据和行为. 将这笔数据项变成一个对象. class Order... private string customer; ==> class Or ...
- 可编辑表格(Editable Table)
需求分析 1.单击table的每个cell后,给cell加上一个尺寸相当的input; 2.input后把value传给cell的innerHTML; 3.失焦后删除input. HTML <! ...
- 使用 jQuery 避免鼠标双击
介绍 当用户双击DOM对象(例如按钮和链接等)时,对于用户交互一直是个麻烦的问题. 幸运的是, jQuery 提供了一个相当棒的解决方法. 那就是.one(). .one()这个方法是做什么的? 它附 ...
- 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯
[题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...
- 关于linux的一些基础知识
一.基础 1.linux所有内容以文件形式保存,包括硬件. 2.linux 不区分扩展名,靠权限区分. #但是,约定 .sh脚本文件 .conf配置文件. 3.-rw-r--r-- ...
- 25、Python垃圾回收机制?
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- BERT(Bidirectional Encoder Representations from Transformers)理解
BERT的新语言表示模型,它代表Transformer的双向编码器表示.与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示.因此,预训练的BERT表示可以通过 ...