• 第一百六十一节,封装库--JavaScript,完整封装库文件


    封装库--JavaScript,完整封装库文件

    /**
     *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀
     **/
    
    
    /** 前台调用
     * 每次调用$()创建库对象,使其每次调用都是独立的对象
     * $()创建库对象,有一个可选参数,参数有两种方式,1是传入的this,2是传入的字符串
     * 可选参数说明:
     * 传入的this,this,就是当前对象本身
     *
     * 传入的字符串,代表获取元素选择器
     * 参数是元素选择器(id值、class值、标签名称)其中一样的字符串方式,或者是其中几样的字符串组合方式
     * 获取一个元素传参方式 '#xxx'( 表示获取id),'.xxx'(表示获取class),'xxx'(表示获取标签)
     * 从父元素向下获取组合方式按照,一个元素传参方式加上空格,如: ('#sdf .hjk p')表示获取id为sdf元素下的class为hjk下的p元素
     *
     * 传入一个匿名函数,表示是dom页面文档加载,在匿名函数里写代码,表示等待页面文档加载完毕后执行函数里的代码
     * 加载dom页面文档结构后执行函数,不等待图片,音频视频等文件加载
     **/
    var $ = function (args) {
        return new feng_zhuang_ku(args);
    };
    
    /**
     *定义封装库构造函数,类库
     **/
    function feng_zhuang_ku(args) {
        /** jie_dian属性,创建数组,初始化,保存获取到的元素节点,返回数组
         **/
        this.jie_dian = [];
        if (typeof args == 'string') {                      //如果传入的是字符串,说明是获取元素选择器
            if (args.indexOf(' ') != -1) {
                /**从父元素向下获取组合方式**/
                var fen_ge = args.split(' ');                //将接收的组合式元素名称分割成数组
                var lin_shi = [];                            //保存临时对象的数组,解决被覆盖问题
                var fu_yuan_su = [];                         //保存父元素的数组
                for (var i = 0; i < fen_ge.length; i++) {
                    if (fu_yuan_su.length == 0)fu_yuan_su.push(document);               //如果没有父节点,就把document放入父节点
                    switch (fen_ge[i].charAt(0)) {                                     //判断字符串的第一个字符是什么
                        case '#':                                                      //说明是id
                            lin_shi = [];                                              //清理临时数组,以便父节点失效,子节点有效
                            lin_shi.push(this.huo_qu_id(fen_ge[i].substring(1)));      //去除第一个字符,获取到传入的id元素,保存到临时数组
                            fu_yuan_su = lin_shi;                                      //将临时节点数组放入父节点数字
                            break;                                                     //说明是class
                        case '.':
                            lin_shi = [];                                                                   //清理临时数组,以便父节点失效,子节点有效
                            for (var f = 0; f < fu_yuan_su.length; f++) {                                  //根据父节点的长度循环
                                var tempss = this.huo_qu_class(fen_ge[i].substring(1), fu_yuan_su[f]);     //获取到父节点下的子节点
                                for (var n = 0; n < tempss.length; n++) {                      //循环子节点,将每次循环的子节点添加到临时数组
                                    lin_shi.push(tempss[n]);
                                }
                            }
                            fu_yuan_su = lin_shi;                                               //将临时节点数组放入父节点数字
                            break;
                        default:                                                               //说明是标签
                            lin_shi = [];                                                       //清理临时数组,以便父节点失效,子节点有效
                            for (var j = 0; j < fu_yuan_su.length; j++) {                      //根据父节点的长度循环
                                var temps = this.huo_qu_name(fen_ge[i], fu_yuan_su[j]);        //获取到父节点下的子节点
                                for (var k = 0; k < temps.length; k++) {                       //循环子节点,将每次循环的子节点添加到临时数组
                                    lin_shi.push(temps[k]);
                                }
                            }
                            fu_yuan_su = lin_shi;                                               //将临时节点数组放入父节点数字
                    }
                }
                this.jie_dian = lin_shi;                                            //将临时数组放入jie_dian数组
            } else {
                /**一个元素传参方式**/
                switch (args.charAt(0)) {                                           //判断字符串的第一个字符是什么
                    case '#':                                                       //说明是id
                        this.jie_dian.push(this.huo_qu_id(args.substring(1)));      //去除第一个字符,获取到传入的id元素
                        break;
                    case '.':                                                       //说明是class
                        this.jie_dian = this.huo_qu_class(args.substring(1));       //去除第一个字符,获取到传入的class元素
                        break;
                    default:                                                        //说明是标签
                        this.jie_dian = this.huo_qu_name(args);                     //获取到传入的标签元素
                }
            }
        } else if (typeof args == 'object') {                                       //如果传入的是对象,说明是this,就是当前对象本身
            if (args != undefined) {
                this.jie_dian[0] = args;
            }
        } else if (typeof args == 'function') {
            this.dom_dom(args);
        }
    }
    
    
    
    /**█████████████████████████████████████████████████封装库█████████████████████████████████████████████████████████**/
    
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃获取元素标签开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
     /**获取元素标签说明:
     * jie_dian属性,保存获取到的元素节点,返回数组,
     *
     * huo_qu_id()方法,通过id获取元素标签,参数是id值,将获取到的元素对象返回给方法本身,无法连缀
     * huo_qu_name()方法,通过标签名称获取相同标签名的元素,
     * huo_qu_class()方法,获取相同class属性的节点,返回包含相同class属性的节点数组,返回给方法本身,无法连缀
     * hq_form_name()方法,获取表单里,指定name值的元素节点,也就是获取表单里指定名称的元素节点,在form元素对象下使用
     * hq_value()方法,获取和设置表单里节点的value属性值
     * huo_qu_name_zhi()方法,通过元素name值获取指定元素,适用于获取表单元素,
     * shang_jd()方法,获取当前节点同级的上一个节点
     * xia_jd()方法,获取当前节点同级的下一个节点
     * hq_jd()方法,多个节点时,获取某一个节点,并返回这个节点对象,参数是节点索引
     * sh_jd()方法,多个节点时,获取首个节点,并返回这个节点对象,无参
     * w_jd()方法,多个节点时,获取末个节点,并返回这个节点对象,无参
     * guo_lv_jie_dian()方法,多个节点时,获取某一个节点,并且feng_zhuang_ku对象
     * jd_length()方法,获取一个节点集合的长度
     * hq_suo_yin()方法,获取一个节点在,父节点下,子节点集合里的索引,也就是在集合里的下标
     * hq_shu_xing_zhi()方法,获取或设置一个节点的属性值
     * huo_qu_zi_jie_dian()方法,获取一个元素下的子元素
     * dom_dom()方法,加载dom页面文档结构后执行函数,不等待图片,音频视频等文件加载
     **/
    
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃元素节点操作开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    /**元素节点操作说明:
     * c_css()方法,给获取到的元素设置ss样式,或者获取css样式,
     * shzh_tou_ming_du()方法,给元素设置透明度
     * wen_ben()方法,给获取到的元素设置文本,或者获取文本
     * wen_ben_guo_lv()方法,给获取到的元素设置文本,或者获取文本,会过滤html标签
     * tian_jia_class()方法,给获取到的元素添加class属性,参数是class属性值,可以连缀
     * yi_chu_class()方法,给获取到的元素移除class属性,参数是要移除的class属性值,可以连缀
     * she_zhi_link_css()方法,设置link连接、或style内嵌、中的CSS样式
     * yi_chu_link_css()方法,移除link连接、或style内嵌、中的CSS样式
     * tuo_zhuai()方法,将一个弹窗元素实现拖拽功能
     **/
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃元素事件开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    /**元素事件说明:
     * shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码)
     * xian_shi()方法,设置元素显示,无参
     * yin_cang()方法,设置元素隐藏,无参
     * yuan_su_shi_jian()方,给元素添加一个元素事件
     * on_click()方法,给获取到的元素添加一个点击事件,参数是一个匿名函数(包含函数功能),
     * dian_ji_qie_huan()方法,设置点击切换,将元素设置成点击切换,也就是点击目标元素后,循环执行方法里的函数
     * yuan_su_ju_zhong()方法,将获取到的区块元素居中到页面,
     * chuang_kou_shi_jian()方法,浏览器窗口事件,当窗口的大小变化时触发函数
     * zhe_zhao_suo_ping()方法,将一个区块元素设置成遮罩锁屏区块
     * jie_chu_suo_ping()方法,将一个锁屏区块元素解除锁屏,
     **/
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃元素动画开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    /**
     * 元素动画说明
     * yi_dong_tou_ming()方法,将一个元素,
     *
     **/
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃插件入口开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    
    /** 插件入口,简单的理解就是通过extend()方法,向此基础库添加一个原型方法
     **/
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃ajax通讯▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    /**
     * ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据
     **/
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃表单序列化▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    /**
     * xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和value值,无法连缀
     **/
    /**█████████████████████████████████████████████████封装库██████████████████████████████████████████████████████████**/
    
    
    
    
    /**------------------------------------------------获取元素标签开始--------------------------------------------**/
    
    /** huo_qu_id()方法,通过id获取元素标签,参数是id值,将获取到的元素对象返回给方法本身,无法连缀
     **/
    feng_zhuang_ku.prototype.huo_qu_id = function (id) {
        return document.getElementById(id);
    };
    
    /** huo_qu_name()方法,通过标签名称获取相同标签名的元素,返回包含相同标签名的元素数组,返回给方法本身
     * 两个参数:获取指定元素下的相同标签元素,参数1标签名称,参数2是要获取元素的父元素
     * 一个参数:获取页面所有相同标签元素,参数是标签名称
     **/
    feng_zhuang_ku.prototype.huo_qu_name = function (tag, parentnode) {
        var node = null;
        var lin_shi = [];
        if (parentnode != undefined) {
            node = parentnode;
        } else {
            node = document;
        }
        var tags = node.getElementsByTagName(tag);
        for (var i = 0; i < tags.length; i++) {
            lin_shi.push(tags[i]);
        }
        return lin_shi;
    };
    
    /** huo_qu_class()方法,获取相同class属性的节点,返回包含相同class属性的节点数组,返回给方法本身,无法连缀
     * 一个参数:获取整个页面指定的class属性节点,参数是class属性值
     * 两个参数:获取指定元素区下的class属性节点,参数1是class属性值,参数2是要获取class属性节点的父元素节点
     **/
    feng_zhuang_ku.prototype.huo_qu_class = function (name, parentnode) {
        var node = null;
        var lin_shi = [];
        if (parentnode != undefined) {
            node = parentnode;
        } else {
            node = document;
        }
        var all = node.getElementsByTagName('*');
        for (var i = 0; i < all.length; i++) {
            if ((new RegExp('(\s|^)' + name + '(\s|$)')).test(all[i].className)){
                lin_shi.push(all[i]);
            }
        }
        return lin_shi;
    };
    
    /** hq_form_name()方法,获取表单里,指定name值的元素节点,也就是获取表单里指定名称的元素节点,在form元素对象下使用
     *  参数是要获取表单里的元素name值,也就是名称
     *  返回表单里有相同name值的节点集合
     **/
    feng_zhuang_ku.prototype.hq_form_name = function (name) {
        for (var i = 0; i < this.jie_dian.length; i++){
            this.jie_dian[i] = this.jie_dian[i][name];
        }
        return this;
    };
    
    /** hq_value()方法,获取和设置表单里节点的value属性值
     *  无参为获取表单里节点的value属性值
     *  有参为设置表单里节点的value属性值,参数是要设置的value属性值
     **/
    feng_zhuang_ku.prototype.hq_value = function (str) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (arguments.length == 0) {
                return this.jie_dian[i].value;
            }
            this.jie_dian[i].value = str;
        }
        return this;
    };
    
    /** huo_qu_name_zhi()方法,通过元素name值获取指定元素,参数是元素name值,返回元素相同name值对象集合,
     * 循环元素集合,将每次循环到的元素对象添加到 jie_dian属性,适用于获取表单元素
     **/
    feng_zhuang_ku.prototype.huo_qu_name_zhi = function (name) {
        var name_zhi = document.getElementsByName(name);
        for (var i = 0; i < name_zhi.length; i++) {
            this.jie_dian.push(name_zhi[i]);
        }
        return this;
    };
    
    /** shang_jd()方法,获取当前节点同级的上一个节点
     **/
    feng_zhuang_ku.prototype.shang_jd = function () {
        for (var i = 0; i < this.jie_dian.length; i ++) {
            this.jie_dian[i] = this.jie_dian[i].previousSibling;
            if (this.jie_dian[i] == null) throw new Error('找不到上一个同级元素节点!');
            if (this.jie_dian[i].nodeType == 3) this.shang_jd();
        }
        return this;
    };
    
    /** xia_jd()方法,获取当前节点同级的下一个节点
     **/
    feng_zhuang_ku.prototype.xia_jd = function () {
        for (var i = 0; i < this.jie_dian.length; i ++) {
            this.jie_dian[i] = this.jie_dian[i].nextSibling;
            if (this.jie_dian[i] == null) throw new Error('找不到下一个同级元素节点!');
            if (this.jie_dian[i].nodeType == 3) this.xia_jd();
        }
        return this;
    };
    
    /** hq_jd()方法,多个节点时,获取某一个节点,并返回这个节点对象,参数是节点索引
     **/
    feng_zhuang_ku.prototype.hq_jd = function (num) {
        return this.jie_dian[num];
    };
    
    /** sh_jd()方法,多个节点时,获取首个节点,并返回这个节点对象,无参
     **/
    feng_zhuang_ku.prototype.sh_jd = function () {
        return this.jie_dian[0];
    };
    
    /** w_jd()方法,多个节点时,获取末个节点,并返回这个节点对象,无参
     **/
    feng_zhuang_ku.prototype.w_jd = function () {
        return this.jie_dian[this.jie_dian.length - 1];
    };
    
    /** guo_lv_jie_dian()方法,多个节点时,获取某一个节点,并且feng_zhuang_ku对象
     * 参数是要获取jie_dian属性里的对象索引
     **/
    feng_zhuang_ku.prototype.guo_lv_jie_dian = function (num) {
        var element = this.jie_dian[num];
        this.jie_dian = [];
        this.jie_dian[0] = element;
        return this;
    };
    
    /** jd_length()方法,获取一个节点集合的长度
     **/
    feng_zhuang_ku.prototype.jd_length = function () {
        return this.jie_dian.length;
    };
    
    /** hq_suo_yin()方法,获取一个节点在,父节点下,子节点集合里的索引,也就是在集合里的下标
     **/
    feng_zhuang_ku.prototype.hq_suo_yin = function () {
        var children = this.jie_dian[0].parentNode.children;
        for (var i = 0; i < children.length; i++){
            if (this.jie_dian[0] == children[i]) return i;
        }
    };
    
    /** hq_shu_xing_zhi()方法,获取或设置一个节点的属性值
     * 1个参数,获取属性值,参数是属性名称
     * 2个参数,设置属性值,第1个属性名称,第2个属性值
     **/
    feng_zhuang_ku.prototype.hq_shu_xing_zhi = function (shu_xing, zhi) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (arguments.length == 1) {
                return this.jie_dian[i].getAttribute(shu_xing);
            } else if (arguments.length == 2){
                this.jie_dian[i].setAttribute(shu_xing,zhi);
            }
        }
        return this;
    };
    
    /** huo_qu_zi_jie_dian()方法,获取一个元素下的子元素
     * 注意首先要获取到父元素,在使用huo_qu_zi_jie_dian()方法
     * 参数是要获取的,子元素(id值、class值、标签名称)其中一样的字符串方式,
     * 传参方式 '#xxx'( 表示获取id),'.xxx'(表示获取class),'xxx'(表示获取标签)
     **/
    feng_zhuang_ku.prototype.huo_qu_zi_jie_dian = function (str) {
        var lin_shi = [];                                               //临时数组
        for (var i = 0; i < this.jie_dian.length; i++) {               //根据父元素的长度,循环出父元素
            switch (str.charAt(0)) {                                   //判断字符串的第一个字符是什么
                case '#':                                              //说明是id
                    lin_shi.push(this.huo_qu_id(str.substring(1)));    //获取到父元素下的子元素id等于str的标签,将它添加到临时数组
                    break;
                case '.':                                                     //说明是class
                    var tempss = this.huo_qu_class(str.substring(1), this.jie_dian[i]);
                    for (var k = 0; k < tempss.length; k++) {
                        lin_shi.push(tempss[k]);
                    }
                    break;
                default:                                                      //说明是标签名称
                    var temps = this.huo_qu_name(str, this.jie_dian[i]);
                    for (var j = 0; j < temps.length; j++) {
                        lin_shi.push(temps[j]);
                    }
            }
        }
        this.jie_dian = lin_shi;                                               //将临时数组替换成节点数组
        return this;
    };
    
    /**  dom_dom()方法,加载dom页面文档结构后执行函数,不等待图片,音频视频等文件加载
     *  参数是页面文档加载后要执行的函数
     **/
    feng_zhuang_ku.prototype.dom_dom = function (fn) {
        dom_jia_zai(fn);
        return this;
    };
    
    /**------------------------------------------------获取元素标签结束--------------------------------------------**/
    
    
    
    /**------------------------------------------------元素节点操作开始--------------------------------------------**/
    
    /** c_css()方法,给获取到的元素设置ss样式,或者获取css样式,
     * 两个参数:设置样式,参数1样式名称,参数2样式值,设置的行内样式
     * 一个参数:获取样式,参数是样式名称,无法连缀,获取即可用获取行内也可以获取连接
     **/
    feng_zhuang_ku.prototype.c_css = function (attr, value) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (arguments.length == 1) {
                return getStyle(this.jie_dian[i], attr); //getStyle()函数库函数,跨浏览器获取元素Style,样式指定属性
            } else {
                this.jie_dian[i].style[attr] = value;
            }
        }
        return this;
    };
    
    /** shzh_tou_ming_du()方法,给元素设置透明度
     *  参数是要设置的透明度值,为百分比值,如10%,就是10
     **/
    feng_zhuang_ku.prototype.shzh_tou_ming_du = function (zhi) {
        for (var i = 0; i < this.jie_dian.length; i++){
            this.jie_dian[i].style.opacity = zhi / 100;
            this.jie_dian[i].style.filter = 'alpha(opacity='+ zhi +')';
        }
        return this;
    };
    
    /** wen_ben()方法,给获取到的元素设置文本,或者获取文本
     * 有参:设置文本,参数是要设置的文本字符串。
     * 无参:获取文本。无法连缀
     **/
    feng_zhuang_ku.prototype.wen_ben = function (str) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (arguments.length == 0) {
                return this.jie_dian[i].innerHTML;
            }
            this.jie_dian[i].innerHTML = str;
        }
        return this;
    };
    
    /** wen_ben_guo_lv()方法,给获取到的元素设置文本,或者获取文本,会过滤html标签
     * 有参:设置文本,参数是要设置的文本字符串。如果有html标签会自动转换成字符串形式在设置
     * 无参:获取文本。如果有html标签获取后会自动过滤html标签,无法连缀
     **/
    feng_zhuang_ku.prototype.wen_ben_guo_lv = function (str) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (arguments.length == 0) {
                if(typeof this.jie_dian[i].innerText == 'string'){
                    return this.jie_dian[i].innerText;
                }else if (typeof this.jie_dian[i].textContent == 'string'){
                    return this.jie_dian[i].textContent;
                }
            }else if (typeof this.jie_dian[i].innerText == 'string'){
                this.jie_dian[i].innerText = str;
            }else if (typeof this.jie_dian[i].textContent == 'string'){
                this.jie_dian[i].textContent = str;
            }
        }
        return this;
    };
    
    /** tian_jia_class()方法,给获取到的元素添加class属性,参数是class属性值,可以连缀
     **/
    feng_zhuang_ku.prototype.tian_jia_class = function (classname) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (hasClass(this.jie_dian[i], classname)) {   //hasClass()函数库函数,判断一个元素的class属性值是否存在
                this.jie_dian[i].className += ' ' + classname;
            }
        }
        return this;
    };
    
    /** yi_chu_class()方法,给获取到的元素移除class属性,参数是要移除的class属性值,可以连缀
     **/
    feng_zhuang_ku.prototype.yi_chu_class = function (classname) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            if (hasClass(this.jie_dian[i], classname)) {
                this.jie_dian[i].className = this.jie_dian[i].className.replace(new RegExp('(\s|^)' + classname + '(\s|$)'), ' ');
            }
        }
        return this;
    };
    
    /** she_zhi_link_css()方法,设置link连接、或style内嵌、中的CSS样式
     * 在Web应用中,很少用到添加CSS规则和移除CSS规则,一般只用行内和Class;因为添加和删除原本的规则会破坏整个CSS的结构,所以使用需要非常小心。
     * 直接在库对象下使用  如:$().she_zhi_link_css()
     * 四个参数:
     * 参数1,样式表索引位置,就是要操作的样式表位置索引,第几个样式表【数值】
     * 参数2,要添加的选择器名称,【字符串】
     * 参数3,要添加的样式名称和值,如:background:#ff2a16 【字符串】
     * 参数4,将样式和选择器添加到样式表什么位置,【数值】
     **/
    feng_zhuang_ku.prototype.she_zhi_link_css = function (num, selectorText, cssText, position) {
        var sheet = document.styleSheets[num];
        if (typeof sheet.insertRule != 'undefined') {
            sheet.insertRule(selectorText + "{" + cssText + "}", position);
        } else if (typeof sheet.addRule != 'undefined') {
            sheet.addRule(selectorText, cssText, position);
        }
        return this;
    };
    
    /** yi_chu_link_css()方法,移除link连接、或style内嵌、中的CSS样式
     * 在Web应用中,很少用到添加CSS规则和移除CSS规则,一般只用行内和Class;因为添加和删除原本的规则会破坏整个CSS的结构,所以使用需要非常小心。
     * 直接在库对象下使用
     * 两个参数:
     * 参数1,样式表索引位置,就是要操作的样式表位置索引,第几个样式表【数值】
     * 参数2,删除样式表里的第几个选择器【数值】
     **/
    feng_zhuang_ku.prototype.yi_chu_link_css = function (num, position) {
        var sheet = document.styleSheets[num];
        if (typeof sheet.deleteRule != 'undefined') {
            sheet.deleteRule(position);
        } else if (typeof sheet.removeRule) {
            sheet.removeRule(position);
        }
        return this;
    };
    
    
    /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能
     * 注意:有参设置拖拽点区块,只有弹窗的这个拖拽点区块才能拖拽,无参整个弹窗可以拖拽
     * 注意:一般需要在css文件将弹窗元素里的某一个区块光标设置成提示可以拖拽,如:cursor: move; (设置拖拽点)
     * 有一个参数,参数是弹窗元素里的拖拽点区块的字符串class值(设置拖拽点的class值)设置后弹窗元素里的这个拖拽点区块才能拖拽
     **/
    feng_zhuang_ku.prototype.tuo_zhuai = function (tuo_zhuai_dian) {
        if (this.jie_dian.length == 1) {
            var yan_su = null;
            var sum = arguments.length;
            for (var i = 0; i < this.jie_dian.length; i++) {
                yan_su = this.jie_dian[i];
            }
            addEvent(yan_su, 'mousedown', function (e) {
                if (trim(yan_su.innerHTML).length == 0)e.preventDefault();
                var e1 = getEvent(e);  //getEvent()函数库函数,跨浏览器获取事件对象,事件event对象,
                var diffx = e1.clientX - yan_su.offsetLeft;
                var diffy = e1.clientY - yan_su.offsetTop;
                if (sum == 1) {
                    if (e.target.className === tuo_zhuai_dian) {
                        addEvent(document, 'mousemove', move);
                        addEvent(document, 'mouseup', up);
                    }
                } else if (sum == 0) {
                    addEvent(document, 'mousemove', move);
                    addEvent(document, 'mouseup', up);
                }
                function move(e) {
                    var e2 = getEvent(e);
                    var left = e2.clientX - diffx;
                    var top = e2.clientY - diffy;
                    if (left < 0) {
                        left = 0;
                    }else if(left <= gun_dong_tiao_wei_zhi().left){
                        left = gun_dong_tiao_wei_zhi().left;
                    }else if (left > getInner().width + gun_dong_tiao_wei_zhi().left - yan_su.offsetWidth) {
                        left = getInner().width + gun_dong_tiao_wei_zhi().left - yan_su.offsetWidth;
                    }
                    if (top < 0) {
                        top = 0;
                    }else if(top <= gun_dong_tiao_wei_zhi().top){
                        top = gun_dong_tiao_wei_zhi().top;
                    }else if (top > getInner().height + gun_dong_tiao_wei_zhi().top - yan_su.offsetHeight) {
                        top = getInner().height + gun_dong_tiao_wei_zhi().top - yan_su.offsetHeight;
                    }
                    yan_su.style.left = left + 'px';
                    yan_su.style.top = top + 'px';
                    if (typeof yan_su.setCapture != 'undefined') {
                        yan_su.setCapture();
                    }
                }
    
                function up() {
                    removeEvent(document, 'mousemove', move);
                    removeEvent(document, 'mouseup', up);
                    if (typeof yan_su.releaseCapture != 'undefined') {
                        yan_su.releaseCapture();
                    }
                }
            });
        } else {
            alert("将一个弹窗元素实现拖拽功能,只能设置一个弹窗元素,目前jie_dian数组里是多个元素请检查!")
        }
        return this;
    };
    /**------------------------------------------------元素节点操作结束--------------------------------------------**/
    
    
    /**------------------------------------------------元素事件开始--------------------------------------------**/
    
    /** shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码)
     *参数1是移入时的执行函数(包含代码)
     *参数2是移出时的执行函数(包含代码)
     **/
    feng_zhuang_ku.prototype.shu_biao_yi_ru_yi_chu = function (yi_ru, yi_chu) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            addEvent(this.jie_dian[i], 'mouseover', yi_ru);
            addEvent(this.jie_dian[i], 'mouseout', yi_chu);
        }
        return this;
    };
    
    /** xian_shi()方法,设置元素显示,无参
     **/
    feng_zhuang_ku.prototype.xian_shi = function () {
        for (var i = 0; i < this.jie_dian.length; i++) {
            this.jie_dian[i].style.display = 'block';
        }
        return this;
    };
    
    /** yin_cang()方法,设置元素隐藏,无参
     **/
    feng_zhuang_ku.prototype.yin_cang = function () {
        for (var i = 0; i < this.jie_dian.length; i++) {
            this.jie_dian[i].style.display = 'none';
        }
        return this;
    };
    
    /** yuan_su_shi_jian()方,给元素添加一个元素事件
     *  两个参数,参数1事件名称不加on,参数2事件函数
     **/
    feng_zhuang_ku.prototype.yuan_su_shi_jian = function (ming_cheng,fn) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            addEvent(this.jie_dian[i],ming_cheng, fn);
        }
        return this;
    };
    
    /** on_click()方法,给获取到的元素添加一个点击事件,参数是一个匿名函数(包含函数功能),
     * 循环jie_dian属性里的节点,将每次循环的节点添加元素点击事件
     **/
    feng_zhuang_ku.prototype.on_click = function (fu) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            addEvent(this.jie_dian[i], 'click', fu);
        }
        return this;
    };
    
    /** dian_ji_qie_huan()方法,设置点击切换,将元素设置成点击切换,也就是点击目标元素后,循环执行方法里的函数
     * 参数是点击后要执行的函数,可以是多个函数,点击一次循环执行一个函数,从第一个开始,循环完毕后再次循环从第一个开始
     **/
    feng_zhuang_ku.prototype.dian_ji_qie_huan = function () {
        for (var i = 0; i < this.jie_dian.length; i++) {
            (function (jiedian, args) {
                var count = 0;                                          //计数器
                addEvent(jiedian, 'click', function () {                //给对象添加点击事件
                    args[count++ % args.length].call(this);             //点击后计数器数值求于作为下标执行传入的函数,计数器在累加,将对象传入
                });
            })(this.jie_dian[i], arguments);                            //通过arguments接收传入方法的函数
        }
        return this;
    };
    
    /** yuan_su_ju_zhong()方法,将获取到的区块元素居中到页面,
     * 注意:使用此方法时,首先要在css里将目标区块设置成(绝对定位,position: absolute;)
     **/
    feng_zhuang_ku.prototype.yuan_su_ju_zhong = function () {
        if (this.jie_dian.length == 1) {
            var yan_su = null;
            for (var i = 0; i < this.jie_dian.length; i++) {
                yan_su = this.jie_dian[i];
            }
            var y_style = getStyle(yan_su, 'display'); //getStyle()函数库函数,跨浏览器获取元素Style,样式指定属性
            if (y_style === "none") {
                yan_su.style.display = "block";
            }
            var width = yan_su.offsetWidth;
            var height = yan_su.offsetHeight;
            if (y_style === "none") {
                yan_su.style.display = "none";
            }
            var chang_w = getInner().width;
            var chang_h = getInner().height;
            var top = (chang_h - height) / 2 + gun_dong_tiao_wei_zhi().top;
            var left = (chang_w - width) / 2 + gun_dong_tiao_wei_zhi().left;
            for (var ii = 0; ii < this.jie_dian.length; ii++) {
                this.jie_dian[ii].style.top = top + 'px';
                this.jie_dian[ii].style.left = left + 'px';
            }
        } else {
            alert("区块元素页面居中,只能设置一个区块元素,目前jie_dian数组里是多个元素请检查!")
        }
        return this;
    };
    
    /** chuang_kou_shi_jian()方法,浏览器窗口事件,当窗口的大小变化时触发函数
     * 接收一个参数,就是触发时要执行的函数(包含函数功能)
     **/
    feng_zhuang_ku.prototype.chuang_kou_shi_jian = function (fn) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            var yan_su = this.jie_dian[i];
        }
        addEvent(window, 'resize', function () {
            fn();
            if (yan_su.offsetLeft > getInner().width + gun_dong_tiao_wei_zhi().left - yan_su.offsetWidth) {
                yan_su.style.left = getInner().width + gun_dong_tiao_wei_zhi().left - yan_su.offsetWidth + 'px';
                if (yan_su.offsetLeft <= 0 + gun_dong_tiao_wei_zhi().width){
                    yan_su.style.left = 0 + gun_dong_tiao_wei_zhi().left + 'px';
                }
            }
            if (yan_su.offsetTop > getInner().height + gun_dong_tiao_wei_zhi().top - yan_su.offsetHeight) {
                yan_su.style.top = getInner().height + gun_dong_tiao_wei_zhi().top - yan_su.offsetHeight + 'px';
                if (yan_su.offsetTop <= 0 + gun_dong_tiao_wei_zhi().top){
                    yan_su.style.top = 0 + gun_dong_tiao_wei_zhi().top + 'px';
                }
            }
        });
        return this;
    };
    
    /** zhe_zhao_suo_ping()方法,将一个区块元素设置成遮罩锁屏区块
     * 注意:一般需要在css文件将元素设置成隐藏
     **/
    feng_zhuang_ku.prototype.zhe_zhao_suo_ping = function () {
        if (this.jie_dian.length == 1) {
            var yan_su = null;
            for (var i = 0; i < this.jie_dian.length; i++) {
                yan_su = this.jie_dian[i];
            }
            fixedScroll.top = gun_dong_tiao_wei_zhi().top;
            fixedScroll.left = gun_dong_tiao_wei_zhi().left;
            var chang_w = getInner().width;  //getInner()函数库函数,跨浏览器获取浏览器视窗大小
            var chang_h = getInner().height;
            yan_su.style.width = chang_w + gun_dong_tiao_wei_zhi().left + 'px';
            yan_su.style.height = chang_h + gun_dong_tiao_wei_zhi().top + 'px';
            yan_su.style.position = 'absolute';
            yan_su.style.top = '0';
            yan_su.style.left = '0';
            var y_style = getStyle(yan_su, 'display'); //getStyle()函数库函数,跨浏览器获取元素Style,样式指定属性
            if (y_style === "block") {
                addEvent(window, 'scroll', fixedScroll);  //定位滚动条
                gdt_cao_zuo('y');  //隐藏滚动条
            }
        } else {
            alert("遮罩锁屏区块,只能设置一个区块元素,目前jie_dian数组里是多个元素请检查!")
        }
        return this;
    };
    
    /** jie_chu_suo_ping()方法,将一个锁屏区块元素解除锁屏
     * 注意:一般需要在css文件将元素设置成隐藏
     **/
    feng_zhuang_ku.prototype.jie_chu_suo_ping = function () {
        for (var i = 0; i < this.jie_dian.length; i++) {
            this.jie_dian[i].style.display = 'none';
        }
        removeEvent(window, 'scroll', fixedScroll);  //删除定位滚动条
        gdt_cao_zuo('x');  //显示滚动条
        return this;
    };
    
    /**------------------------------------------------元素事件结束--------------------------------------------**/
    
    
    /**------------------------------------------------元素动画开始--------------------------------------------**/
    /**
     * 元素动画说明
     * yi_dong_tou_ming()方法,将一个元素,
     * 1,x将元素横向左移动或者右移动
     * 2, y将元素竖向上移动或者下移动
     * 3,w将元素动画增加或者减少宽度
     * 4,h将元素动画增加或者减少高度
     * 5,o将元素动画增加或者减少透明度
     * 注意:也可以写其他css属性名称(全称),来动画增加或者减少css属性的数值,必须是值为数值的css属性,如:font-size
     * *******************************************
     *
     **/
    
    
    
    
    /** yi_dong_tou_ming()方法,动态改变css属性说明
     * * yi_dong_tou_ming()方法,将一个元素,进行一下动画操作
     * 1,x将元素横向左移动或者右移动
     * 2, y将元素竖向上移动或者下移动
     * 3,w将元素动画增加或者减少宽度
     * 4,h将元素动画增加或者减少高度
     * 5,o将元素动画增加或者减少透明度
     * 注意:也可以写其他css属性名称(全称),来动画增加或者减少css属性的数值,必须是值为数值的css属性,如:font-size
     * *************************************
     *  x将元素横向左移动或者右移动,首先将目标设置定位,position:absolute;
     *  o将元素动画增加或者减少透明度,结合css里元素原始透明度filter: alpha(opacity=0);opacity: 0;
     *  *************************************
     *  yi_dong_tou_ming()方法,参数说明
     *  参数是一个对象如下
     *  yi_dong_tou_ming({
                'attr':'x',        【为动画方式】,   x.为横向移动,y.为竖向移动,w.为增加宽度动画,h.为增加高度动画,o.为透明度动画,【必填】
                                                      注意:也可以写其他css属性名称(全称),来动画增加或者减少css属性的数值,必须是值为数值的css属性,如:font-size
                                                      o.为透明度动画,设置透明度动画时,必须先在css里设置初始透明度如:opacity:1;filter:alpha(opacity=100);
                                                      否则IE9以下无法实现透明度动画
    
                'type':'1',        【动画模式】,     0.匀速模式,1.缓冲模式【可选,默认缓冲】
                'speed':6,         【缓冲速度】,     动画模式为缓冲时设置,【可选,默认为6】,以此值改变跨度.每一次动画动态增加或者减少,实现缓冲效果
    
                'start':50,        【动画起始位置】, 起始的像素或者透明度【可选,默认为对象原始位置】一般不需要传
                                                      注意:动画起始位置,一般按钮动画使用,如果是鼠标触动动画,会不停的初始化,因为鼠标一动就改变了动画起始位置
    
                'target':100,      【目标量】,       就是在原始的像素或者透明度上,增加或者减少到目标量的像素或者透明度【可先,注意目标量不填,增量必填】
                'alter':50,        【增量】,         就是在对象原始的像素或者透明度上,增加或者减少像素或者透明度【可先,注意增量不填,目标量必填】
                'step':7,          【跨度】,         每一次动画增加或者减少的,像素或者透明度,【可选,默认20】
                'danwei':'em',     【属性值单位】     danwei.为属性值单位,也就是以什么单位来计算css属性,如是px还是em等,不传默认px
                't':50 ,           【每次动画时间】, 也就是多少毫秒执行一次动画【可选,默认10】
                fn:function () {   【回调函数,列队】, 回调函数,用于动画执行完毕后执行函数,在回调函数里在写入动画,就是列队动画,也就是一个动画执行完毕后执行第二个动画
    
                }
                mul:{              【同步动画对象】,用于同时要执行多个动画,同步动画属性,属性值为对象,对象里面是,动画方式:目标量,组合的键值对,只能动画方式加目标量的键值对
                                    同步动画,除了动画方式和目标量外,其他的都是在同步动画对象外设置,因为他们是统一的其他参数
                    'w':101,
                    'h':500,
                    'o':30
                }
            });
     **/
    feng_zhuang_ku.prototype.yi_dong_tou_ming = function (obj) {
        for (var i = 0; i < this.jie_dian.length; i++) {
            var element = this.jie_dian[i];
             // attr,为动画方式,
             // x.为横向移动
             // y.为竖向移动
             // w.为增加宽度动画
             // h.为增加高度动画
             // o.为透明度动画
            var attr = obj['attr'] == 'x' ? 'left' : obj['attr'] == 'y' ? 'top' :
                obj['attr'] == 'w' ? 'width' : obj['attr'] == 'h' ? 'height' :
                    obj['attr'] == 'o' ? 'opacity' : obj['attr'] != undefined ? obj['attr'] : 'left';
    
            // start.为动画起始位置,
            // 如果输入了动画起始位置,值就为输入的起始位置,移动动画是像素值(如100),透明度动画是透明度百分比(如50)
            // 如果没输入,默认移动动画获取的对象原始像素位置,透明度动画获取的对象原始透明度,除以100等于原始透明度百分比
            var start = obj['start'] != undefined ? obj['start'] :
                attr == 'opacity' ? parseFloat(getStyle(element, attr)) * 100 :
                    parseInt(getStyle(element, attr));
    
             // t.为每次动画时间,也就是多少毫秒执行一次动画
             // 不传默认,是10毫秒执行一次动画
            var t = obj['t'] != undefined ? obj['t'] : 10;
    
             // step.为跨度,每一次动画增加或者减少的,像素或者透明度
            var step = obj['step'] != undefined ? obj['step'] : 20;
    
            // danwei.为属性值单位,也就是以什么单位来计算css属性,如是px还是em等,不传默认px
            var danwei = obj['danwei'] != undefined ? obj['danwei'] : 'px';
    
             // alter.为增量,就是在对象原始的像素或者透明度上,增加或者减少像素或者透明度
            var alter = obj['alter'];
    
             // target.为目标量,就是在原始的像素或者透明度上,增加或者减少到目标量的像素或者透明度
             // 注意,增量,是在原始上增加或者减少多少,目标量是在原始的基础上增加或者减少到目标
            var target = obj['target'];
    
            //mul,接收的,obj对象里的mul属性,而mul属性是一个对象,由动画方式加目标量组合的键值对,也就是要同步动画的参数
            var mul = obj['mul'];    //接收同步动画(参数对象)
    
             // speed.为缓冲速度,动画模式为缓冲时,以此值改变step.每一次动画动态增加或者减少,实现缓冲效果
             // 不传,默认为6
            var speed = obj['speed'] != undefined ? obj['speed'] : 6;
    
             // type.为动画模式,匀速为匀速模式,缓冲为缓冲模式
             // 不传,默认为缓冲模式
            var type = obj['type'] == 0 ? 'constant' : obj['type'] == 1 ? 'buffer' : 'buffer';
    
            if (alter != undefined && target == undefined) {
                target = alter + start;
            } else if (alter == undefined && target == undefined && mul == undefined) {
                throw new Error('alter增量,或target目标量,或者同步动画对象,必须传一个!');
            }
            if (start > target) step = -step;
    
            if (!isNaN(start)) {
                if (attr == 'opacity') {
                    element.style.opacity = parseInt(start) / 100;
                    element.style.filter = 'alpha(opacity=' + parseInt(start) + ')';
                } else {
                    element.style[attr] = start + danwei;
                }
            }
    
            if (mul == undefined){      //判断如果同步动画对象没有传,说明是单个动画
                mul = {};               //创建mul对象
                mul[attr] = target;     //将单个动画的,动画方式当作对象键,将目标量当作值,组合成键值对到对象里
            }
    
            clearInterval(element.timer);                            //给对每个象创建定时器并停止定时器
            element.timer = setInterval(function () {               //将对象下的定时器开启
                //创建一个布尔值,这个值可以了解对个动画是否执行完毕
                var flag = true;    //表示都执行完毕了
    
                //循环同步动画对象
                for (var i in mul) {
                    attr = i == 'x' ? 'left' : i == 'y' ? 'top' :
                        i == 'w' ? 'width' : i == 'h' ? 'height' :
                            i == 'o' ? 'opacity' : i != undefined ? i : 'left';            //得到同步动画对象里的,动画方式
                    target = mul[i];                                                       //得到同步动画对象里的,目标量
    
                    if (type == 'buffer') {
                        step = attr == 'opacity' ? (target - parseFloat(getStyle(element, attr)) * 100) / speed :
                        (target - parseInt(getStyle(element, attr))) / speed;
                        step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    }
                    if (attr == 'opacity') {
                        if (step == 0) {
                            setOpacity();
                        } else if (step > 0 && Math.abs(parseFloat(getStyle(element, attr)) * 100 - target) <= step) {
                            setOpacity();
                        } else if (step < 0 && (parseFloat(getStyle(element, attr)) * 100 - target) <= Math.abs(step)) {
                            setOpacity();
                        } else {
                            var temp = parseFloat(getStyle(element, attr)) * 100;
                            element.style.opacity = parseInt(temp + step) / 100;
                            element.style.filter = 'alpha(opacity=' + parseInt(temp + step) + ')';
                        }
                        //判断目标值不等于元素当前值,说明动画还没到达目标值,将flag修改成false
                        if (parseInt(target) !=  parseInt(parseFloat(getStyle(element, attr)) * 100)) flag = false;
                    } else {
                        if (step == 0) {
                            setTarget();
                        } else if (step > 0 && Math.abs(parseInt(getStyle(element, attr)) - target) <= step) {
                            setTarget();
                        } else if (step < 0 && (parseInt(getStyle(element, attr)) - target) <= Math.abs(step)) {
                            setTarget();
                        } else {
                            element.style[attr] = parseInt(getStyle(element, attr)) + step + danwei;
                        }
                        //判断目标值不等于元素当前值,说明动画还没到达目标值,将flag修改成false
                        if (parseInt(target) != parseInt(getStyle(element, attr))) flag = false;
                    }
                }
                //判断flag = true;了说明元素的当前值已经达到目标值,可以停止定时器了
                if (flag) {
                    clearInterval(element.timer);       //停止定时器
                    if (obj.fn != undefined)obj.fn();   //判断如果传入了回调函数,动画执行完毕后执行回调函数,列队动画
                }
            }, t);
            function setTarget() {
                element.style[attr] = target + danwei;
            }
            function setOpacity() {
                element.style.opacity = parseInt(target) / 100;
                element.style.filter = 'alpha(opacity=' + parseInt(target) + ')';
            }
        }
        return this;
    };
    /**------------------------------------------------元素动画结束--------------------------------------------**/
    
    
    /**------------------------------------------------插件入口开始--------------------------------------------**/
    /** 插件入口,简单的理解就是通过extend()方法,向此基础库添加一个原型方法
     *  此extend()方法,一般是给插件文件使用的,插件就是通过extend()方法,将插件方法添加到基础库原型的
     *  接收两个参数
     *  参数1是传入要添加的方法名称
     *  参数2是此方法的执行函数(包含代码)
     *  使用方法:$().ext_end(方法名称,方法匿名函数)
     *
     **/
    feng_zhuang_ku.prototype.ext_end = function (name, fn) {
        feng_zhuang_ku.prototype[name] = fn;
    };
    /**------------------------------------------------插件入口结束--------------------------------------------**/
    
    
    /**------------------------------------------------ajax通讯开始--------------------------------------------**/
    
    /** ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据
     *  参数是一个对象{},如下
     *  $().ajax({
                method:'post',                  【method】属性,通讯模式,post为post模式,get为get模式
                url:'hj.php',                   【url】属性,发送数据或请求数据的url地址
                data:{                          【data】属性,是发送内容,是一个对象,里面是键值对形式的发送数据对象
                    'name':'lee',
                    'age':100
                },
                success:function (text) {       【success】属性,是一个回调函数,函数参数是text,会接收到发送或者获取到的数据
                    alert(text);
                },
                async:true                      【async】属性,请求方式,true异步方式,false同步方式
            });
     **/
    feng_zhuang_ku.prototype.Ajax = function (obj) {
        //注意:引入了开源库json2,如果浏览器版本太低不支持JSON对象,通过一个开源库json2来模拟执行,如果支持JSON对象就用JSON对象
        //开源库json2写在函数库里
        //创建XHR对象
        var xhr = (function () {
            if (typeof XMLHttpRequest != 'undefined') {           //判断是否可以直接创建XHR对象,w3c
                return new XMLHttpRequest();                      //如果可以就直接创建XHR对象
            } else if (typeof ActiveXObject != 'undefined') {     //判断IE低版本的3种模式是否支持
                var version = [
                    'MSXML2.XMLHttp.6.0',
                    'MSXML2.XMLHttp.3.0',
                    'MSXML2.XMLHttp'
                ];
                for (var i = 0; version.length; i++) {
                    try {
                        return new ActiveXObject(version[i]);
                    } catch (e) {
                        //跳过
                    }
                }
            } else {
                throw new Error('您的系统或浏览器不支持XHR对象!');   //如果都不支持报错
            }
        })();  //自我执行闭包里的函数,创建XHR对象
    
        //接收对象url地址
        obj.url = obj.url + '?rand=' + Math.random();                 //组合对象传进来的通讯url地址
    
        //接收对象传来的内容,进行名值对编码
        obj.data = (function (data) {
            var arr = [];
            for (var i in data) {
                arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
            }
            return arr.join('&');  //将数组格式化分隔符后返回
        })(obj.data);  //自我执行闭包里的函数
    
        //判断请求方式来
        if (obj.method === 'get') obj.url += obj.url.indexOf('?') == -1 ? '?' + obj.data : '&' + obj.data;
    
        //判断发送模式如果是异步
        if (obj.async === true) {
            //添加一个加载事件
            xhr.onreadystatechange = function () {
                //判断已经接受到全部响应数据,而且可以使用
                if (xhr.readyState == 4) {
                    callback();
                }
            };
        }
        xhr.open(obj.method, obj.url, obj.async);
        if (obj.method === 'post') {
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.send(obj.data);
        } else {
            xhr.send(null);
        }
        if (obj.async === false) {
            callback();
        }
        function callback() {
            if (xhr.status == 200) {
                obj.success(xhr.responseText);            //回调传递参数
            } else {
                alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText);
            }
        }
        return this;
    };
    /**------------------------------------------------ajax通讯结束--------------------------------------------**/
    
    
    /**------------------------------------------------表单序列化开始--------------------------------------------**/
    
    /** xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和value值,无法连缀
     *  参数是要获取指定表单的原生态对象
     *  返回,包含表单数据的对象,如,{表单数据}
     **/
    feng_zhuang_ku.prototype.xu_lie_biao_dan = function (form) {
        var parts = {};
                for (var i = 0; i < form.elements.length; i++) {    //根据表单字段长度循环
                    var filed = form.elements[i];                   //得到没一项表单的字段
                    switch (filed.type) {                           //判断得到字段的属性
                        case undefined:
                        case 'submit':
                        case 'reset':
                        case 'file':
                        case 'button':
                            break;                                   //如果是以上几种的一种直接跳出
                        case 'radio':
                        case 'checkbox':
                            if (!filed.selected) break;              //如果是以上两种,判断是否被勾选,没勾选直接跳出
                        case 'select-one':
                        case 'select-multiple':
                            for (var j = 0; j < filed.options.length; j++) {     //下拉选项
                                var option = filed.options[j];
                                if (option.selected) {
                                    var optvalue = '';
                                    if (option.hasAttribute) {                   //非ie
                                        optvalue = (option.hasAttribute('value') ? option.value : option.text);             //value值存在取value值,value值不存在取text值
                                    } else {  //ie
                                        optvalue = (option.attributes('value').specified ? option.value : option.text);     //value值存在取value值,value值不存在取text值
                                    }
                                    parts[filed.name] = optvalue;                                                           //如果不是以上情况,将表单字段的name值加上value值,添加到对象
                                }
    
                            }
                            break;
                        default:
                            parts[filed.name] = filed.value;                                                                //如果不是以上情况,将表单字段的name值加上value值,添加到对象
                    }
                }
                return parts;
    };
    
    /**------------------------------------------------表单序列化结束--------------------------------------------**/
    
    
    
    
    
    
    
    /**█████████████████████████████████████████████████函数库██████████████████████████████████████████████████████**/
    
    /** 函数库说明:
     * sys浏览器检测对象,对象下有8个属性
     * dom_jia_zai()函数,DOM页面加载函数,等待页面结构加载完毕后就执行函数,不需要等待页面音频视频等文件加载完毕,提高加载速度
     * addEvent()函数库函数,跨浏览器添加事件绑定,注意:传入事件名称时不要on
     * removeEvent()函数库函数,跨浏览器删除事件绑定,注意:传入事件名称时不要on
     * getInner()函数库函数,跨浏览器获取浏览器视窗大小
     * gun_dong_tiao_wei_zhi()函数库函数,获取滚动条头部与浏览器头部的位置,获取底部滚动条与浏览器左边的位置
     * ju_li_liu_lan_qi_tou()函数库函数,跨浏览器获取当前元素的头部与浏览器头部的位置是多少
     * getStyle()函数库函数,跨浏览器获取元素Style,样式指定属性
     * hasClass()函数库函数,判断一个元素的class属性值是否存在
     * yuan_su_da_xiao()函数库函数,获取指定元素的绝对大小(包含边框)
     * getEvent()函数库函数,跨浏览器获取事件对象,事件event对象,
     * preDef()函数库函数,阻止事件默认行为,
     * trim()函数库函数,删除字符串的前后空格
     * scrollTop()函数库函数,滚动条清零,使滚动条无法下拉
     * gdt_cao_zuo()函数库函数,显示和隐藏浏览器滚动条
     * fixedScroll()函数库函数,定位滚动条
     * pd_shuzu()函数库函数,判断一个类容是否存在一个数组中,返回布尔值
     * sh_jd_suo_yin()函数库函数,获取当前节点的上一个节点,在父元素的索引
     * xia_jd_suo_yin()函数库函数,获取当前节点的下一个节点,在父元素的索引
     **/
    /**-----------------------------------------------------------------------------------------------------------------**/
    
    /** sys浏览器检测对象,对象下有8个属性
     * liu_lan_qi属性,检测浏览器名称和版本号,如:alert(sys.liu_lan_qi);
     * xi_tong属性,检测浏览器运行环境,如:alert(sys.xi_tong);
     * ie属性,检测IE浏览器的版本号,返回IE浏览器的版本号
     * firefox属性,检测firefox浏览器的版本号,返回firefox浏览器的版本号
     * chrome属性,检测chrome浏览器的版本号,返回chrome浏览器的版本号
     * opera属性,检测opera浏览器的版本号,返回opera浏览器的版本号
     * safari属性,检测safari浏览器的版本号,返回safari浏览器的版本号
     * webkit属性,检测webkit浏览器的版本号,返回webkit浏览器的版本号
     **/
    (function () {                       //闭包,自我执行
        window.sys = {};                  //全局变量对象,保存浏览器信息
        var ua = navigator.userAgent.toLowerCase();           //获取浏览器信息,并转化成小写
        var s = [];                                           //浏览器信息数组
        /**判断IE浏览器**/
        if ((/msie ([d.]+)/).test(ua)) {                      //IE10以下判断字段为:msie x版本号
            s = ua.match(/msie ([d.]+)/);                    //如果有获取到msie x版本号返回数组
            sys.liu_lan_qi = '浏览器为IE:' + s[1];            //向sys对象添加liu_lan_qi属性,属性值等于获取到的数组第二个元素
            sys.ie = s[1];
        } else if ((/trident/).test(ua)) {                      //ie10以上判断字段为:trident
            s = ua.match(/rv:([d.]+)/);                      //如果有获取到trident字段返回数组
            sys.liu_lan_qi = '浏览器为IE:' + s[1];
            sys.ie = s[1];
        }
        /**判断火狐浏览器**/
        if ((/firefox/([d.]+)/).test(ua)) {                  //火狐判断字段为:firefox
            s = ua.match(/firefox/([d.]+)/);
            sys.liu_lan_qi = '浏览器为firefox:' + s[1];
            sys.firefox = s[1];
        }
        /**判断谷歌浏览器**/
        if ((/chrome/([d.]+)/).test(ua)) {                    //谷歌判断字段为:chrome
            s = ua.match(/chrome/([d.]+)/);
            sys.liu_lan_qi = '浏览器为chrome:' + s[1];
            sys.chrome = s[1];
        }
        /**判断Opera浏览器**/
        if ((/opera/.*version/([d.]+)/).test(ua)) {         //谷歌判断字段为:opera 与 version
            s = ua.match(/opera/.*version/([d.]+)/);
            sys.liu_lan_qi = '浏览器为Opera:' + s[1];
            sys.opera = s[1];
        }
        /**判断safari浏览器**/
        if ((/version/([d.]+).*safari/).test(ua)) {         //谷歌判断字段为:version 与 safari
            s = ua.match(/version/([d.]+).*safari/);
            sys.liu_lan_qi = '浏览器为Opera:' + s[1];
            sys.safari = s[1];
        }
        /**判断webkit浏览器**/
        if ((/webkit/).test(ua)) {                  //webkit判断字段为:webkit
            s = ua.match(/webkit/([d.]+)/);
            sys.liu_lan_qi = '浏览器为webkit:' + s[1];
            sys.webkit = s[1];
        }
        /**判断系统**/
        if (Boolean(navigator.platform)) {
            sys.xi_tong = '环境系统为:' + navigator.platform;
        } else {
            alert("无法检测到环境系统")
        }
    })();
    
    /** dom_jia_zai()函数,DOM页面加载函数,等待页面结构加载完毕后就执行函数,不需要等待页面音频视频等文件加载完毕,提高加载速度
     * 参数是页面结构加载完毕后要执行的函数
     * 一般前写前台js文件时,使用此方法加载DOM页面后执行代码,提高速度
     **/
    function dom_jia_zai(fn) {
        var isReady = false;
        var timer = null;
    
        function doReady() {
            if (timer) clearInterval(timer);
            if (isReady) return;
            isReady = true;
            fn();
        }
    
        if ((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && sys.webkit < 525)) {
            timer = setInterval(function () {
                if (document && document.getElementById && document.getElementsByTagName && document.body) {
                    doReady();
                }
            }, 1);
        } else if (document.addEventListener) {//W3C
            addEvent(document, 'DOMContentLoaded', function () {
                fn();
                removeEvent(document, 'DOMContentLoaded', arguments.callee);
            });
        } else if (sys.ie && sys.ie < 9) {
            var timer = null;
            timer = setInterval(function () {
                try {
                    document.documentElement.doScroll('left');
                    doReady();
                } catch (e) {
                }
            }, 1);
        }
    }
    
    
    /** addEvent()函数库函数,跨浏览器添加事件绑定,注意:传入事件名称时不要on
     * 接收3个参数
     * 参数1要绑定事件的元素对象,
     * 参数2事件名称,也就是什么事件,注意:传入事件名称时不要on
     * 参数3接收的事件执行函数
     * 注意:一个元素对象,执行了多个相同的事件函数时只执行一次,其他的会被忽略,注意是相同的事件函数
     * 说明:
     * 事件函数里的this,代表绑定事件元素对象本身
     * 事件函数里有一个可选参数e,e接收的元素event对象,传入addEvent()后跨浏览器获取到元素event对象,将元素event对象赋值给e
     * 所以事件函数里的e,代表元素event对象,前提是首先要在事件函数传参e后,再在事件函数里调用e,得到元素event对象
     * e.preventDefault()方法,在事件函数里写e.preventDefault()方法,兼容浏览器阻止事件元素对象默认行为,前提在事件函数要传参e
     * e.stopPropagation()方法,在事件函数里写e.stopPropagation()方法,阻止元素对象的父级元素事件冒泡行为,前提在事件函数要传参e
     * e.target属性,在事件函数里写e.target属性,获取到事件对象元素的标签节点(包含一个事件对象里的子节点)
     **/
    function addEvent(obj, type, fn) {
        if (typeof obj.addEventListener != 'undefined') {
            obj.addEventListener(type, fn, false);
        } else {
            if (!obj.events) obj.events = {};                               //创建一个存放事件的哈希表(散列表)
            if (!obj.events[type]) {                                        //第一次执行时执行
                obj.events[type] = [];                                      //创建一个存放事件处理函数的数组
                if (obj['on' + type]) obj.events[type][0] = fn;             //把第一次的事件处理函数先储存到第一个位置上
            } else {
                if (addEvent.equal(obj.events[type], fn)) return false;    //同一个注册函数进行屏蔽,不添加到计数器中
            }
            obj.events[type][addEvent.ID++] = fn;                           //从第二次开始我们用事件计数器来存储
            obj['on' + type] = addEvent.exec;                               //执行事件处理函数
        }
    }
    /*-------------------------------------------------------------------------------------*/
    //为每个事件分配一个计数器
    //JS一切皆为对象,所以addEvent.ID语法正确,实际上是个全局变量
    addEvent.ID = 1;
    addEvent.exec = function (event) {                          //执行事件处理函数
        var e = event || addEvent.fixEvent(window.event);
        var es = this.events[e.type];
        for (var i in es) {
            es[i].call(this, e);
        }
    };
    addEvent.equal = function (es, fn) {                        //同一个注册函数进行屏蔽
        for (var i in es) {
            if (es[i] == fn) return true;
        }
        return false;
    };
    addEvent.fixEvent = function (event) {                      //把IE常用的Event对象配对到W3C中去
        event.preventDefault = addEvent.fixEvent.preventDefault;
        event.stopPropagation = addEvent.fixEvent.stopPropagation;
        event.target = event.srcElement;
        return event;
    };
    addEvent.fixEvent.preventDefault = function () {            //IE阻止默认行为
        this.returnValue = false;
    };
    addEvent.fixEvent.stopPropagation = function () {           //IE取消冒泡
        this.cancelBubble = true;
    };
    /*---------------------------------------------------------------------------------------*/
    
    
    /** removeEvent()函数库函数,跨浏览器删除事件绑定,注意:传入事件名称时不要on
     * 接收3个参数
     * 参数1接收事件绑定时的元素对象
     * 参数2接收事件绑定时的事件名称,也就是什么事件,注意:传入事件名称时不要on
     * 参数3接收事件绑定时的执行函数
     **/
    function removeEvent(obj, type, fn) {
        if (typeof obj.removeEventListener != 'undefined') {
            obj.removeEventListener(type, fn, false);
        } else {
            if (obj.events) {
                for (var i in obj.events[type]) {
                    if (obj.events[type][i] == fn) {
                        delete obj.events[type][i];
                    }
                }
            }
        }
    }
    
    /** getInner()函数库函数,跨浏览器获取浏览器视窗大小
     * 返回一个对象,里面有两个属性
     * width属性,代表浏览器视窗宽度
     * height属性,代表浏览器视窗高度
     **/
    function getInner() {
        if (typeof window.innerWidth != 'undefined') {
            return {
                 window.innerWidth,
                height: window.innerHeight
            }
        } else {
            return {
                 document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            }
        }
    }
    
    /** gun_dong_tiao_wei_zhi()函数库函数,获取滚动条头部与浏览器头部的位置,获取底部滚动条与浏览器左边的位置
     * 无参
     * 返回一个对象
     * 对象有两个属性
     * top,返回,滚动条头部与浏览器头部的位置
     * left,返回,滚动条底部与浏览器底部的位置
     **/
    function gun_dong_tiao_wei_zhi() {
        return{
            top:document.documentElement.scrollTop || document.body.scrollTop,
            left:document.documentElement.scrollLeft || document.body.scrollLeft
        };
    }
    
    /** ju_li_liu_lan_qi_tou()函数库函数,跨浏览器获取当前元素的头部与浏览器头部的位置是多少
     *  参数是要获取的元素对象
     **/
    function ju_li_liu_lan_qi_tou(element) {
        var top = element.offsetTop;
        var parent = element.offsetParent;
        while (parent != null){
            top += parent.offsetTop;
            parent = parent.offsetParent;
        }
        return top;
    }
    
    /** getStyle()函数库函数,跨浏览器获取元素Style,样式指定属性
     * 两个参数
     * 参数1接收元素对象
     * 参数2接收css样式名称
     * 返回指定元素的指定样式值
     **/
    function getStyle(jie_dian, attr) {
        var value;
        if (typeof window.getComputedStyle != 'undefined') {//W3C
            value = window.getComputedStyle(jie_dian, null)[attr];
        } else if (typeof jie_dian.currentStyle != 'undeinfed') {//IE
            value = jie_dian.currentStyle[attr];
        }
        return value;
    }
    
    /** hasClass()函数库函数,判断一个元素的class属性值是否存在
     * 两个参数
     * 参数1接收元素对象
     * 参数2接收class属性值
     * 返回指定元素的class属性值是否存在,
     **/
    function hasClass(jie_dian, className) {
        return jie_dian.className.match(new RegExp('(\s|^)' + className + '(\s|$)'));
    }
    
    /** yuan_su_da_xiao()函数库函数,获取指定元素的绝对大小(包含边框)
     * 接收一个参数,参数是元素对象
     * 返回一个对象,里面有两个属性
     * width属性,元素的宽度
     * height属性,元素的高度
     **/
    function yuan_su_da_xiao(jie_dian) {
        return {
             jie_dian.offsetWidth,
            height: jie_dian.offsetHeight
        }
    }
    
    /** getEvent()函数库函数,跨浏览器获取事件对象,事件event对象,
     * 这个对象包含着所有与事件有关的信息。包括导致事件的元素、事件的类型、以及其它与特定事件相关的信息。
     * 接收一个参数,参数是事件函数的形式参数,也就是事件函数的形式参数接收到的event对象
     * 返回event对象,
     **/
    function getEvent(event) {
        return event || window.event;
    }
    
    /** preDef()函数库函数,阻止事件默认行为,
     * 接收一个参数,参数是事件函数的形式参数,也就是事件函数的形式参数接收到的event对象
     **/
    function preDef(event) {
        var e = getEvent(event);
        if (typeof e.preventDefault != 'undefined') {//W3C
            e.preventDefault();
        } else {//IE
            e.returnValue = false;
        }
    }
    
    /** trim()函数库函数,删除字符串的前后空格
     * 接收一个参数,参数是要删除前后空格的字符串
     **/
    function trim(str) {
        return str.replace(/(^s*)|(s*$)/g, '');
    }
    
    /** scrollTop()函数库函数,滚动条清零,使滚动条无法下拉
     * 无参
     **/
    function scrollTop() {
        document.documentElement.scrollTop = 0;
        document.body.scrollTop = 0;
    }
    
    /** gdt_cao_zuo()函数库函数,显示和隐藏浏览器滚动条
     * 有参,x为显示滚动条,y为隐藏滚动条
     **/
    function gdt_cao_zuo(zhi) {
        if (zhi == 'x'){
            parseFloat(sys.firefox) < 4 ? document.body.style.overflow = 'auto' : document.documentElement.style.overflow = 'auto';
        }else if(zhi == 'y'){
            parseFloat(sys.firefox) < 4 ? document.body.style.overflow = 'hidden' : document.documentElement.style.overflow = 'hidden';
        }else {
            alert('gdt_cao_zuo()函数库函数,参数不正确');
        }
    }
    
    /** fixedScroll()函数库函数,定位滚动条
     *  fixedScroll.left参数,是外部通过fixedScroll属性方式传递的,如外部fixedScroll.left = getScroll().left;
     **/
    function fixedScroll() {
        setTimeout(function () {
            window.scrollTo(fixedScroll.left, fixedScroll.top);
        }, 100);
    }
    
    /** pd_shuzu()函数库函数,判断一个类容是否存在一个数组中,返回布尔值
     * 参数1判断的数组,参数2判断的内容
     **/
    function pd_shuzu(shuzu, value) {
        for (var i in shuzu) {
            if (shuzu[i] === value) return true;
        }
        return false;
    }
    
    /** sh_jd_suo_yin()函数库函数,获取当前节点的上一个节点,在父元素的索引
     *  参数1,当前元素在父元素的索引
     *  参数2,父元素原生对象
     *  如果当前索引是开始位置0,返回的总索引减一
     *  如果当前索引是结束位置,返回的当前索引减一
     **/
    function sh_jd_suo_yin(suoy,fjid) {
        var length = fjid.children.length;    //获取父节点里所有子节点的长度
        if (suoy == 0) return length - 1;
        return parseInt(suoy) - 1;
    }
    
    /** xia_jd_suo_yin()函数库函数,获取当前节点的下一个节点,在父元素的索引
     *  参数1,当前元素在父元素的索引
     *  参数2,父元素原生对象
     *  如果当前索引是开始位置0,返回的当前索引减一
     *  如果当前索引是结束位置,返回0
     **/
    function xia_jd_suo_yin(suoy,fjid) {
        var length = fjid.children.length;    //获取父节点里所有子节点的长度
        if (suoy == length - 1) return 0;
        return parseInt(suoy) + 1;
    }
    
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃开源库json2开始▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    
    /** json2.js 开源库json2,
     *  如果浏览器版本太低不支持JSON对象,通过一个开源库json2.js来模拟执行,如果支持JSON对象就用JSON对象
     **/
    
    if (typeof JSON !== 'object') {
        JSON = {};
    }
    (function () {
        'use strict';
        function f(n) {
            return n < 10 ? '0' + n : n;
        }
    
        if (typeof Date.prototype.toJSON !== 'function') {
            Date.prototype.toJSON = function (key) {
                return isFinite(this.valueOf())
                    ? this.getUTCFullYear() + '-' +
                f(this.getUTCMonth() + 1) + '-' +
                f(this.getUTCDate()) + 'T' +
                f(this.getUTCHours()) + ':' +
                f(this.getUTCMinutes()) + ':' +
                f(this.getUTCSeconds()) + 'Z'
                    : null;
            };
            String.prototype.toJSON =
                Number.prototype.toJSON =
                    Boolean.prototype.toJSON = function (key) {
                        return this.valueOf();
                    };
        }
        var cx = /[u0000u00adu0600-u0604u070fu17b4u17b5u200c-u200fu2028-u202fu2060-u206fufeffufff0-uffff]/g,
            escapable = /[\"x00-x1fx7f-x9fu00adu0600-u0604u070fu17b4u17b5u200c-u200fu2028-u202fu2060-u206fufeffufff0-uffff]/g,
            gap,
            indent,
            meta = {    // table of character substitutions
                '': '\b',
                '	': '\t',
                '
    ': '\n',
                'f': '\f',
                '
    ': '\r',
                '"': '\"',
                '\': '\\'
            },
            rep;
    
        function quote(string) {
            escapable.lastIndex = 0;
            return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string'
                    ? c
                    : '\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' : '"' + string + '"';
        }
    
        function str(key, holder) {
            var i,          // The loop counter.
                k,          // The member key.
                v,          // The member value.
                length,
                mind = gap,
                partial,
                value = holder[key];
            if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
                value = value.toJSON(key);
            }
            if (typeof rep === 'function') {
                value = rep.call(holder, key, value);
            }
            switch (typeof value) {
                case 'string':
                    return quote(value);
                case 'number':
                    return isFinite(value) ? String(value) : 'null';
                case 'boolean':
                case 'null':
                    return String(value);
                case 'object':
                    if (!value) {
                        return 'null';
                    }
                    gap += indent;
                    partial = [];
                    if (Object.prototype.toString.apply(value) === '[object Array]') {
                        length = value.length;
                        for (i = 0; i < length; i += 1) {
                            partial[i] = str(i, value) || 'null';
                        }
                        v = partial.length === 0
                            ? '[]'
                            : gap
                            ? '[
    ' + gap + partial.join(',
    ' + gap) + '
    ' + mind + ']'
                            : '[' + partial.join(',') + ']';
                        gap = mind;
                        return v;
                    }
                    if (rep && typeof rep === 'object') {
                        length = rep.length;
                        for (i = 0; i < length; i += 1) {
                            if (typeof rep[i] === 'string') {
                                k = rep[i];
                                v = str(k, value);
                                if (v) {
                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);
                                }
                            }
                        }
                    } else {
                        for (k in value) {
                            if (Object.prototype.hasOwnProperty.call(value, k)) {
                                v = str(k, value);
                                if (v) {
                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);
                                }
                            }
                        }
                    }
                    v = partial.length === 0
                        ? '{}'
                        : gap
                        ? '{
    ' + gap + partial.join(',
    ' + gap) + '
    ' + mind + '}'
                        : '{' + partial.join(',') + '}';
                    gap = mind;
                    return v;
            }
        }
    
        if (typeof JSON.stringify !== 'function') {
            JSON.stringify = function (value, replacer, space) {
                var i;
                gap = '';
                indent = '';
                if (typeof space === 'number') {
                    for (i = 0; i < space; i += 1) {
                        indent += ' ';
                    }
                } else if (typeof space === 'string') {
                    indent = space;
                }
                rep = replacer;
                if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                    typeof replacer.length !== 'number')) {
                    throw new Error('JSON.stringify');
                }
                return str('', {'': value});
            };
        }
        if (typeof JSON.parse !== 'function') {
            JSON.parse = function (text, reviver) {
                var j;
    
                function walk(holder, key) {
                    var k, v, value = holder[key];
                    if (value && typeof value === 'object') {
                        for (k in value) {
                            if (Object.prototype.hasOwnProperty.call(value, k)) {
                                v = walk(value, k);
                                if (v !== undefined) {
                                    value[k] = v;
                                } else {
                                    delete value[k];
                                }
                            }
                        }
                    }
                    return reviver.call(holder, key, value);
                }
    
                text = String(text);
                cx.lastIndex = 0;
                if (cx.test(text)) {
                    text = text.replace(cx, function (a) {
                        return '\u' +
                            ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                    });
                }
                if (/^[],:{}s]*$/
                        .test(text.replace(/\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                            .replace(/"[^"\
    
    ]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g, ']')
                            .replace(/(?:^|:|,)(?:s*[)+/g, ''))) {
                    j = eval('(' + text + ')');
                    return typeof reviver === 'function'
                        ? walk({'': j}, '')
                        : j;
                }
                throw new SyntaxError('JSON.parse');
            };
        }
    }());
    /**▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃开源库json2结束▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃**/
    
    /**█████████████████████████████████████████████████函数库██████████████████████████████████████████████████████**/
  • 相关阅读:
    SRCNN
    java(1)
    装机、UEFI双系统安装
    iOS-技术细节整理
    iOS-Hello World
    iOS-初识swift
    21天学习caffe(二)
    21天学习caffe(一)
    深度学习(一)
    Mysql 5.7 windows安装 zip安装
  • 原文地址:https://www.cnblogs.com/adc8868/p/6498417.html
Copyright © 2020-2023  润新知