qg777钱柜误乐

热门关键词: qg777钱柜误乐

精解js中class的七种函数封装方法,精解jsclass封装

第意气风发,大家供给xhr对象。那对我们来讲轻巧,封装成一个函数。

安详严整js中class的有余函数封装方法,详整jsclass封装

正文实例讲明了js中class的有余函数封装方法,分享给大家供大家参照他事他说加以考察,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>关于class的多种函数封装</title>
<style>
body{
  margin: 0;
}
li{
  height: 20px;
}
</style>
</head>
<body>
<div class="box" id="box">
  <ul class="list">
    <li class="in abc ab "></li>
    <li class="in ac b "></li>
    <li class="in a "></li>
    <li class="in acb "></li>
    <li class="in ba "></li>
    <li class="abc"></li>
  </ul>
</div>
<script>
//数组的indexOf方法封装
function indexOf(arr,value,start){
  //如果不设置start,则默认start为0
  if(arguments.length == 2){
    start = 0;
  }
  //如果数组中存在indexOf方法,则用原生的indexOf方法
  if(arr.indexOf){
    return arr.indexOf(value,start);
  }
  for( var i = 0; i < arr.length; i++){
    if(arr[i] === value){
      return i;
    }
  }
  return -1;
}
//数组去重方法封装
function noRepeat(arr){
  var result = [];
  for( var i = 0; i < arr.length; i++){
    if(indexOf(result,arr[i]) == -1){
      result.push(arr[i]);
    }
  }
  return result;
}
//inArray方法封装
function inArray(arr,value){
  for(var i = 0; i < arr.length; i++){
    if(arr[i] === value){
      return true;
    }
  }
  return false;
}
//去除首尾空格函数封装
function trim(arr){
  var result = arr.replace(/^s+|s+$/g,'');
  return result;
}
//getElementsByClassName函数封装
function getElementsByClassName(parentObj,classStr){
  var result = [];
  var objs = parentObj.getElementsByTagName('*');

  //如果classStr用空格分隔,则表示class必须同时满足才有效
  var targetArr1 = noRepeat(trim(classStr).split(/s+/));
  //如果classStr用逗号分隔,则表示class只要有一个满足就有效
  var targetArr2 = noRepeat(trim(classStr).split(/s*,s*/));

  if(classStr.indexOf(',') == -1 ){
    //用空格分隔或者只有一个class
    label: for(var i = 0; i < objs.length; i++){
      var arr = noRepeat(trim(objs[i].className).split(/s+/));
      for( var j = 0; j < targetArr1.length; j++){
        if(!inArray(arr,targetArr1[j])){
          continue label;
        }
      }
      result.push(objs[i]);
    }
    return result;
  }else{
    //用逗号分隔
    label: for(var i = 0; i < objs.length; i++){
        var arr = noRepeat(trim(objs[i].className).split(/s+/));
        for( var j = 0; j < targetArr2.length; j++){
          if(inArray(arr,targetArr2[j])){
            result.push(objs[i]);
            continue label;
          }
        }

      }
      return result;   
    }
}

//addclass函数封装
function addClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('s+'));
  if(!inArray(array,classStr)){
    array.push(classStr);
  }
  obj.className = array.join(' ');
  return obj;
}
//removeclass函数封装
function removeClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('s+'));
  var index = indexOf(array,classStr);
  if(index != -1){
    classStr.splice(index,1);
    obj.className = classStr.join(' ');
  }
  return obj;
}
//toggleClass函数封装
function toggleClass(obj,classStr){
  var array = noRepeat(trim(obj.className).split('s+'));
  if(inArray(array,classStr)){
    removeClass(obj,classStr);
  }else{
    addClass(obj,classStr);
  }
}
</script>
</body>
</html>

可望本文所述对我们学习javascript程序设计有着扶植。

那是二个对第三方js-sdk举行打包的小例子,希望全部思路进度对JS初读书人有所启迪。

