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. gdb调试数组访问越界记录

    综述 问题来源于力扣的一道域名访问统计题目,我本想以建立首字母索引的方式去统计,但是在申请子域名buffer的地方发现使用malloc(sizeof(char)4)申请出来的buffer每次+1只能增 ...

  2. nginx配置权重,ip_hash....

    nginx为后端web服务器(apache,nginx,tomcat,weblogic)等做反向代理 几台后端web服务器需要考虑文件共享,数据库共享,session共享问题.文件共享可以使用nfs, ...

  3. js实现切换页面清除定时器的函数

    背景: 我在切换页面的时候,发现切换回原来的页面,定时器会叠加而不会清除原来的定时器 解决方法: 1.定义全局变量,通过js遍历清除(不会用,但性能好) var pageTimer = {} ; // ...

  4. 一条随手的Arduino sketch优化 以Examples-02.Digital-Debounce为例

    1 const int buttonPin = 2; 2 const int ledPin = 13; 3 4 int ledState = HIGH; 5 int buttonState; 6 in ...

  5. sap shift语法

    shift  xxx LEFT DELETING LEADING / RIGHT DELETING TRAILING mask 语法. xxx中的第一或最后一个字符出现在mask中,则xxx左移或者右 ...

  6. 关于Go语言的底层,你想知道的都在这里!

    目录 1. GoLang语言 1.1 Slice 1.2 Map 1.3 Channel 1.4 Goroutine 1.5 GMP调度 1.6 垃圾回收机制 1.7 其他知识点 2. Web框架Gi ...

  7. Keepalived+HAProxy基于ACL实现单IP多域名负载功能

    编译安装 HAProxy 新版 LTS 版本,编译安装 Keepalived 开启HAProxy多线程,线程数与CPU核心数保持一致,并绑定CPU核心 因业务较多避免配置文件误操作,需要按每业务一个配 ...

  8. Blazor项目在VisualStudio调试时配置运行基础目录

    最近在使用 Blazor 开发管理后台时遇到了如下的问题,我这里后台整体采用了 AntDesignBlazor 组件库,在上线之后发现ReuseTabs组件在使用过程中,如果默认 / 没有指定为项目的 ...

  9. Tesseract5+OpenCV4(VS2017+win10)实现OCR识别

    一.环境配置 较之前采用cppan进行编译的方式,vcpkg的方式已经发生了许多变化,带来的最大不同就是便捷. 对于在NuGet中能够找到的Vcpkg的export,真的实现了开箱即用 这样的话对于普 ...

  10. k8s容器互联-flannel host-gw原理篇

    k8s容器互联-flannel host-gw原理篇 容器系列文章 容器系列视频 简析host-gw 前面分析了flannel vxlan模式进行容器跨主机通信的原理,但是vxlan模式需要对数据包进 ...