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 相关文章推荐
[原创]网络复制内容时常用的正则+editplus
Nov 30 Javascript
javascript中的变量是传值还是传址的?
Apr 19 Javascript
JavaScript中的Array对象使用说明
Jan 17 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 Javascript
js控制浏览器全屏示例代码
Feb 20 Javascript
jQuery中:gt选择器用法实例
Dec 29 Javascript
Javascript递归打印Document层次关系实例分析
May 15 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 Javascript
多种类型jQuery网页验证码插件代码实例
Jan 09 jQuery
Nest.js散列与加密实例详解
Feb 24 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
php 特殊字符处理函数
2008/09/05 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
xml转json的js代码
2012/08/28 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python实现统计单词出现的个数
2015/05/28 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
红色故事演讲稿
2014/05/22 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
大学活动总结模板
2014/07/10 职场文书
升学宴演讲稿
2014/09/01 职场文书
个人维稳承诺书
2015/05/04 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python