您的位置:68399皇家赌场 > 服务器租用 > Javascript代码达成仿实例化类

Javascript代码达成仿实例化类

发布时间:2019-07-20 05:03编辑:服务器租用浏览(175)

    Javascript能做的事务越来越的多了四起,随之而来的难点便是Js代码量的增加,面前蒙受代码的扩张,笔者选取了仿面向对像类实例化里的构造函数自动运维的章程,把具备的js代码,以登记的样式,类化了四起。

    复制代码 代码如下:

    这一言语功用的面目依赖于 JavaScript 特有的原型链(prototype chain)格局。
    故此严峻意义上说,JavaScript 是依靠原型的面向对象语言。相当于说,每一种实例对象都抱有三个原型。对象从该原型中承继属性和措施。

    JavaScript 中的继承相比较奇葩,不能够兑现接口承继,只可以正视原型承继。

    代码

    function getHTTPRequest()
    {
    var xhr = false;
    if (window.XMLHttpRequest)
    xhr = new XMLHttpRequest(); //IE除此而外的浏览器
    else if (window.ActiveXObject)
    {
    try
    {
    xhr = new ActiveXObject("Msxm12.XMLHTTP");//最新版的ActiveX对象
    }
    catch(e)
    {
    try
    {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(e)
    {
    xhr = false;
    }
    }
    }
    }

    **1、构造函数

    原型链 原型就是二个目的,通过构造函数创设出来的实例会有指针指向原型获得原型的属性和措施。那样,实例对象就包括构造函数的品质方法和原型的性质方法,然后将急需一连的构造函数的原型指向那个实例,就能够具备这些实例的持有属性方法落成持续。
    看下边演示代码:

    /**
     * @version $Id$
     * @author xjiujiu <xjiujiu@foxmail.com>
     * @description HHJsLib Framework Apps
     * @copyright Copyright (c) 2011-2012 http://www.xjiujiu.com.All right reserved
     */
    
    HHJsLib.register({
      init: function() {
        this.bindPreviewBtn();
        this.bindUploadEleImageBtn();
        this.bindUploadEleAudioBtn('a.audio-upload-btn');
        this.bindUploadEleVideoBtn('a.video-upload-btn');
        this.bindDownloadEleAudioBtn();
        this.bindNewConBtn();
        this.bindDelConBtn('a.btn-del-con');
        this.bindDelItemBtn('a.btn-del-item');
        this.bindNewItemBoxClose('div.item-box');
        this.bindPlusBtn('a.btn-plus');
        this.bindAppendNewElement('div.new-item-box ul li a');
        this.bindSetPreviewVideo();
        this.bindAddAnswerBtn('a.btn-add-answer');
        this.bindDelAnswerBtn('a.btn-del-answer');
        this.bindDelImageBtn('a.btn-del-image');
        this.bindDelAudioBtn('a.btn-del-audio');
        this.initPlusBtn();
      },
      bindUploadEleVideoBtn: function(dom) {
        var self    = this;
        $(dom).click(function() {
          var $this  = $(this);
          var t    = HHJsLib.modal.confirm(
            '上传本地视频',
            '<div class="text-center">'
              ' <p>浏览您电脑里,从中选择一个视频文件。</p>'
              ' <div class="btn-box btn btn-blue">'
              ' <div id="upload-btn">从电脑上传</div>'
              ' </div>'
              ' </div>'
          );
          var uploader  = HJZUploader.createVideo(
            '#upload-btn', 
            { 
              formData: {model: 'timeline'},
            },
            function(response) {
              if(false == response.rs) {
                self.setDemoBoxInit($this);
                return HHJsLib.warn(response.message);
              }
              self.setDemoAudioInfo($this, response.data);
              $('#dialog-box-'   t).modal('hide');
            }
          );
          uploader.on('uploadProgress', function(file) {
            self.setDemoBoxLoading($this);
          });
    
          return uploader;
        });
      },
      bindDelAudioBtn: function(dom) {
        this.bindDelFileBtn(dom, '真的要删除这个音频吗?');
      },
      bindDelImageBtn: function(dom) {
        this.bindDelFileBtn(dom, '真的要删除这个图片吗?');
      },
      bindDelFileBtn: function(dom, msg) {
        var self  = this;
        $(dom).click(function() {
          var $target   = $(this);
          var t      = HHJsLib.initPopover($(this), msg);
          $('#btn-sure-'   t).click(function() {
            if(1 != $target.attr('data-new')) {
              $.get(
                queryUrl   'timelineele/adel',
                {id: $target.attr('data-id')},
                function(response) {
                  if(false === response.rs) {
                    return HHJsLib.warn(response.message);
                  }
                  self.delDemoFieldInfo($target);
                  $target.popover('destroy');
                }
              );
              return;
            }
            self.delDemoFieldInfo($target);
            $target.popover('destroy');
          });
        });
      },
      delDemoFieldInfo: function($target) {
        $($target.attr('data-demo-box')).html('');
        $($target.attr('data-box')).removeClass('uploaded').addClass('no-file');
        $($target.attr('data-field')).attr('data-id', '').attr('data-src', '');
      },
      bindAddAnswerBtn: function(dom) {
        var self  = this;
        $(dom).click(function() {
          var id     = $(this).attr('data-id');
          var answerHtml = eleTplMap.answerTpl.replace(/{id}/g, id);
          $('#answer-box-'   id).append(answerHtml);
          self.bindDelAnswerBtn('#answer-box-'   id   ' a.btn-del-answer');
        });
      },
      bindDelAnswerBtn: function(dom) {
        var self  = this;
        $(dom).click(function() {
          var $target = $(this);
          if(2 > $target.parent().parent().find('textarea.answer-editor').length) {
            return HHJsLib.warn('至少需要有一个答案!');
          }
          var t    = HHJsLib.initPopover($target, '您确定要删除这个答案吗?');
          $('#btn-sure-'   t).click(function() {
            $target.parent().remove();
          });
        });
      },
      bindAppendNewElement: function(dom) {
        var self    = this;
        $(dom).unbind('click').click(function() {
          var type  = $(this).attr('data-type');
          var heading   = $(this).parent().parent().attr('data-heading-id');
          if('heading' == type) {
            self.addNewElePartBox();
            $("#new-item-box-"   heading).hide();
            return;
          }
          self.addNewEleToPartBox(heading, type);
        });
      },
      addNewElePartBox: function() {
        var t      = this.getTimestamp();
        var partBoxHtml = eleTplMap.partBox.replace(/{t}/g, t);
        var headingHtml = this.initItemTplByType('heading', t, t);
        var itemHtml  = this.initItemTplByType('text', t, t);
        var itemBoxHtml = this.initItemBoxTpl(itemHtml, t, t, 'left', 'text');
        partBoxHtml   = partBoxHtml.replace(/{heading}/g, headingHtml);
        partBoxHtml   = partBoxHtml.replace(/{item}/g, itemBoxHtml);
        $("#main-box").append(partBoxHtml);
        this.bindDelItemBtn('#item-'   t   ' a.btn-del-item');
        this.movePlusBtnBox(t);
      },
      addNewEleToPartBox: function(heading, type) {
        var total    = $('#ele-part-box-'   heading   ' div.item-ele-box').length;
        var side    = total % 2 === 0 ? 'left' : 'right';
        var t      = this.getTimestamp();
        var itemHtml  = this.initItemTplByType(type, t, heading);
        var itemBoxHtml = this.initItemBoxTpl(itemHtml, heading, t, side, type);
        //清掉原有高度DIV
        $('#clearfix-'   heading).remove();
        $('#ele-part-box-'   heading).find('div.eles-box').append(itemBoxHtml);
        //绑定Dom事件
        this.bindDelItemBtn('#item-'   t   ' a.btn-del-item');
        this.movePlusBtnBox(heading);
        this.bindNewEleUpload(type);
      },
      bindNewEleUpload: function(type) {
        var self  = this;
        switch(type) {
          case 'image':
          case 'question':
          case 'know':
          self.bindUploadModal('a.btn-upload');
          break;
          case 'audio':
          self.bindUploadEleAudioBtn('a.audio-upload-btn');
          self.bindDelAudioBtn('a.btn-del-audio');
          break;
        }
      },
      initItemTplByType: function(type, t, heading) {
        var itemHtml  = eleTplMap[type].replace(/{t}/g, t);
        itemHtml    = itemHtml.replace(/{sort_num}/g, this.getNewEleSortNum(heading));
    
        return itemHtml.replace(/{headingId}/g, heading);
      },
      initItemBoxTpl: function(content, heading, t, side, type) {
        var itemBoxHtml = eleTplMap.itemBox.replace(/{t}/g, t);
        itemBoxHtml   = itemBoxHtml.replace(/{headingId}/g, heading);
        itemBoxHtml   = itemBoxHtml.replace(/{side}/g, side);
        itemBoxHtml   = itemBoxHtml.replace(/{content}/g, content);
        itemBoxHtml   = itemBoxHtml.replace(/{hash}/g, hex_md5(t));
        itemBoxHtml    = '<div class="clearfix" id="clearfix-'   heading   '"></div>';
    
        return itemBoxHtml.replace(/{type}/g, type);
      },
      movePlusBtnBox: function(heading) {
        //删除原有
        $('#new-item-box-'   heading).remove();
        //加入新
        var plusBtnHtml   = eleTplMap.plusBtn.replace(/{headingId}/g, heading);
        $(plusBtnHtml).insertBefore('#clearfix-'   heading);
        var $items     = $('#ele-part-box-'   heading).find('div.item-ele-box');
        if($items.length < 2) {
          $($items[0]).find('a.btn-del-item').hide();
        } else {
          $($items[0]).find('a.btn-del-item').show();
        }
        //绑定事件
        this.bindAppendNewElement('#new-item-box-'   heading   " ul.new-item-list-box li a");
        this.bindPlusBtn('#btn-plus-'   heading);
      },
      bindNewItemBoxClose: function(dom) {
        $(dom).click(function() {
          $('div.new-item-box').hide();
        });
      },
      bindPlusBtn: function(dom) {
        $(dom).click(function(event) {
          $('div.new-item-box').hide();
          var id = $(this).attr('data-heading-id');
          $('#new-item-box-'   id   ' div.new-item-box').removeClass('hide').attr('data-show', '1').show();
          event.preventDefault();
        });
      },
      initPlusBtn: function() {
        var self  = this;
        $('div.ele-part-box').each(function() {
          var dataId   = $(this).attr('data-heading');
          self.movePlusBtnBox(dataId);
        });
      },
      bindDelItemBtn: function(dom) {
        var self  = this;
        $(dom).click(function() {
          var $target = $(this);
          var t    = HHJsLib.initPopover($target, '您确定要删除这项吗?');
          var id   = $target.attr('data-id');
          var heading = $('#item-'   id).attr('data-heading-id');
          $('#btn-sure-'   t).click(function() {
            if(1 == $target.attr('data-new')) {
              $.get(
                queryUrl   'timelineele/adel',
                {id: $target.attr('data-id')},
                function(response) {
                  if(false === response.rs) {
                    return HHJsLib.warn(response.message);
                  }
                  $('#item-'   id).fadeOut('fast', function() {
                    $(this).remove();
                    self.movePlusBtnBox(heading);
                    self.reArrangeItem(heading);
                  });
                  $target.popover('destroy');
                }
              );
              return;
            }
            $target.popover('destroy');
            $('#item-'   id).fadeOut('fast', function() {
              $(this).remove();
              self.movePlusBtnBox(heading);
              self.reArrangeItem(heading);
            });
          });
        });
      },
      reArrangeItem: function(heading) {
        var rank  = 1;
        $('#ele-part-box-'   heading).find('div.item-ele-box').each(function() {
          if(rank % 2 === 0) {
            $(this).removeClass('pull-left item-left')
            .addClass('pull-right item-right');
          } else {
            $(this).removeClass('pull-right item-right')
            .addClass('pull-left item-left');
          }
          rank   ;
        });
      },
      bindNewConBtn: function() {
        var self  = this;
        $('#btn-new-con-item').click(function() {
          var t  = self.getTimestamp();
          var conItemHtml   = eleTplMap.conItemTpl.replace(/{t}/g, t);
          $('#conclusion-box').append(conItemHtml);
          self.bindDelConBtn('#btn-del-con-'   t);
          self.bindUploadModal('a.btn-upload');
        });
      },
      bindDelConBtn: function(dom) {
        var self  = this;
        $(dom).click(function() {
          var $target = $(this);
          var t    = HHJsLib.initPopover($target, '您确定要删除这个结论吗?');
          var id   = $target.attr('data-id');
          $('#btn-sure-'   t).click(function() {
            if(1 == $target.attr('data-new')) {
              $.get(
                queryUrl   'timelineele/adel',
                {id: $target.attr('data-id')},
                function(response) {
                  if(false === response.rs) {
                    return HHJsLib.warn(response.message);
                  }
                  $('#item-con-'   id).fadeOut('fast', function() {
                    $(this).remove();
                  });
                  $target.popover('destroy');
                }
              );
              return;
            }
            $target.popover('destroy');
            $('#item-con-'   id).fadeOut('fast', function() {
              $(this).remove();
            });
          });
        });
      },
      getNewEleSortNum: function(heading) {
        return parseInt(this.getMaxSortNum(heading))   1;
      },
      getMaxSortNum: function(heading) {
        var sortNums  = [];
        $('.ele-sort-'   heading).each(function() {
          sortNums.push($(this).val());
        });
        sortNums    = sortNums.sort(function(a, b) {
          if (a === b) {
             return 0;
          }
          if (typeof a === typeof b) {
            return a > b ? -1 : 1;
          }
          return typeof a > typeof b ? -1 : 1;
        });
    
        return sortNums[0] == null ? 0 : sortNums[0];
      },
      bindUploadEleImageBtn: function() {
        this.bindUploadModal('a.btn-upload');
      },
      bindUploadEleAudioBtn: function(dom) {
        var self    = this;
        $(dom).click(function() {
          var $this  = $(this);
          var t    = HHJsLib.modal.confirm(
            '上传音频',
            '<div class="text-center">'
              ' <p>浏览您电脑里,从中选择一个音频文件。</p>'
              ' <div class="btn-box btn btn-blue">'
              ' <div id="upload-btn">从电脑上传</div>'
              ' </div>'
              ' </div>'
          );
          var uploader  = HJZUploader.createAudio(
            '#upload-btn', 
            { 
              formData: {model: 'timeline'},
            },
            function(response) {
              if(false == response.rs) {
                self.setDemoBoxInit($this);
                return HHJsLib.warn(response.message);
              }
              self.setDemoAudioInfo($this, response.data);
              $('#dialog-box-'   t).modal('hide');
            }
          );
          uploader.on('uploadProgress', function(file) {
            self.setDemoBoxLoading($this);
          });
    
          return uploader;
        });
      },
      setDemoAudioInfo: function($target, data) {
        var audioHtml  = '<audio controls="controls"><source src="'   siteUrl   data.src   '" /></audio>';
        $($target.attr('data-demo-box')).html(audioHtml).show();
        $($target.attr('data-field')).attr('data-id', data.id).attr('data-src', data.src);
      },
      bindUploadModal: function(dom) {
        var self    = this;
        $(dom).unbind('click').click(function() {
          var $this  = $(this);
          var t    = HHJsLib.modal.confirm(
            '上传图片',
            '<div class="text-center">'
              ' <p>浏览您电脑里的图片,从中选择一张。</p>'
              '<div class="btn-box btn btn-blue">'
              ' <div id="upload-btn">从电脑上传</div>'
              ' </div>'
              ' </div>'
          );
          var uploader  = HJZUploader.createImage(
            '#upload-btn', 
            { 
              formData: {model: 'timeline'}
            },
            function(response) {
              if(false == response.rs) {
                self.setDemoBoxInit($this);
                return HHJsLib.warn(response.message);
              }
              var imgHtml   = '<img src="'
                  siteUrl   response.data.src
                  '" alt="'   response.data.name   '" />';
              $($this.attr('data-demo-box')).html(imgHtml).show();
              $($this.attr('data-field')).val(response.data.id).attr('data-src', response.data.src);
              $('#dialog-box-'   t).modal('hide');
            }
          );
          uploader.on('uploadProgress', function(file) {
            self.setDemoBoxLoading($this);
          });
          self.bindDelImageBtn('a.btn-del-image');
    
          return uploader;
        });
      },
      bindPreviewBtn: function() {
        var self  = this;
        $('#edit-btn, #preview-btn').click(function() {
          try{
            self.verifyBaseInfo();
            self.verifyEleInfo();
            self.verifyConclusionInfo();
            $('#timeline-form').submit();
          }catch(e) {
            return HHJsLib.warn(e);
          }
        });
      },
      verifyBaseInfo: function() {
        HHJsLib.isEmptyByDom('#image-path', '时间轴大图');
        HHJsLib.isEmptyByDom('#cover', '时间轴封面');
        HHJsLib.isEmptyByDom('#name', '标题');
        HHJsLib.isEmptyByDom('#description', '描述');
      },
      verifyEleInfo: function() {
        this.verifyHeaderEleInfo();
        this.verifyTextEleInfo();
        this.verifyImageEleInfo();
        this.verifyVideoEleInfo();
        this.verifyAudioEleInfo();
        this.verifyQuestionEleInfo();
        this.verifyKnowEleInfo();
      },
      verifyHeaderEleInfo: function() {
        $('div.item-heading-box').each(function() {
          HHJsLib.isEmpty($(this).find('textarea').val(), '头条内容');      
        });
      },
      verifyTextEleInfo: function() {
        $('div.item-text-box').each(function() {
          HHJsLib.isEmptyByDom('#ele-text-'   $(this).attr('data-id'), '文本内容元素');
        });
      },
      verifyImageEleInfo: function() {
        $('div.item-image-box').each(function() {
          HHJsLib.isEmptyByDom('#ele-image-hash-'   $(this).attr('data-id'), '图片地址');
          HHJsLib.isEmptyByDom('#ele-image-content-'   $(this).attr('data-id'), '图片介绍');
        });
      },
      verifyVideoEleInfo: function() {
        $('div.item-video-box').each(function() {
          HHJsLib.isEmptyByDom('#ele-video-hash-'   $(this).attr('data-id'), '视频地址');
          HHJsLib.isEmptyByDom('#ele-video-content-'   $(this).attr('data-id'), '视频介绍');
        });
      },
      verifyAudioEleInfo: function() {
        $('div.item-audio-box').each(function() {
          HHJsLib.isEmptyByDom('#ele-audio-hash-'   $(this).attr('data-id'), '音频地址');
          HHJsLib.isEmptyByDom('#ele-audio-content-'   $(this).attr('data-id'), '音频介绍');
        });
      },
      verifyQuestionEleInfo: function() {
        $('div.item-question-box').each(function() {
          HHJsLib.isEmptyByDom('#ele-question-content-'   $(this).attr('data-id'), '问题内容');
          HHJsLib.isEmptyByDom('#ele-question-extend-'   $(this).attr('data-id'), '问题答案解释');
          HHJsLib.isEmpty(answerLen, '问题答案');
          $('#answer-box-'   $(this).attr('data-id')).find('textarea').each(function() {
            HHJsLib.isEmpty($(this).val(), '问题答案');
          });
        });
      },
      verifyKnowEleInfo: function() {
        $('div.item-know-box').each(function() { 
          HHJsLib.isEmptyByDom('#ele-know-hash-'   $(this).attr('data-id'), '知道图片地址');
          HHJsLib.isEmptyByDom('#ele-know-content-'   $(this).attr('data-id'), '知道介绍');
        });
      },
      verifyConclusionInfo: function() {
        var length     = $('#conclusion-box div.item-con').length;
        HHJsLib.isEmpty(length, '总结');
        $('#conclusion-box div.item-con').each(function() {
          var dataId = $(this).attr('data-id');
          HHJsLib.isEmptyByDom('#ele-con-hash-'   dataId, '总结图片');
          HHJsLib.isEmptyByDom('#ele-con-content-'   dataId, '总结详情');
        });
      },
      bindDownloadEleAudioBtn: function() {
        var self  = this;
        $('a.download-audio-btn').click(function() {
          var $this    = $(this);
          try{
            HHJsLib.isEmptyByDom("#item-audio-upload-hash-"   $this.attr('data-id'), '下载地址');
            var url   = $("#item-audio-upload-hash-"   $this.attr('data-id')).val();
            if('mp3' != url.substring(url.lastIndexOf('.')   1).toLowerCase()) {
              return HHJsLib.warn('格式不支持,必须是Mp3格式!');
            } 
            var t    = HHJsLib.modal.info(
              '下载音频',
              '<p class="text-center">正在下载音频文件中,请稍等...<p>'
            );
            self.setDemoBoxLoading($this);
            $.getJSON(
              siteUrl   'index.php/public/resource/adownload', 
              {url: encodeURIComponent(url)}, 
              function(response) {
                if(false == response.rs) {
                  self.setDemoBoxInit($this);
                  return HHJsLib.warn(response.message);
                }
                $('#dialog-box-'   t).modal('hide');
                self.setDemoAudioInfo($this, response.data);
              }
            );
          } catch(e) {
            return HHJsLib.warn(e);
          }
        });
      },
      setDemoBoxLoading: function($target) {
        $($target.attr('data-box')).removeClass('no-file').addClass('uploaded');
        $($target.attr('data-file-box')).html('');
      },
      setDemoBoxInit: function($target) {
        $($target.attr('data-box')).removeClass('uploaded').addClass('no-file');
        $($target.attr('data-file-box')).html('');
      },
      bindSetPreviewVideo: function() {
        $('input.ele-video').change(function() {
          var url   = $(this).val();
          if(url != '') {
            if('swf' != url.substring(url.lastIndexOf('.')  1 ).toLowerCase()) {
              return HHJsLib.warn('视频地址不合法,请输入有效的在线观看Flash地址!');
            }
            var previewHtml   = '<embed src="'   url   '" quality="high" width="495" height="220" align="middle" allowScriptAccess="always" allowFullScreen="true" mode="transparent" type="application/x-shockwave-flash"></embed>';
            $($(this).attr('data-demo-box')).html(previewHtml);
          }
        });
      },
      bindDelEleBtnFormEdit: function() {
         this.bindDelUploadImgBtn();
      },
       getTimestamp: function() {
         return (new Date()).getTime();
       }
    });
    

    接下去是二个选拔的实例:

    **利用构造函数,能够省略地创设对象。构造函数内的 this 关键字指向实例对象自己:

    //声明超类,通过构造函数和原型添加有关属性和方法
    function Super(){
      this.property = true;
    }
    Super.prototype.getSuperValue = function() {
      return this.property;
    };
    
    //声明子类的构造函数
    function SubType() {
      this.subproperty = false;
    }
    //将子类的原型指向超类的实例,得到超类的一切
    SubType.prototype = new Super();
    SubType.prototype.constructor = SubType;
    SubType.prototype.getSubValue = function(){
      return this.subproperty;
    };
    //由子类创建对象,测试是否继承超类方法和属性
    var instance = new SubType();
    console.log(instance.getSuperValue());
    

    如上所述就是本文给我们享受的全体内容了,希望能够对大家学习javascript有所帮衬。

    复制代码 代码如下:

    复制代码 代码如下:

    持有函数的暗许原型都以 Object 的实例,由此暗许原型都会蕴藏叁当中间指针,指向 Object.prototype。
    运用 instanceof 和 isPrototypeOf 能够明确原型和实例的关联:

    您恐怕感兴趣的作品:

    • Javascript无参数和有参数类承接难题消除格局
    • 再论Javascript的类承袭
    • JavaScript中的类承接
    • javascript类承接机制的规律深入分析
    • javascript中选择new与不接纳实例化对象的界别
    • 浅谈javascript构造函数与实例化对象
    • javascript八个四角俱全的实例化XMLHttpRequest的措施
    • JavaScript类承继及实例化的不二等秘书籍

    //完整的GET请求
    var request = getHTTPRequest();
    if(request)
    {
    request.onreadystatechange = dosomething;
    request.open("GET","file.doc",true);
    request.send(null);
    }

    function People(name){
    this.name = name;
    }

    instance instanceof Object;
    Object.prototype.isPrototypeOf(instance);
    

    你或者感兴趣的稿子:

    • Javascript无参数和有参数类承继难点化解方式
    • 再论Javascript的类承接
    • JavaScript中的类承袭
    • javascript类承继机制的法规分析
    • javascript中采纳new与不应用实例化对象的界别
    • 浅谈javascript构造函数与实例化对象
    • Javascript代码完毕仿实例化类
    • JavaScript类承接及实例化的章程

    选拔 new 运算符和构造函数创造实例对象:

    运用原型链的时候,须要严慎的定义方法。子类须要重写超类型的某部方法依然扩充,必供给放在替换原型的言辞前面,那样技巧卓有成效。另外,通过原型链实现持续时,无法接纳对象字面量创建原型方法,那样会重写原型链:

    本文由68399皇家赌场发布于服务器租用,转载请注明出处:Javascript代码达成仿实例化类

    关键词: 68399皇家赌场

上一篇:JS实现淡石磨蓝简洁竖向Tab点击切换效果

下一篇:没有了