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 ...
随机推荐
- python学习(十三)进程和线程
python多进程 from multiprocessing import Process import os def processFunc(name): print("child pro ...
- javascript和bigint
http://note.youdao.com/noteshare?id=91e21eb1d8c20025d72d7ee6f401e34d
- 修改Docker默认镜像和容器的存储位置
一.Why Docker默认的镜像和容器存储位置在/var/lib/docker中,如果仅仅是做测试,我们可能没有必要修改,但是当大量使用的时候,我们可能就要默认存储的位置了. 二.How 2.1 修 ...
- 前端PHP入门-022-重点日期函数之获取本地化时间戳函数.md
在实际的工作中我们还需要经常用到指定某个时间生成 例如:需要找到昨天到今天此时此刻的注册用户. 我们需要做两件事情: 得到当前的时间unix时间戳.用time()函数就可以直接搞定 那么昨天指定时 ...
- jquery validate 二选一,错误提示在一处
转载自:http://blog.51yip.com/jsjquery/1483.html 有一同事对jquery validate这个插件不熟,实现多处报错信息在一处,并且还有二选一的情况,二个输入框 ...
- springsecurity remember-me 功能
本文基于spring-security-web-4.1.2.RELEASE. 要实现rememberMe,有两种方案. 1.基于简单加密token的方法 首先需要在配置文件中加入<remembe ...
- 最短路+找规律 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest L. Right Build
题目链接:http://codeforces.com/gym/101149/problem/L 题目大意:有n个点(其实是n+1个点,因为编号是0~n),m条有向边.起点是0,到a和b两个节点,所经过 ...
- 引用类型 ( 对象定义 )——Date 类型
本文地址:http://www.cnblogs.com/veinyin/p/7607743.html 1 创建日期对象 var date = new Date(); 2 可以给日期对象传值 2.1 ...
- js-打地鼠游戏开发
[生成画布] 第1课[随机生成地鼠] 第2课[定时生成地鼠] 第3课[打地鼠完结篇] 第4课 优酷在线播放地址 http://list.youku.com/albumlist/show?id=2939 ...
- Ubuntu之镜像iso安装系统
ubuntu的安装 官网下载iso文件,网址:http://releases.ubuntu.com/16.04.4/, 选择:ubuntu-16.04.4-server-amd64.iso: 下载完毕 ...