JS面向对象之多选框实现


Posted in Javascript onJanuary 17, 2020

本文实例为大家分享了JS面向对象之多选框实现代码,供大家参考,具体内容如下

描述:

JS面向对象——多选框的实现

效果:

JS面向对象之多选框实现

实现:

Utile.js

(function () {
  Object.prototype.addProto=function (sourceObj) {
    var names=Object.getOwnPropertyNames(sourceObj);
    for(var i=0;i<names.length;i++){
      var desc=Object.getOwnPropertyDescriptor(sourceObj,names[i]);
      if(typeof desc.value==="object" && desc.value!==null){
        var obj=new desc.value.constructor();
        obj.addProto(desc.value);//把obj当成引用对象带入递归函数继续给obj赋值
        Object.defineProperty(this,names[i],{
          enumerable:desc.enumerable,
          writable:desc.writable,
          configurable:desc.configurable,
          value:obj
        });
        continue;
      }
      Object.defineProperty(this,names[i],desc);
    }
    return this;
  };
  Function.prototype.extendClass=function (supClass) {
    function F() {}
    F.prototype=supClass.prototype;
    this.prototype=new F();
    this.prototype.constructor=this;
    this.supClass=supClass.prototype;
    if(supClass.prototype.constructor===Object.prototype.constructor){
      supClass.prototype.constructor=supClass;
    }
  }
})();
var RES=(function () {
  var list={};
  return {
    DATA_FINISH_EVENT:"data_finish_event",
    init:function (imgDataList,basePath,type) {
      if(imgDataList.length===0) return;
      if(!type) type="json";
      RES.imgDataList=imgDataList.reverse();
      RES.basePath=basePath;
      RES.type=type;
      RES.ajax(basePath+imgDataList.pop()+"."+type)
    },
    ajax:function (path) {
      var xhr=new XMLHttpRequest();
      xhr.addEventListener("load",RES.loadHandler);
      xhr.open("GET",path);
      xhr.send();
    },
    loadHandler:function (e) {
      this.removeEventListener("load",RES.loadHandler);
      var key,obj;
      if(RES.type==="json"){
        obj=JSON.parse(this.response);
        key=obj.meta.image.split(".png")[0];
        list[key]=obj.frames;
      }else if(RES.type==="xml"){
        obj=this.responseXML.children[0];
        key=obj.getAttribute("imagePath").split(".png")[0];
        list[key]=obj;
      }
 
      if(RES.imgDataList.length===0){
        var evt=new Event(RES.DATA_FINISH_EVENT);
        evt.list=list;
        document.dispatchEvent(evt);
        // Model.instance.menuData=list;
        return;
      }
      RES.ajax(RES.basePath+RES.imgDataList.pop()+"."+RES.type);
    },
    getNameJSONData:function (name) {
      var fileName=RES.basePath;
      for(var key in list){
        var arr=list[key].filter(function (t) {
          return t.filename===name;
        });
        if(arr.length>0){
          fileName+=key+".png";
          break;
        }
      }
      if(arr.length===0){
        return false;
      }else{
        return {
          file:fileName,
          w:arr[0].frame.w,
          h:arr[0].frame.h,
          x:arr[0].frame.x,
          y:arr[0].frame.y
        };
      }
    },
    getNameXMLData:function (name) {
      var fileName=RES.basePath;
      for(var key in list){
        var elem=list[key].querySelector("[n="+name+"]");
        if(elem){
          fileName+=list[key].getAttribute("imagePath");
          break;
        }
      }
      if(!elem) return false;
      return {
        file:fileName,
        w:elem.getAttribute("w"),
        h:elem.getAttribute("h"),
        x:elem.getAttribute("x"),
        y:elem.getAttribute("y")
      }
    },
    getImage:function (name) {
      var obj;
      if(RES.type==="json"){
        obj=RES.getNameJSONData(name);
      }else if(RES.type==="xml"){
        obj=RES.getNameXMLData(name)
      }
      if(!obj)return;
      var div=document.createElement("div");
      Object.assign(div.style,{
        width:obj.w+"px",
        height:obj.h+"px",
        backgroundImage:"url("+obj.file+")",
        backgroundPositionX:-obj.x+"px",
        backgroundPositionY:-obj.y+"px",
        position:"absolute"
      });
      return div;
    },
    changeImg:function (elem,name) {
      var obj;
      if(RES.type==="json"){
        obj=RES.getNameJSONData(name);
      }else if(RES.type==="xml"){
        obj=RES.getNameXMLData(name)
      }
      if(!obj)return;
      Object.assign(elem.style,{
        width:obj.w+"px",
        height:obj.h+"px",
        backgroundImage:"url("+obj.file+")",
        backgroundPositionX:-obj.x+"px",
        backgroundPositionY:-obj.y+"px",
        position:"absolute"
      });
    }
  }
})();