var createAjax = function() { var xhr = null; try { //IE系列浏览器 xhr = new ActiveXObject; } catch  { try { //非IE浏览器 xhr = new XMLHttpRequest { window.alert; } } return xhr;}; 

您大概感兴趣的篇章:

  • 再一次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6卡塔尔(قطر‎
  • Class Of Marquee Scroll通用不间断滚动JS封装类
  • Jquery小编约翰 Resig自个儿包裹的javascript 常用函数
  • JavaScript 闭包在封装函数时的简要剖判
  • Javascript无名函数的大器晚成种选拔 代码封装
  • javascript的函数、创造对象、封装、属性和方式、世襲
  • 包裹了叁个js图片轮流效果的函数
  • javascript面向对象包装类Class封装类库深入分析
  • 原生Javascript封装的四个AJAX函数分享
  • js时间日期格式化封装函数

本文实例解说了js中class的有余函数封装方法,分享给大家供大家参考,具体内容如下 !...

1. 背景

某系统开辟中引用第三方依赖websocket的劳动,须要对js-sdk进行李包裹装,其最简单易行的demo如下:

// 触发event
window.doLogin()

// event的回调实现
window.cbLogin = res => {
    if (res.code === 0) {
        //doSomethingSuccess
    }
    else {
        //doSomethingFail
    }
}

先达成某些event的回调函数,然后触发某些event,第三方库会基于websocket发出央浼,当有结果回到,会实践event的回调函数。

接下来,大家来写主题函数。

2. 开始时期实现

在专门的学问代码 biz.js 中引进封装库 clink.js,然后注册回调函数,并且将业务的上下文字传递递回去:

//biz.js 业务代码
import clink from './clink'

class Action {
    constructor () {
        super()

        // 注册回调函数
        clink.cbLogin(this)
        clink.cbLogout(this)
    }

    doLogin () {
        window.doLogin()
    }

    // 在window.onload时候执行
    componentDidMount() {
        // 触发login事件
        this.doLogin()
    }
}

//clink.js 对sdk的封装

const clink = {}

clink.cbLogin = ctx => {
    window.cbLogin = res => {
        if (res.code === 0) {
            //doSomethingSuccess
        }
        else {
             //doSomethingFail
        }
    }
}

// 还存在其他event,代码结构类似,此处省略
clink.cbLogout = ...
clink.cbEvent1 = ...
clink.cbEvent2 = ...

biz.js是为着表明怎样来触发event的,大家根本来看clink.js:

// 实现了一个个event的回调
clink.cbLogin = ...
clink.cbLogout = ...
clink.cbEvent1 = ...
clink.cbEvent2 = ...
var ajax = function { // 初始化 //type参数,可选 var type = conf.type; //url参数,必填 var url = conf.url; //data参数可选,只有在post请求时需要 var data = conf.data; //datatype参数可选 var dataType = conf.dataType; //回调函数可选 var success = conf.success; if { //type参数可选,默认为get type = "get"; } if { //dataType参数可选,默认为text dataType = "text"; } // 创建ajax引擎对象 var xhr = createAjax(); // 打开 xhr.open; // 发送 if (type == "GET" || type == "get") { xhr.send; } else if (type == "POST" || type == "post") { xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded"); xhr.send; } xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { if(dataType == "text"||dataType=="TEXT") { if { //普通文本 success; } }else if(dataType=="xml"||dataType=="XML") { if { //接收xml文档 success; } }else if(dataType=="json"||dataType=="JSON") { if { //将json字符串转换为js对象 success(eval("")); } } } };}; 

3. 须要修正

当由于互联网不平稳等成分,使得回调函数拿到的归来结果是战败,则须求重试,暗许重试次数是3次。简简单单地说供给二个重试机制。

下边大家来促成这些重试,仅完结满意需求:

//clink.js

clink.cbLogin = ctx => {
    const MaxRetryCount = 3
    let retryCount = 0

    window.cbLogin = res => {
        if (res.code === 0) {
            //doSomethingSuccess
        }
        else {
             if (retryCount < MaxRetryCount) {
                 // retry
                 ctx.doLogin()
             }
             else {
                 //doSomethingFail
             }
        }
    }
}

大家应有已经意识,每一个回调函数中 MaxRetryCount retryCount if...else...这个是重复的片段,既然是双重的意气风发部分,那我们应有做抽象和包裹。
而显然,这里的 变量doSomethingSuccessdoSomethingFail,因为JavaScript中的函数是一等平民(First Class Object卡塔尔国,能够把Function当成参数字传送递,所以大家把那多少个doSomething真是参数进行李包裹装

本文由qg777发布于运维,转载请注明出处:精解js中class的七种函数封装方法,精解jsclass封装

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。