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;
}
}

JavaScript封装大全的更多相关文章

  1. JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)

    JavaScript资源大全中文版(Awesome最新版)   目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框 ...

  2. javascript开源大全

    javascript开源大全 Ajax框架-jQuery 可视化HTML编辑器-CKEditor 国产jQuery-UI框架-(jUI)-DWZ 网页开发FireFox插件-Firebug 服务器端的 ...

  3. JavaScript 资源大全中文版

    我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加 ...

  4. 【JS】javascript 正则表达式 大全 总结

    javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...

  5. 【PCB】电子元件封装大全及封装常识

    电子元件封装大全及封装常识 电子元件封装大全及封装常识 一.什么叫封装封装,就是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接.封装形式是指安装半导体集成电路芯片用的外壳.它不仅起着 ...

  6. JavaScript封装

    js封装就是把使用方式简单化,内部逻辑和使用解耦.使用人员知道参数和返回值就可以了,其他不用使用人员设置. 封装就是将属性,方法,字段等封装成类. JavaScript封装方法 1,函数方式 func ...

  7. javaScript封装的各种写法

    在javascript的世界里,写法是个神奇的现象,真是百家齐开放啊!每次看到老外写的js组件,思想和写法都怪异,就没看到一个js结构基本相同的代码出来.今天,我就来谈谈js写法,我在开发过程中,也写 ...

  8. Javascript 封装问题

    Javascript 封装问题 为什么会用这样一个题目呢,这是要说封装的什么问题,本文并不讲高深的封装理论,只是解决一个小问题. 问题来源 今天在百度知道上闲逛,遇到一个网友的问题,问题如下,问题的地 ...

  9. javascript函数大全

    JavaScript函数大全 1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->( ...

  10. 面向对象的JavaScript --- 封装

    面向对象的JavaScript --- 封装 封装 封装的目的是将信息隐藏.一般而言,我们讨论的封装是封装数据和封装实现.真正的封装为更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化 ...

随机推荐

  1. Hive:FAILED: LockException [Error 10280]: Error communicating with the metastore

    1.问题示例 使用hive直接选择查看表中数据报错,而相同语句在spark-sql却不报错. 实在无力吐槽hive了,因它受伤太多了. (1)使用hive hive (test)> select ...

  2. Mongodb between 时间范围

    db.getCollection("Order").find({ "Supplier.ServiceCode": "CNI", " ...

  3. modbus通讯协议详解

    1.Modbus 协议简介  Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用 ...

  4. Cmakelist如何添加自己的组件

    在components文件夹下添加各组件的CMakeList,其中可以设置的变量如下: COMPONENT_SRCS:要编译进当前组件的源文件的路径,推荐使用此方法向构建系统中添加源文件.COMPON ...

  5. React数字滚动组件 numbers-scroll

    数字滚动组件,也可以叫数字轮播组件,这个名字一听就是非常普通常见的组件,第一反应就是想找找网上大佬的东西顶礼膜拜一下,这一搜,还真是没找到趁手的╮(╯▽╰)╭. 最近接了大屏的需求,数字滚动肯定是免不 ...

  6. 性能的极致,Rust的加持,Zed-Dev编辑器快速搭建Python3.10开发环境

    快就一个字,甚至比以快著称于世的Sublime 4编辑器都快,这就是Zed.dev编辑器.其底层由 Rust 编写,比基于Electron技术微软开源的编辑器VSCode快一倍有余,性能上无出其右,同 ...

  7. Prometheus Operator 与 kube-prometheus 之一-简介

    简介 Prometheus Operator Prometheus Operator: 在 Kubernetes 上管理 Prometheus 集群.该项目的目的是简化和自动化基于 Prometheu ...

  8. 通过使用chatgpt 逐步解决egg项目学习的一些问题【笔记】

    我的需求提问 创建一个html页面,这个页面包括通过学生id查询学生详情的组件,和通过学生姓名,身份证,选择班级的组件,并把代码告诉我 chatgpt回答 好的,以下是一个包含两个组件的HTML页面, ...

  9. 基于列存储的开源分布式NoSQL数据库Apache Cassandra入门分享

    @ 目录 概述 定义 特性 与Hbase对比 Cassandra使用场景 术语 架构 概览 Dynamo 数据集分区使用令牌环的一致性哈希 存储引擎 部署 单实例部署 集群部署 CQL 概述 数据模型 ...

  10. broadcom Ethernet BCM57412 驱动更新记录(dkms方式)

    一 背景 现场Dell R740xd2机器使用网卡Broadcom 57412 10Gb SFP+,固件版本22.21.06.80.bnxt_en.ko内核模块是该网卡的驱动,我们默认的驱动版本为1. ...