UIComponent.js

var CheckBox=(function () {
  function CheckBox(parent) {
    this.checkView=this.init(parent);
  }
  /*
   //ES5 单例
  CheckBox.getInstance=function () {
    if(!CheckBox._instance){
      CheckBox._instance=new CheckBox();
    }
    return CheckBox._instance;
  };*/
  CheckBox.prototype.addProto({
    _label:"",
    _checked:false,
    init:function (parent) {
      if(this.checkView) return this.checkView;
      var div=document.createElement("div");
      var icon=RES.getImage("f-checkbox");
      div.appendChild(icon);
      var label=document.createElement("span");
      div.style.position=icon.style.position=label.style.position="relative";
      icon.style.float=label.style.float="left";
      label.textContent="";
      Object.assign(label.style,{
        fontSize:"16px",
        lineHeight:"20px",
        marginLeft:"5px",
        marginRight:"10px"
      });
      var h=RES.getNameXMLData("f-checkbox").h;
      icon.style.top=(20-h)/2+"px";
      div.appendChild(label);
      parent.appendChild(div);
      this.clickHandlerBind=this.clickHandler.bind(this);
      div.addEventListener("click",this.clickHandlerBind);
      return div;
    },
    clickHandler:function (e) {
      this.checked=!this.checked;
    },
    set label(value){
      this._label=value;
      this.checkView.lastElementChild.textContent=value;
    },
    get label(){
      return this._label;
    },
    set checked(value){
      if(this._checked===value)return;
      this._checked=value;
      if(value){
        RES.changeImg(this.checkView.firstElementChild,"f-checkbox-active");
      }else{
        RES.changeImg(this.checkView.firstElementChild,"f-checkbox");
      }
      this.checkView.firstElementChild.style.position="relative";
      this.dispatchMessage(value);
    },
    dispatchMessage:function (value) {
      var evt=new Event("change");
      evt.checked=value;
      evt.elem=this;
      document.dispatchEvent(evt);
    },
    get checked(){
      return this._checked;
    }
  });
  return CheckBox;
})();
 
var Radio=(function () {
  function Radio(parent,groupName) {
    this.constructor.supClass.constructor.call(this,parent);
    this.groupName=groupName;
    this.checkView.self=this;
    this.checkView.setAttribute("groupName",groupName);
  }
 
  Radio.extendClass(CheckBox);
 
  Radio.prototype.addProto({
    clickHandler:function (e) {
      // console.log(Model.instance.menuData);
      if(this.checked)return;
      var list=document.querySelectorAll("[groupName="+this.groupName+"]");
      for(var i=0;i<list.length;i++){
        list[i].self.checked=false;
      }
      this.checked=true;
    },
    dispatchMessage:function (value) {
      if(!value)return;
      this.constructor.supClass.dispatchMessage.call(this,value);
    }
  });
  return Radio;
})();

html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="js/Utile.js"></script>
  <script src="js/UIComponent.js"></script>
</head>
<body>
  <script>
    document.addEventListener(RES.DATA_FINISH_EVENT,init);
    RES.init(["new_icon"],"img/","xml");
 
    function init() {
      var elem=document.createDocumentFragment();
      document.addEventListener("change",changeHandler);
      var check=new CheckBox(elem);
      check.checked=true;
      check.label="男";
      var check1=new CheckBox(elem);
      check1.label="女";
      document.body.appendChild(elem);
 
    }
 
    function changeHandler(e) {
      console.log(e);
    }
 
 
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 作用域使用说明
Aug 13 Javascript
Jquery 弹出层插件实现代码
Oct 24 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
javascript 事件绑定问题
Jan 01 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
jquery根据属性和index来查找属性值并操作
Jul 25 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
基于axios封装fetch方法及调用实例
Feb 05 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
Vue中的transition封装组件的实现方法
Aug 13 Javascript
JS实现纸牌发牌动画
Jan 19 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
Jan 17 #Javascript
JS面向对象之单选框实现
Jan 17 #Javascript
原生JavaScript实现的无缝滚动功能详解
Jan 17 #Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 #Javascript
React Hooks 实现和由来以及解决的问题详解
Jan 17 #Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 #Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 #jQuery
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
js闭包学习心得总结
2018/04/17 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
python使用7z解压apk包的方法
2015/04/18 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
介绍一下linux文件系统分配策略
2013/02/25 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
副处级干部考察材料
2014/05/17 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
单位收入证明范本
2015/06/18 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server