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 ... 
随机推荐
- CDOJ--1237
			原体连接:http://acm.uestc.edu.cn/problem.php?pid=1237 分析:质因子单增:在寻找下一个质因子时,从前一个开始. #include<iostream&g ... 
- Codeforces 939.E Maximize!
			E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ... 
- bash shell输出颜色
			http://note.youdao.com/noteshare?id=9de6d5fac6380447df112dff5bc404a1 
- Exchange-fanout 广播模式
			一.前言 我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生.实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路 ... 
- python---基础知识回顾(四)(模块sys,os,random,hashlib,re,序列化json和pickle,xml,shutil,configparser,logging,datetime和time,其他)
			前提:dir,__all__,help,__doc__,__file__ dir:可以用来查看模块中的所有特性(函数,类,变量等) >>> import copy >>& ... 
- el-option > 1500 条时的卡顿问题
			本文地址: http://www.cnblogs.com/veinyin/p/8473938.html 在做项目时遇到的一个问题. 项目是基于 Vue 框架做的. select 的 option 是 ... 
- 去除UITableView多余的seperator
			UIView *v = [[UIView alloc] initWithFrame:CGRectZero]; [tableView setTableFooterView:v]; [v release] ... 
- JSON.stringify()——JS转JSON字符串
			JSON.stringify() JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符 ... 
- 74.VS2013和opencv3.1.0安装教程
			一.先下载文件 1.VS2013 VS2013有很多版本,专业版,旗舰版,中文英文之类的,所对应的密钥也不一样.我选择的是简体中文专业版.下载链接如下. http://www.musnow.com/t ... 
- logging模块配置笔记
			logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ... 
