demo20-单例模式

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h3>创建唯一的窗口</h3>
<button type="button" id="btn1">创建div1</button>
<script>
  //管理单例
  var getSingle = function(fn) {
    var result;
    return function() {
      return result || (result = fn.apply(this.arguments));
    }
  }
  function LayerAction(){
    this.layer = null;
    if (typeof this.setLayer !== "function") { // 判断 ?
      LayerAction.prototype.setLayer = function(layer) {
        if (!layer) {
          console.error("error");
          return;
        } else {
          this.layer = layer;
        }
      };

      LayerAction.prototype.showLayer = function(){
        this.layer.style.display = "block";
      };
      LayerAction.prototype.closeLayer = function(){
        this.layer.style.display = "none";
      };
    }
  }

  var div1 = {
    div1Layer: null,
    layerAction: new LayerAction(),

    createDiv1Layer: function(){
      var div=document.createElement("div");
      div.innerHTML="我是div1";
      div.style.display = 'none';
      div.id = 'div1';
      document.body.appendChild(div);
      var closeBtn = document.createElement('span');
      closeBtn.innerText='关闭';
      closeBtn.id="closeDiv1";
      div.appendChild(closeBtn);
      return div;
    },

    createDiv1Style:function(){
      var styleElement = document.createElement('link');
      styleElement.type = 'text/css';
      styleElement.href = 'div1.css';
      styleElement.rel = 'stylesheet';
      document.getElementsByTagName('head')[0].appendChild(styleElement);
      return styleElement
    },

    bindActionForCloseLayer: function(){
      var that = div1;
      document.getElementById('closeDiv1').onclick = function(){
        that.layerAction.closeLayer();
      }
    },

    startDiv1Layer: function () {
      var createDiv1singleLayer = getSingle(this.createDiv1Layer);
      var createDiv1singleStyle = getSingle(this.createDiv1Style);
      var bindCloseEvent = getSingle(this.bindActionForCloseLayer);
      var that = this;
      document.getElementById('btn1').onclick = function(){
        createDiv1singleStyle();
        that.div1Layer = createDiv1singleLayer();
        that.layerAction.setLayer(that.div1Layer);
        that.layerAction.showLayer();
        bindCloseEvent();
      }
    }
  };
  div1.startDiv1Layer();
</script>
</body>
</html>

 div1.css

#div1{
  width: 500px;
  height: 300px;
  background: #0b0a0a;
  color: #fff;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}
#closeDiv1{
  cursor: pointer;
  margin-right: 5px;
  margin-top: 5px;
  float: right;
  border: 1px solid #fff;
}
View Code

 script.js

 var div = {
    getS: function (fn) {
      var result;
      return function () {
        return result || (result = fn.apply(this, arguments));
      }
    },
    elayer: null,
    createLayer: function () {
      var div = document.createElement('div');
      div.id = 'ly';
      div.innerHTML = 'Layer';
      document.getElementsByTagName('body')[0].appendChild(div);
      var span = document.createElement('span');
      span.innerText = '关闭';
      span.id = 'close';
      div.appendChild(span);
      return div;
    },
    startLayer: function () {
      this.elayer.style.display = 'block';
    },
    closeLayer: function () {
      var that = this;
      document.getElementById('close').onclick = function () {
        that.elayer.style.display = 'none';
      }
    },
    btnClick: function () {
      var singleLayer = this.getS(this.createLayer);
      var close = this.getS(this.closeLayer);
      var start = this.getS(this.startLayer);
      var that = this;
      document.getElementById('btn1').onclick = function () {
        that.elayer = singleLayer();
        start.call(that);
        close.apply(that);
      }
    }
  }
  div.btnClick();

 

posted @ 2018-06-26 15:01  blackatall  阅读(60)  评论(0)    收藏  举报