首页 > 编程语言 >JavaScript封装大全

JavaScript封装大全

时间:2023-05-06 18:00:09浏览次数:47  
标签:封装 ops JavaScript element xhr key document data 大全

JavaScript封装大全-持续更新

Ajax封装

// 使用该封装需注意
// Ajax(method(默认GET), url(网址 必传), success(res){(成功时数据处理函数 必传)}, error(res)(失败时数据处理函数), data(网址中qurey部分 用对象形式存储 默认为空))

// 使用ES6语法
class Ajax {
  // 解构传入的值 默认参数为空
  constructor({method='GET', url, success, error, data={}}={}) {
    this.method = method;
    this.url = url;
    this.success = success;
    this.error = error;
    this.data = data;
    this.main();
  }
  main() {
    const that = this;
    // 如果没传入success 则为false return结束程序 
    if (!this.success) {
      console.log('缺少必传参数success');
      return;
    };

    // 如果没有传入url 则为false return结束程序
    if (!this.url) {
      console.log('缺少必传参数url');
      return;
    }

    // 创建xhr载体对象
    const xhr = new XMLHttpRequest();

    // 拼接data中键值对
    let str = '';
    for (let key in data) {
      str += `${key}=${data[key]}&`;// key=value&key=value&
    }
    
    if (this.method.toUpperCase() === 'GET') {
      url += str.slice(0, -1);// key=value&key=value
    }

    xhr.open(this.method, this.url);
    if (this.method.toUpperCase() === 'GET') {
      // GET数据格式默认为[querystring]
      xhr.send(null);
    } else {
      // POST需要设置数据格式
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr.send(str.slice(0, -1));
    }

    xhr.onload = function() {
      if (xhr.status === 200) {
        // 将xhr响应交给success处理函数
        that.success(xhr.response);
      } else {
        // 将错误xhr状态交给error处理函数
        that.error && that.error(xhr.status);
      }
    }
  }
}

Cookie封装

//  cookie语法字符
//             名字=值;配置名=配置信息;配置名=配置信息;
//             - 配置名
//                 expires 有效期
//                     值 必须为日期对象
//                 path 路径
//                     值 为路径名

// 增
function setCookie(key, value, ops={}) {
  // 从ops中找到path拼接 没有则为空字符串
  const path = ops.path ? `;path=${ops.path}` : '';
  const d = new Date();
  // 从ops中找到expires和d相加并设置给d
  d.setDate(d.getDate() + ops.expires)
  // 将expires拼接 没有则为空字符串
  const exp = ops.expires ? `;expires=${d}` : '';
  //将所有字符串拼接成有效cookie字符
  document.cookie = `${key}=${value}${exp}${path}`;
}

// 删
function deleteCookie(key, ops={}) {
  // 将ops中的expires修改为负值 即为删除cookie
  ops.expires = -1;
  // 利用setCookie将修改expires值给到key对应cookie
  setCookie(key, '', ops);
}

// 查
function getCookie(key) {
  // 通过document.cookie获取到当前所有cookie组成的一个字符串 并使用splice分割成数组
  const arr = document.cookie.split('; ')
  // 循环数组
  for (let i = 0; i < arr.length; i++) {
    // 用splice分割字符串 并找到对应key值
    if (arr[i].split('=')[0] === key) {
      // 返回对应key值的value
      return arr[i].split('=')[1];
    }
  }
  // 如果document.cookie中不存在 返回null
  return null;
}

缓速动画封装

// slowMotion(需要运动元素, data中存放left和top键值对表示要运动到目标位置, 回调函数)
function slowMotion(element, data, callback) {
  // 函数节流 配合下面的element.timer = null;
  if (element.timer) return;

  // 函数防抖 不需要配合element.timer = null; 有小
  // clearInterval(element.timer);

  element.timer = setInterval(() => {
    // 设置状态 用于记录是否到达目标位置
    let flag = false;
    // 循环
    for (let attr in data) {
      // 使用封装非行内属性的值找到当前位置
      const now = getStyle(element, attr);
      // 目标位置 - 当前位置 / 8 为步长 随着当前位置离目标位置越近 差值越小 步长越小 实现缓动
      let step = (data[attr] - now) / 8;
      // 步长取整
      step = step < 0 ? Math.floor(step) : Math.ceil(step);
      // 将当前位置 + 步长给到对应attr(left或者top)实现元素运动
      element.style[attr] = now + step + 'px';
      // 当元素到达终点时 将状态设置为true
      if (now == data[attr]) flag = true;
    }

    //状态为true 表示元素已到达终点
    if (flag) {
      // 清除间隔器
      clearInterval(element.timer);
      // 缺失这段代码 函数节流一直生效 无法开启下一个间隔器
      element.timer = null;
      // 调用传进来的回调函数 利用短路特性 当没有callback时 右边将不执行
      // 可以利用回调函数调用slowMotion函数实现 当元素到达当前目标位置时 继续向下一个目标位置缓动...
      // 例 slowMotion(div, {left : 100} () => {slowMotion(div, {top : 100})})
      callback && callback();
    }
  }, 30)
}

// 封装获取非行内属性的值(浏览器兼容) element为对应元素 attribute为非行内属性
function getStyle(element, attribute) {
  return element.currentStyle ? element.currentStyle[attribute] : getCpmputed(element)[attribute];
}

元素基础拖拽封装

// new Drag(传入需拖拽的元素);
class Drag {
  constructor (element) {
    this.element = element;
    this.addEvent();
  }

