• 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",
            "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; 100%;height:100%;background-color: rgba(0,0,0,0.8);z-index:9999;";  
            imgDom.style.cssText = "margin-top:20px; 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));  
    

      

    <button id="openBtn">open</button>
    new MaskShare("#openBtn",{
    imgSrc:"http://image.tupian114.com/20180322/2109277031.jpg",
    boxDomStyle:{
    opacity:".9"
    },
    imgDomStyle:{
    opacity:".8"
    },
    open:function(){
    console.log("show");
    },
    close:function(){
    console.log("close");
    }
    });
  • 相关阅读:
    【PHP】最详细PHP从入门到精通(二)——PHP中的函数
    利用 MUI开发app, 如何实现侧滑菜单及其主体部分上下滑动
    JavaScript面向对象编程—this详解
    利用Hadoop streaming 进行词频统计
    Java 平时作业七
    Java 平时作业六
    Java 平时作业五
    Java 平时作业四
    Java 平时作业三
    JAVA 平时作业二
  • 原文地址:https://www.cnblogs.com/webSong/p/8643507.html
Copyright © 2020-2023  润新知