• javascript中最最最常用的方法封装


    javascript 常用方法的封装,小编持续升级中...

       方法封装(js原生):

    一、Object 类型

    • MHQ.ajaxUtils 定义一个ajax工具类

      • ajax 定义一个ajax工具函数

      • get 方法

      • post 方法

    • MHQ.elementUtils DOM元素工具类

      • replaceClassName 替换字符串,设置className属性

      • getInnerText 获取DOM元素内部文本的兼容方法

      • setInnerText 设置DOM元素内部文本的兼容方法

      • getNextElement 封装了获取元素的下一个兄弟元素的方法

      • getPreviousElement 封装了获取元素的上一个兄弟元素的方法

      • getFirstElement 封装寻找某个元素的第一个子元素的方法

      • getLastElement 封装寻找某个元素的最后一个子元素的方法

      • my$ 封装了通过id获取元素的方法

    • MHQ.eventUntil事件处理类 封装了事件处理的兼容方法

      • addSeveralEvent(element, eventName, fn);  给一个元素同时多个事件

      • addEvent(element, eventName, fn);  封装添加事件的方法

      • removeEvent(element, eventName, fn);  封装移除事件的方法

    • MHQ.getDateObj 获取指定格式的日期

      • getDate 获取指定格式的日期

      • transDateFormat 日期显示格式化函数

    • MHQ.getRandomObj 获取n个随机数 最终得到数组 object.getRandomArr 得到随机数的数组

      • getRandomArr(count, min, max); 获取n个随机数的方法 最终得到数组

    二、接口类:   

    • MHQ.Interface(interfaceName, methodsArr) 接口类

      •  verifyInterface(instanceSets) 接口校验方法

    三、方法:

    • MHQ.animate(element, json, fn); js 特效中的动画函数封装

    • MHQ.getAttrValue(element,attr); 获取属性的兼容方法

    • MHQ.getObjArrMax(arr) 得到诸如[{attr1:2,attr2:3}, {attr1:1,attr2:2}]数组中各对象的attr1属性中最大的一个(仅仅根据第一个属性的最大来返回一个对象)

    • MHQ.getRandom(min, max); 获取一个随机整数 Math.random(); 中的参数可以是一个,考虑了参数是一个的情况

    • MHQ.getColor(count); 获取随机的颜色数组

    • MHQ.sortArr(arr) 数组冒泡排序

    注: 每个函数的功能都在代码中详细说明。

    /**
    * Created by mhq on 2016/10/16.
    *
    * Object:
    * MHQ.ajaxUtils 定义一个ajax工具类
    * ajax 定义一个ajax工具函数
    * get 方法
    * post 方法
    *
    * MHQ.elementUtils DOM元素工具类
    * replaceClassName 替换字符串,设置className属性
    * getInnerText 获取DOM元素内部文本的兼容方法
    * setInnerText 设置DOM元素内部文本的兼容方法
    * getNextElement 封装了获取元素的下一个兄弟元素的方法
    * getPreviousElement 封装了获取元素的上一个兄弟元素的方法
    * getFirstElement 封装寻找某个元素的第一个子元素的方法
    * getLastElement 封装寻找某个元素的最后一个子元素的方法
    * my$ 封装了通过id获取元素的方法
    *
    * MHQ.eventUntil 事件处理对象,封装了绑定事件的方法
    * addSeveralEvent(element, eventName, fn); 给一个元素同时多个事件
    * addEvent(element, eventName, fn); 封装添加事件的方法
    * removeEvent(element, eventName, fn); 封装移除事件的方法
    *
    * MHQ.getDateObj 获取指定格式的日期
    * getDate 获取指定格式的日期
    * transDateFormat 日期显示格式化函数
    *
    * MHQ.getRandomObj 获取n个随机数 最终得到数组 object.getRandomArr 得到随机数的数组
    * getRandomArr(count, min, max); 获取n个随机数的方法 最终得到数组
    *
    * Class:
    * MHQ.Interface(interfaceName, methodsArr) 接口类
    * verifyInterface(instanceSets) 接口校验方法
    *
    * METHOD:
    * MHQ.animate(element, json, fn); js 特效中的动画函数封装
    * MHQ.getAttrValue(element,attr); 获取属性的兼容方法
    * MHQ.getObjArrMax(arr) 得到诸如[{attr1:2,attr2:3}, {attr1:1,attr2:2}]数组中各对象的attr1属性中最大的一个(比较勉强的方法)
    * MHQ.getRandom(min, max); 获取一个随机整数 Math.random(); 中的参数可以是一个,考虑了参数是一个的情况
    * MHQ.getColor(count); 获取随机的颜色数组
    * MHQ.sortArr(arr) 数组冒泡排序
    */
    // 命名空间
    var MHQ = {};

    /**
    * OBJECT 定义一个ajax工具
    * @type {{ajax, get, post}}
    */
    MHQ.ajaxUtils = (function () {
    return {
    /**
    * ajax 工具函数
    * @param options 是一个对象
    * @returns {*}
    */
    ajax: function (options) {
    /*如果你什么都没传呢?停止执行*/
    if (!options || typeof options != 'object') return fasle;
    /*如果传了*/
    var type = options.type || 'get';
    var url = options.url || location.pathname;
    /* false true "" false */
    var async = options.async === false ? false : true;
    /*需要传递的数据*/
    var data = options.data || {};
    /*需要data转化成ajax传递数据的格式 {name:'',age:''} ===>>> name=gc&age=10 */
    var dataStr = '';
    for (key in data) {
    dataStr += key + '=' + data[key] + '&';
    }
    /*str.slice(0,-1); 取到倒着数几个字符*/
    dataStr = dataStr && dataStr.slice(0, -1);
    /*ajax编程*/
    /*初始化*/
    var xhr = new XMLHttpRequest();
    /*设置请求行*/
    /*如果是get请求 参数是不是该拼接在url后面*/
    xhr.open(type, type == 'get' ? url + '?' + dataStr : url, async);
    /*设置请求头*/
    if (type == 'post') {
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    /*设置请求内容*/
    xhr.send(type == 'get' ? null : dataStr);
    /*响应*/
    xhr.onreadystatechange = function () {
    /*首先确定通讯完全完成*/
    if (xhr.readyState == 4) {
    /*如果是成功的请求 status == 200 */
    if (xhr.status == 200) {
    /*成功*/
    /*知道后台想要返回什么数据类型 application/json;charset=utf-8*/
    /*application/xml application/json text/html text/xml text/json text/css*/
    var contentType = xhr.getResponseHeader('Content-Type');
    var result = null;
    if (contentType.indexOf('xml') > -1) {
    /*返回什么数据类型xml*/
    result = xhr.responseXML;
    } else if (contentType.indexOf('json') > -1) {
    /*返回什么数据类型json*/
    var data = xhr.responseText;
    result = data && JSON.parse(data);
    } else {
    result = xhr.responseText;
    }
    /*执行成功回调函数*/
    options.success && options.success(result);

    } else {
    /*失败*/
    options.error && options.error({status: xhr.status, statusText: xhr.statusText});
    }
    }
    }
    },
    /**
    * get 方法
    * @param options
    */
    get: function (options) {
    options.type = 'get';
    this.ajax(options);
    },
    /**
    * post 方法
    * @param options
    */
    post: function (options) {
    options.type = 'post';
    this.ajax(options);
    }
    }
    })();

    /**
    * OBJECT 事件处理对象,封装了绑定事件的方法
    * @returns {{addSeveralEvent: addSeveralEvent, addEvent: addEvent, removeEvent: removeEvent}}
    * @constructor
    */
    MHQ.eventUntil = (function () {
    return {
    /**
    * METHOD 给一个元素同时多个事件
    * @param element 需要绑定事件的元素 Dom Object
    * @param eventName 需要绑定的事件类型名称 string
    * @param fn 回调函数 function
    */
    addSeveralEvent: function (element, eventName, fn) {
    var oddEvent = element["on" + eventName];
    if (oddEvent == null) {
    element["on" + eventName] = fn;
    } else {
    element["on" + eventName] = function () {
    oddEvent();
    fn();
    }
    }
    },
    /**
    * 封装添加事件的方法
    * @param element 需要绑定事件的元素 Dom Object
    * @param eventName 需要绑定的事件类型名称 string
    * @param fn 回调函数 function
    */
    addEvent: function (element, eventName, fn) {
    if (element.addEventListener) { // 谷歌和火狐
    element.addEventListener(eventName, fn, false);
    } else if (element.attachEvent) { // IE8
    element.attachEvent("on" + eventName, fn);
    } else { // 所有浏览器
    element["on" + eventName] = fn;
    }
    },
    /**
    * 移除事件的兼容方法
    * @param element 需要绑定事件的元素 Dom Object
    * @param eventName 需要绑定的事件类型名称 string
    * @param fn 回调函数 function
    */
    removeEvent: function (element, eventName, fn) {
    if (element.removeEventListener) { // 谷歌和火狐
    element.removeEventListener(eventName, fn, false);
    } else if (element.attachEvent) { // IE8
    element.attachEvent("on" + eventName, fn);
    } else { // 所有浏览器
    element["on" + eventName] = null;
    }
    }
    };
    })();

    /**
    * OBJECT DOM元素工具类
    * @type {{replaceClassName, getInnerText, setInnerText, getNextElement, getPreviousElement, getFirstElement, getLastElement, my$}}
    */
    MHQ.elementUtils = (function () {
    return {
    /**
    * 替换字符串,设置className属性
    * @param element 要替换class属性的元素
    * @param oldStr 替换前的类名
    * @param newStr 新的类名
    */
    replaceClassName: function (element, oldStr, newStr) {
    element.className = element.className.replace(oldStr, newStr);
    },

    /**
    * 获取DOM元素内部文本的兼容方法
    * @param element DOM元素
    * @returns {*}
    */
    getInnerText: function (element) {
    if (typeof element.innerText === "string") {
    return element.innerText;
    } else {
    return element.textContent;
    }
    },

    /**
    * 设置DOM元素内部文本的兼容方法
    * @param element DOM元素
    * @param content 要设置的内容
    */
    setInnerText: function (element, content) {
    if (typeof element.innerText === "string") {
    element.innerText = content;
    } else {
    element.textContent = content;
    }
    },

    /**
    * 封装了获取元素的下一个兄弟元素的方法
    * @param element DOM元素
    * @returns {*}
    */
    getNextElement: function (element) {
    if (element.nextElementSibling) {
    return element.nextElementSibling;
    } else {
    var next = element.nextSibling;
    while (next && next.nodeType !== 1) {
    next = next.nextSibling;
    }
    return next;
    }
    },

    /**
    * 封装了获取元素的上一个兄弟元素的方法
    * @param element DOM元素
    * @returns {*}
    */
    getPreviousElement: function (element) {
    if (element.previousElementSibling) {
    return element.previousElementSibling;
    } else {
    var previous = element.previousSibling;
    while (previous && 1 !== next.nodeType) {
    previous = previous.previousSibling;
    }
    return previous;
    }
    },

    /**
    * 封装寻找某个元素的第一个子元素的方法
    * @param element DOM元素
    * @returns {*}
    */
    getFirstElement: function (element) {
    // return element.children[0]; // 为了更严瑾用下面的方法
    if (element.firstElementChild) {
    return element.firstElementChild;
    } else {
    var first = element.firstChild;
    while (first && 1 !== first.nodeType) {
    first = first.nextSibling;
    }
    return first;
    }
    },

    /**
    * 封装寻找某个元素的最后一个子元素的方法
    * @param element DOM元素
    * @returns {*}
    */
    getLastElement: function (element) {
    // return element.children[element.children.length-1]; // 为了更严瑾用下面的方法
    if (element.lastElementChild) {
    return element.lastElementChild;
    } else {
    var last = element.lastChild;
    if (last && 1 !== last.nodeType) {
    last = last.previousSibling;
    }
    return last;
    }
    },

    /**
    * 封装了通过id获取元素的方法
    * @param id
    * @returns {Element}
    */
    my$: function (id) {
    return document.getElementById(id);
    }
    }
    })();

    /**
    * OBJECT 获取指定格式的日期
    * @type {{getDate, transDateFormat}}
    */
    MHQ.getDateObj = (function () {
    return {
    /**
    * 获取指定格式的日期
    * @param date
    * @returns {string}
    */
    // 封装一个指定日期格式的获取日期的函数
    getDate: function (date) {
    // 获取年
    var year = date.getFullYear();
    // 获取月
    var mouth = date.getMonth() + 1;
    // 获取日
    var day = date.getDate();
    // 获取小时
    var hours = date.getHours();
    // 获取分钟
    var minute = date.getMinutes();
    // 获取秒
    var second = date.getSeconds();
    // 设置格式
    mouth = this.transDateFormat(mouth);
    day = this.transDateFormat(day);
    hours = this.transDateFormat(hours);
    minute = this.transDateFormat(minute);
    second = this.transDateFormat(second);
    return year + "年" + mouth + "月" + hours + "日" + " " + hours + ":" + minute + ":" + second;
    },
    /**
    * 日期显示格式化函数
    * @param val 时分秒数字 0~59
    * @returns {string}
    */
    transDateFormat: function (val) {
    return val < 10 ? "0" + val : val;
    }
    }
    })();

    /**
    * OBJECT 获取n个随机数 最终得到数组 object.getRandomArr 得到随机数的数组
    * 说明:因为要传递参数,所以不能用立即执行函数
    * @type {{getRandomArr}}
    */
    MHQ.getRandomObj = (function () {
    var arr = [];
    return {
    /**
    * 获取n个随机数的方法 最终得到数组
    * @param count 需要得到的随机数组中随机数的个数
    * @param min 随机数的最小值
    * @param max 随机数的最大值
    * @returns {Array}
    */
    getRandomArr: function (count, min, max) {
    while (arr.length < count) {
    var num = MHQ.getRandom(min, max);
    if (arr.indexOf(num) === -1) {
    arr.push(num);
    }
    }
    return arr;
    }
    }
    })();

    /**
    * METHOD js 特效中的动画函数封装
    * @param element 要添加动画的元素
    * @param json 需要产生动画的数据
    * @param fn 回调函数
    */
    MHQ.animate = function (element, json, fn) {
    clearInterval(element.timeId);
    element.timeId = setInterval(function () {
    var flag = true;//假设都达到了目标
    for (var attr in json) {
    if (attr == "opacity") {//判断属性是不是opacity
    var current = getAttrValue(element, attr) * 100;
    //每次移动多少步
    var target = json[attr] * 100;//直接赋值给一个变量,后面的代码都不用改
    var step = (target - current) / 10;//(目标-当前)/10
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    current = current + step;
    element.style[attr] = current / 100;
    } else if (attr == "zIndex") {//判断属性是不是zIndex
    element.style[attr] = json[attr];
    } else {//普通的属性
    //获取当前的位置----getAttrValue(element,attr)获取的是字符串类型
    var current = parseInt(getAttrValue(element, attr)) || 0;
    //每次移动多少步
    var target = json[attr];//直接赋值给一个变量,后面的代码都不用改
    var step = (target - current) / 10;//(目标-当前)/10
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    current = current + step;
    element.style[attr] = current + "px";
    }
    if (current != target) {
    flag = false;//如果没到目标结果就为false
    }
    }
    if (flag) {//结果为true
    clearInterval(element.timeId);
    if (fn) {//如果用户传入了回调的函数
    fn(); //就直接的调用,
    }
    }
    }, 10);
    };

    /**
    * CLASS 接口类:2个参数
    * @param interfaceName 接口名称
    * @param methodsArr 接口抽象方法的方法名存放数组
    * @constructor MHQ.Interface
    */
    MHQ.Interface = function (interfaceName, methodsArr) {
    // 判断参数传入的参数个数是否等于2
    if (arguments.length !== 2) {
    throw new Error("传入的接口参数个数不正确");
    }
    this.interfaceName = interfaceName;
    // 用一个空数组接收第二个参数数组
    this.methods = [];
    for (var i = 0; i < methodsArr.length; i++) {
    // 判断方法是否存在,方法名是否是"string"类型
    if (typeof methodsArr[i] !== "string") {
    throw new Error("接口方法名必须是string类型的");
    }
    this.methods.push(methodsArr[i]);
    }
    };

    /**
    * METHOD 获取随机的颜色数组
    * @param count 需要获取的颜色数目
    * @returns {Array}
    */
    MHQ.getColor = function (count) {
    var colorSingle;
    var colorArr = [];
    var color = "#";
    for (var i = 0; i < count; i++) {
    for (var j = 0; j < 6; j++) {
    var colorRandom = MHQ.getRandom(16);
    switch (colorRandom) {
    case 10:
    colorSingle = "A";
    break;
    case 11:
    colorSingle = "B";
    break;
    case 12:
    colorSingle = "C";
    break;
    case 13:
    colorSingle = "D";
    break;
    case 14:
    colorSingle = "E";
    break;
    case 15:
    colorSingle = "F";
    break;
    default:
    colorSingle = colorRandom;
    }
    color += colorSingle;
    }
    colorArr.push(color);
    color = "#";
    }
    return colorArr;
    };

    /**
    * METHOD EXTEND 继承(原型继承,仅仅继承原型中的属性和方法) + call()/apply只继承 混合继承
    * @param {Object} sub 子类构造函数
    * @param {Object} sup 父类构造函数
    */
    MHQ.extend = function (sub, sup) {
    //目的:需要实现只继承父类的原型对象
    //1 需要创建一个空函数 目的: 中转
    var F = new Function();
    //2 实现空函数的原型对象和超类的原型对象转换
    F.prototype = sup.prototype;
    //3 原型继承
    sub.prototype = new F();
    //4 还原子类的构造器
    sub.prototype.constructor = sub;
    // 保存父类的原型对象 目的:一方面方便解耦; 另一方面可以轻松的获得父类的原型对象
    //5 自定义一个子类的静态属性 接收父类的原型对象
    sub.superClass = sup.prototype;
    //6 为防止父类的constructor属性的设置落下 在extend()方法中加保险
    if (sup.prototype.constructor == Object.prototype.constructor) {
    //手动的还原原型对象的构造器
    sup.prototype.constructor = sup;
    }
    };

    /**
    * METHOD 接口校验
    * @param instanceSets 实例的集合,传入多个参数:第一个实现类的实例,第二个,第三个...接口实例
    */
    MHQ.Interface.verifyInterface = function (instanceSets) {
    // 判断传入的参数个数是否正确
    if (arguments.length < 2) {
    throw new Error("接口校验方法的构造器实参个数必须大于等于2");
    }
    // 判断传进来的参数的个数是否大于等于2,如果小于2,则抛出异常
    for (var i = 1; i < arguments.length; i++) {
    // 将接口实例保存到一个变量中
    var interfaceInstance = arguments[i];
    // 判断传过来的对象的构造器是否是Interface,不是则抛出异常
    if (interfaceInstance.constructor !== MHQ.Interface) {
    throw new Error("参数的构造器不是Interface对象");
    }
    // 检测方法
    for (var j = 0; j < interfaceInstance.methods.length; j++) {
    // 用一个参数来接收方法名称
    var methodName = interfaceInstance.methods[j];
    if (!InstanceSets[methodName] || typeof InstanceSets[methodName] !== "function") {
    throw new Error("方法:'" + methodName + "'不存在");
    }
    }
    }
    };

    /**
    * METHOD 获取属性的兼容方法
    * @param element 要获取属性的兼容方法
    * @param attr 要获取的属性
    * @returns {*|number}
    */
    MHQ.getAttrValue = function (element, attr) {
    return element.currentStyle ? element.currentStyle[attr] : window.getComputedStyle(element, null)[attr];
    };

    /**
    * METHOD 得到诸如[{attr1:2,attr2:3}, {attr1:1,attr2:2}]数组中各对象的attr1属性中最大的一个(仅适用于对象的attr1属性排序)
    * @param arr [{attr1:2,attr2:3}, {attr1:1,attr2:2}]
    */
    MHQ.getObjArrMax = function (arr) {
    Math.max.apply(null, arr.map(function (v) {
    return v.attr1;
    }));
    };

    /**
    * METHOD 获取一个随机整数 Math.random(); 中的参数可以是一个,考虑了参数是一个的情况
    * @param min 随机数的范围的下限
    * @param max 随机数的范围的上限
    * @returns {Number}
    */
    MHQ.getRandom = function (min, max) {
    if (max === undefined) {
    max = min;
    min = 0;
    }
    return parseInt(Math.random() * (max - min) + min);
    };

    /**
    * METHOD 数组冒泡排序
    * @param arr 需要排序的数组
    * @returns {*}
    */
    MHQ.sortArr = function (arr) {
    for (var i = 0; i < arr.length - 1; i++) {
    var flag = true;
    for (var j = 0; j < arr.length - 1 - i; j++) {
    if (arr[j] > arr[j + 1]) {
    var tempValue = arr[j + 1];
    arr[j + 1] = arr[j];
    arr[j] = tempValue;
    flag = false;
    }
    }
    if (flag) {
    break;
    }
    }
    return arr;
    };
    拼着一切代价,奔你的前程。_巴尔扎克
  • 相关阅读:
    case when then用法
    查询后n条记录
    自定义函数
    字符函数
    数字运算符和函数
    时间日期函数
    mysql加密函数
    比较运算符和函数
    文件夹中的文件以目录的形式呈现
    错误提示:通过 Web 服务器的身份验证的用户无权打开文件系统上的文件
  • 原文地址:https://www.cnblogs.com/hongqin/p/5979408.html
Copyright © 2020-2023  润新知