  addEvent() {
    // 原来downMouse内部的this指向element 这里将this指向强行修改指向Drag创建出来的实例对象
    // 用 bind 原因是bind不会自动执行函数
    this.element.onmousedown = this.downMouse.bind(this);
  }

  downMouse(event) {
    // element的事件对象(浏览器兼容)
    this.downE = event || window.event;
    // 原来moveMouse和removeMouse内部的this指向document 这里将this指向强行修改指向downMouse内部this指向 因为downMouse内部指向已经从element修改为Drag实例对象 所以moveMouse和removeMouse内部的this也指向Drag实例对象
    // 用 bind 原因是bind不会自动执行函数
    document.onmousemove = this.moveMouse.bind(this);
    document.onmouseup = this.removeMouse.bind(this);
  }

  moveMouse(event) {
    // document的事件对象(浏览器兼容)
    this.moveE = event || window.event;
    // 将鼠标在页面中的位置 - 鼠标相对于元素的偏移量得到元素左/上边应该距离页面的位置
    let l = this.moveE.pageX - this.downE.offsetX;
    let t = this.moveE.pageY - this.downE.offsetY;
    // 将元素限制在可视区域内(边界限定)
    // 这里if条件里不用 = 的原因是 如果用 = 当拖拽元素到边界上时会吸附在边界上
    if (l < 0) l = 0;
    if (t < 0) t = 0;
    // document.documentElement.clientWidth/Height为当前可视区域大小
    // this.element.offsetWidth/Height为当前元素宽高
    if (l > document.documentElement.clientWidth - this.element.offsetWidth) l = document.documentElement.clientWidth - this.element.offsetWidth;
    if (t > document.documentElement.clientHeight - this.element.offsetHeight) t = document.documentElement.clientHeight - this.element.offsetHeight;
    // 把当前位置给到元素的left/top
    this.element.style.left = l + 'px';
    this.element.style.top = t + 'px';
  }

  removeMouse() {
    // 鼠标抬起后 删除鼠标移动和抬起事件
    document.onmousemove = null;
    document.onmouseup = null;
  }
}

标签:封装,ops,JavaScript,element,xhr,key,document,data,大全
From: https://www.cnblogs.com/SpicyPeper/p/17378168.html

相关文章

  • javaScript 常用去除 ‘console
    javaScript常用去除‘console.log’办法手动注释掉console.log语句:可以手动在代码中注释掉所有console.log语句,但是这种方法比较繁琐,并且需要手动维护,不太适合大型项目。使用Babel插件去除console.log:Babel是一个JavaScript编译器,它可以将ES6+的代码转换成......
  • Mybatis通用DAO设计封装(mybatis)
    关键字:Mybatis通用DAO设计封装(mybatis)说明:mybatis默认分页机制为逻辑分页,所以要处理成物理分页需要自己写一个拦截器(当然也可以不用这个分页机制,自己直接在SQL文件中实现也是可以的)RowBoundsrowBound=newRowBounds(start,pageSize);具体封装如下......
  • java封装和关键字
    一、封装封装:告诉我们如何正确设计对象的属性和方法对象代表什么,就得封装对应的数据,并提供数据对应的行为封装的好处:让编程变得很简单,有什么事,找对象,调方法降低学习成本,可以少学,少记,或者说压根不用学,不用记对象有哪些方法,有需要时去找就行二、Private关键字:是一个......
  • JavaScript 面试题
    一、event.stopPropagation和 event.preventDefault的区别1、event.stopPropagation(停止传播)   用于阻止捕获和冒泡事件的进一步传播。但是不能阻止同一Dom节点上的其它事件被调用。2、event.preventDefault(阻止默认)   方法可防止元素的默认行为。比如a标签的......
  • 查看Linux系统版本内核命令大全
    目录命令一:查看当前系统发行版本详细信息命令二:查看当前系统内核信息命令三:查看当前系统版本信息命令四:查看CPU相关信息命令五:查看系统位数Linux系统内核、发行版本有很多,那么如何查看当前Linux系统的内核信息、Linux系统发行版本等信息呢?Linux百科网分享查询Linux系统详细信息的方......
  • 实践分享:打造极具高扩展性的JavaScript SDK
    SDK(SoftwareDeveloperKit)是使用FeatureProbe服务必不可少的工具之一。SDK能将用户的应用程序连接到FeatureProbe服务,根据用户的配置获取开关的结果,还能将开关的访问情况上报给FeatureProbe,进而实现A/B实验的能力。FeatureProbe目前对外提供十余种主流开发语言的SDK,包括......
  • 网页抓取--1(原网页+Javascript返回数据)
     有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。一、抓取原网页。这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:第一步:打开这个网页......
  • DB2 错误代码大全
    在备库进行查询时返回SQLCODE=-1773SQLSTAT=如下查询可知|-1773|null|在HADR数据库下不支持的操作(如备库可能不支持写操作)|https://blog.csdn.net/qq_35246620/article/details/56877433......
  • 代码大全-如何建立一个高质量的子程序
    不积硅步,无以至千里;不积小流,无以成江海。大型的项目是由一个个小模块构建而成。每一个小模块里面又包含着许多子程序。如果每一个子程序都能做到高质量,那么整个项目代码的质量必然很高。......
  • JavaScript学习汇总
    ExtJs学习之Button(08)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通04官方文档查找办法_例如_Ext.Window(48)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通03自定义函数_调用顺序(47)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通02Ext.Panel创建后_调用的几种方法(46)......