• 日常积累 web.js


    var V = { };
    var AP = ap = Array.prototype;
    var OP = op = Object.prototype;
    var objEqual =  V.objEqual = function(objA, objB){
    
        if (typeof arguments[0] != typeof arguments[1])
            return false;
    
        //数组
        if (arguments[0] instanceof Array){
            if (arguments[0].length != arguments[1].length)
                return false;
            
            var allElementsEqual = true;
            for (var i = 0; i < arguments[0].length; ++i){
                if (typeof arguments[0][i] != typeof arguments[1][i]){
                    return false;
                }
    
                if (typeof arguments[0][i] == 'number' && typeof arguments[1][i] == 'number'){
                    allElementsEqual = (arguments[0][i] == arguments[1][i]);
                }
                else{
                    allElementsEqual = arguments.callee(arguments[0][i], arguments[1][i]);            //递归判断对象是否相等                
                }
            }
            return allElementsEqual;
        }
        
        //对象
        if (arguments[0] instanceof Object && arguments[1] instanceof Object){
            var result = true;
            var attributeLengthA = 0, attributeLengthB = 0;
            for (var o in arguments[0]){
                //判断两个对象的同名属性是否相同(数字或字符串)
                if (typeof arguments[0][o] == 'number' || typeof arguments[0][o] == 'string'){
                    result = eval("arguments[0]['" + o + "'] == arguments[1]['" + o + "']");
                }
                else {
                    //如果对象的属性也是对象,则递归判断两个对象的同名属性
                    //if (!arguments.callee(arguments[0][o], arguments[1][o]))
                    if (!arguments.callee(eval("arguments[0]['" + o + "']"), eval("arguments[1]['" + o + "']"))){
                        result = false;
                        return result;
                    }
                }
                ++attributeLengthA;
            }
            
            for (var o in arguments[1]) {
                ++attributeLengthB;
            }
            
            //如果两个对象的属性数目不等,则两个对象也不等
            if (attributeLengthA != attributeLengthB){
                result = false;
            }
            return result;
        }
        return arguments[0] == arguments[1];
    };
    
    var objIndexOf = V.objIndexOf = AP.objIndexOf = function(arr, obj){
        if(arguments.length == 1){
            if(!(this instanceof Array)){
                return "参数不合法";
            }
            for (var i = 0; i < this.length; i++) {
                if(objEqual(this[i],arguments[0])){
                    return i;
                }
            }
        }else{
            if(!(arr instanceof Array)){
                return "参数不合法";
            }
            for (var i = 0; i < arr.length; i++) {
                if(objEqual(arr[i], obj)){
                    return i;
                }
            }
        }
        return -1 ;
    };
    
    var hasContains = V.hasContains = AP.hasContains  = function (arr, obj){
        if(arguments.length == 1){
            return (this.objIndexOf(arguments[0]) != -1) ;
        }else{
            return (objIndexOf(arr, obj) != -1) ;
        }
    };
    
    var removeObj = V.removeObj  = AP.removeObj = function (arr, obj){
        if(arguments.length == 1){
            if(this.hasContains(arguments[0])){
                var nindex = this.objIndexOf(arguments[0]);
                this.splice(nindex, 1);
                return this;
            }
        }else{
            if(hasContains(arr, obj)){
                var nindex = objIndexOf(arr, obj);
                arr.splice(nindex, 1);
                return arr;
            }
        }
    };
    
    var removeAt = V.removeAt = AP.removeAt = function(arr,index){
        if(arguments.length == 1){
            this.splice(arguments[0],1);
            return this;
        }else{
            arr.splice(index, 1);
            return arr;
        }
    };
    
    
    
    var isArray = V.isArray = Array.isArray || function(object){ return object instanceof Array };
    var isFunction = V.isFunction = function(value) {
        return type(value) == "function";
    };
    
    var type = V.type = function(obj) {
        var class2type = {};
        return obj == null ? String(obj) :
        class2type[toString.call(obj)] || "object";
    };
    
    var isObject = function(obj){
        return type(obj) == "object";
    };
    
    
    var objExtend = V.objExtend = function(target, source, deep){
        for (var p in source) {
            if (source.hasOwnProperty(p)) {
                target[p] = source[p];
            }
        }
    };
    
    if(!AP.indexOf){
        AP.indexOf = function(obj){
            return objIndexOf(this, obj);
        }
    }
    
    var filter = V.filter = function(arr,callback){
        var narr = [];
    
        for(var i = 0; i < arr.length; i++){
            if (i in arr) {
                var val = arr[i]; // in case fun mutates this
               /* if (callback.call(arguments[1], val)){
                    narr.push(val);
                }*/
                if (callback(val)){
                    narr.push(val);
                }
            }
        }
        return narr;
    };
    
    AP.contains =  function(obj,props){
        /*var equals = true;
        for(var i = 0;i < this.length;i++){
            var thisObj = this[i];
    
            for(var j = 0;j < props.length;j++){
                var prop = props[j];
                equals = obj[prop] == thisObj[prop]?true:false;
                if(!equals){
                    break;
                }
            }
            if(equals){
                break;
            }
        }
        return equals;*/
        return (this.objIndexOf(arguments[0]) != -1) ;
    };
    
    
    /**
     * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数
     * 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回
     {%example
     <script>
     var a = [1,2,3,4].each(function(x){return x > 2 ? x : null});
     var b = [1,2,3,4].each(function(x){return x < 0 ? x : null});
     alert(a);
     alert(b);
     </script>
     %}
     * @param {Function} fn 进行迭代判定的函数
     * @param more ... 零个或多个可选的用户自定义参数
     * @returns {Array} 结果集,如果没有结果,返回空集
     */
    AP.each = function(fn){
        fn = fn || Function.k;
        var narr = [];
        var args = AP.slice.call(arguments, 1);
        for(var i=0; i<this.length; i++){
            var res = fn.apply(this,[this[i],i].concat(args));
            if(res != null){
                narr.push(res);
            }
        }
        return narr;
    };
    
    /**
     * 得到一个数组不重复的元素集合
    
     * 唯一化一个数组
     * @returns {Array} 由不重复元素构成的数组
     */
    AP.unique = function(){
        var ra = new Array();
        for(var i = 0; i < this.length; i ++){
            if(!ra.hasContains(this[i])){
                ra.push(this[i]);
            }
        }
        return ra;
    };
    
    /**
     * 求两个集合的补集
     {%example
     <script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.complement(a,b));
     </script>
     %}
     * @param {Array} a 集合A
     * @param {Array} b 集合B
     * @returns {Array} 两个集合的补集
     */
    Array.complement = function(a, b){
        return Array.minus(Array.union(a, b),Array.intersect(a, b));
    };
    
    /**
     * 求两个集合的交集
     {%example
     <script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.intersect(a,b));
     </script>
     %}
     * @param {Array} a 集合A
     * @param {Array} b 集合B
     * @returns {Array} 两个集合的交集
     */
    Array.intersect = function(a, b){
        return a.unique().each(function(o){return b.contains(o) ? o : null});
    };
    
    /**
     * 求两个集合的差集
     {%example
     <script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.minus(a,b));
     </script>
     %}
     * @param {Array} a 集合A
     * @param {Array} b 集合B
     * @returns {Array} 两个集合的差集
     */
    Array.minus = function(a, b){
        return a.unique().each(function(o){return b.contains(o) ? null : o});
    };
    
    /**
     * 求两个集合的并集
     {%example
     <script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.union(a,b));
     </script>
     %}
     * @param {Array} a 集合A
     * @param {Array} b 集合B
     * @returns {Array} 两个集合的并集
     */
    Array.union = function(a, b){
        return a.concat(b).unique();
    };
    
    // 比较两个 数组 是否 相等
    Array.prototype.compare = function(testArr) {
        if (this.length != testArr.length) return false;
        for (var i = 0; i < testArr.length; i++) {
            if (this[i].compare) {
                if (!this[i].compare(testArr[i])) return false;
            }
            if (this[i] !== testArr[i]) return false;
        }
        return true;
    };
    
    // 数组插入
    Array.prototype.insertAt = function($value, $index) {
        if($index < 0)
            this.unshift($value);
        else if($index >= this.length)
            this.push($value);
        else
            this.splice($index, 0, $value);
    };
    
    
    
    
    /**
     * 根据数组的下标来删除元素
     */
    Array.prototype.removeByIndex=function($n) {
        if($n<0){ //如果n<0,则不进行任何操作。
            return this;
        }else{
            return this.slice(0,$n).concat(this.slice($n+1,this.length));
        }
    }
    //依赖indexOf
    Array.prototype.remove = function($value)
    {
        var $index = this.indexOf($value);
    
        if($index != -1)
            this.splice($index, 1);
    }
    
    Array.prototype.removeAll = function()
    {
        while(this.length > 0)
            this.pop();
    }
    
    Array.prototype.replace = function($oldValue, $newValue)
    {
        for(var $i=0; $i<this.length; $i++)
        {
            if(this[$i] == $oldValue)
            {
                this[$i] = $newValue;
                return;
            }
        }
    }
    
    Array.prototype.swap = function($a, $b)
    {
        if($a == $b)
            return;
    
        var $tmp = this[$a];
        this[$a] = this[$b];
        this[$b] = $tmp;
    }
    Array.prototype.max = function() {
        return Math.max.apply({}, this);
    }
    Array.prototype.min = function() {
        return Math.min.apply({}, this);
    }
    
    
    // JS创建新对象,扩展对象和拷贝对象方法的实现
    /*(function(exports){
        var mObject=(function(){
            return {
                //以参数作为原型,创建一个新的对象
                fCreate:function(oProto){
                    var F=function(){};
                    F.prototype=oProto;
                    return new F();
                },
                //扩展一个原有对象
                fExtend:function(o,oAdded){
                    for(var i in oAdded)
                    {
                        o[i]=oAdded[i];
                    }
                },
                //深拷贝一个对象
                fCopy:function(o){
                    var oRes;
                    if(o instanceof Array)
                    {
                        oRes=[];
                    }
                    else if(o instanceof Object){
                        oRes={};
                    }
                    else{
                        return o;
                    }
                    for(var i in o)
                    {
                        if(typeof o[i] !='object')
                        {
                            oRes[i]=o[i];
                        }
                        else{
                            oRes[i]=arguments.callee(o[i]);
                        }
                    }
                    return oRes;
                }
            };
        })();
        exports.mObject=mObject;
    })(window);*/
    
    
    
    
    
    
    
    
    if(typeof String.prototype.ltrim=='undefined'){
        String.prototype.ltrim = function(){
            var s = this;
            s = s.replace(/^s*/g, '');
            return s;
        }
    }
    
    if(typeof String.prototype.rtrim=='undefined'){
        String.prototype.rtrim = function(){
            var s = this;
            s = s.replace(/s*$/g, '');
            return s;
        }
    }
    
    if(typeof String.prototype.trim=='undefined'){
        String.prototype.trim = function(){
            return this.ltrim().rtrim();
        }
    }
    
    if(typeof String.prototype.htmlEncode=='undefined'){
        String.prototype.htmlEncode = function(encodeNewLine){//encodeNewLine:是否encode换行符
            var s = this;
            s = s.replace(/&/g, '&amp;');
            s = s.replace(/</g, '&lt;');
            s = s.replace(/>/g, '&gt;');
            s = s.replace(/'/g, '&quot;');
            if(encodeNewLine){
                s = s.replace(/
    /g, '<br />');
                s = s.replace(/
    /g, '<br />');
                s = s.replace(/
    /g, '<br />');
            }
            return s;
        }
    }
    
    
    function cloneObj(oldObj) { //复制对象方法
        if (typeof(oldObj) != 'object') return oldObj;
        if (oldObj == null) return oldObj;
        var newObj = Object();
        for (var i in oldObj)
            newObj[i] = cloneObj(oldObj[i]);
        return newObj;
    }
    
    function extendObj() { //扩展对象
        var args = arguments;//将传递过来的参数数组赋值给args变量
        if (args.length < 2) return;
        var temp = cloneObj(args[0]); //调用复制对象方法
        for (var n = 1; n < args.length; n++) {
            for (var i in args[n]) {
                temp[i] = args[n][i];
            }
        }
        return temp;
    }
    
    
    // es5-safe 模块
    /*Function.prototype.bind
    Object.create
    Object.keys
    Array.isArray
    Array.prototype.forEach
    Array.prototype.map
    Array.prototype.filter
    Array.prototype.every
    Array.prototype.some
    Array.prototype.reduce
    Array.prototype.reduceRight
    Array.prototype.indexOf
    Array.prototype.lastIndexOf
    String.prototype.trim
    Date.now*/
    
    
    if (!Array.prototype.every){
        Array.prototype.every = function(fun /*, thisp*/) {
            var len = this.length;
            if (typeof fun != "function")
                throw new TypeError();
    
            var thisp = arguments[1];
            for (var i = 0; i < len; i++)
            {
                if (i in this &&
                    !fun.call(thisp, this[i], i, this))
                    return false;
            }
    
            return true;
        };
    }
    if (!Array.prototype.filter) {
        Array.prototype.filter = function(fun /*, thisp*/) {
            var len = this.length;
            if (typeof fun != "function")
                throw new TypeError();
    
            var res = new Array();
            var thisp = arguments[1];
            for (var i = 0; i < len; i++) {
                if (i in this) {
                    var val = this[i]; // in case fun mutates this
                    if (fun.call(thisp, val, i, this))
                        res.push(val);
                }
            }
    
            return res;
        };
    }
    if (!Array.prototype.forEach)
    {
        Array.prototype.forEach = function(fun /*, thisp*/)
        {
            var len = this.length;
            if (typeof fun != "function")
                throw new TypeError();
    
            var thisp = arguments[1];
            for (var i = 0; i < len; i++)
            {
                if (i in this)
                    fun.call(thisp, this[i], i, this);
            }
        };
    }
    if (!Array.prototype.map)
    {
        Array.prototype.map = function(fun /*, thisp*/)
        {
            var len = this.length;
            if (typeof fun != "function")
                throw new TypeError();
    
            var res = new Array(len);
            var thisp = arguments[1];
            for (var i = 0; i < len; i++)
            {
                if (i in this)
                    res[i] = fun.call(thisp, this[i], i, this);
            }
    
            return res;
        };
    }
    if (!Array.prototype.some)
    {
        Array.prototype.some = function(fun /*, thisp*/)
        {
            var len = this.length;
            if (typeof fun != "function")
                throw new TypeError();
    
            var thisp = arguments[1];
            for (var i = 0; i < len; i++)
            {
                if (i in this &&
                    fun.call(thisp, this[i], i, this))
                    return true;
            }
    
            return false;
        };
    }
    Array.prototype.sortNum = function() {
        return this.sort( function (a,b) { return a-b; } );
    }
    
    
    
    if(typeof Object.create !== "function"){
        Object.create = function (o) {
            function F(){};
            F.property = o;
            return new F();
        }
    }
    
    var Model = {
        inherited: function(){},
        created: function(){},
        prototype: {
            init: function(){}
        },
        create: function(){
            var object = Object.create(this);
            object.parent = this;
            object.prototype = object.fn = Object.create(this.prototype);
            object.created();
            this.inherited(object);
            return object;
        },
        init: function(){
            var instance = Object.create(this.prototype);
            instance.parent = this;
            instance.init.apply(instance, arguments);
            return instance;
        }
    };
    
    objExtend(Model, {
        find: function(){}
    });
    
    objExtend(Model.prototype,{
        init: function(atts){
            if(atts){
                this.load(atts);
            }
        },
        load: function(attr){
            for(var name in attr)
                this[name] = attr[name];
        }
    });
    
    
    
    var modelStore = V.modelStore = function(){
    
    }
    
    
    var assert = function(value, msg){
        if(!value){
            throw(msg || (value + " does not equal true"));
        }
    };
    
    var assertEqual = function(val1, val2, msg) {
        if (val1 !== val2){
            throw(msg || (val1 + " does not equal " + val2));
        }
    };
    
    // 清除两边的空格
    String.prototype.trim = function() {
        return this.replace(/(^s*)|(s*$)/g, '');
    };
    // 合并多个空白为一个空白
    String.prototype.ResetBlank = function() {
        var regEx = /s+/g;
        return this.replace(regEx, ' ');
    };
    
    // 保留数字
    String.prototype.GetNum = function() {
        var regEx = /[^d]/g;
        return this.replace(regEx, '');
    };
    
    // 保留中文
    String.prototype.GetCN = function() {
        var regEx = /[^u4e00-u9fa5uf900-ufa2d]/g;
        return this.replace(regEx, '');
    };
    
    // String转化为Number
    String.prototype.ToInt = function() {
        return isNaN(parseInt(this)) ? this.toString() : parseInt(this);
    };
    
    // 得到字节长度
    String.prototype.GetLen = function() {
        var regEx = /^[u4e00-u9fa5uf900-ufa2d]+$/;
        if (regEx.test(this)) {
            return this.length * 2;
        } else {
            var oMatches = this.match(/[x00-xff]/g);
            var oLength = this.length * 2 - oMatches.length;
            return oLength;
        }
    };
    
    // 获取文件全名
    String.prototype.GetFileName = function() {
        var regEx = /^.*/([^/?]*).*$/;
        return this.replace(regEx, '$1');
    };
    
    // 获取文件扩展名
    String.prototype.GetExtensionName = function() {
        var regEx = /^.*/[^/]*(.[^.?]*).*$/;
        return this.replace(regEx, '$1');
    };
    
    //替换所有
    String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) {
        if (!RegExp.prototype.isPrototypeOf(reallyDo)) {
            return this.replace(new RegExp(reallyDo, (ignoreCase ? "gi" : "g")), replaceWith);
        } else {
            return this.replace(reallyDo, replaceWith);
        }
    };
    //格式化字符串 add By 刘景宁 2010-12-09
    String.Format = function() {
        if (arguments.length == 0) {
            return '';
        }
    
        if (arguments.length == 1) {
            return arguments[0];
        }
    
        var reg = /{(d+)?}/g;
        var args = arguments;
        var result = arguments[0].replace(reg, function($0, $1) {
            return args[parseInt($1) + 1];
        });
        return result;
    };
    
    // 数字补零
    Number.prototype.LenWithZero = function(oCount) {
        var strText = this.toString();
        while (strText.length < oCount) {
            strText = '0' + strText;
        }
        return strText;
    };
    
    // Unicode还原
    Number.prototype.ChrW = function() {
        return String.fromCharCode(this);
    };
    
    // 数字数组由小到大排序
    Array.prototype.Min2Max = function() {
        var oValue;
        for (var i = 0; i < this.length; i++) {
            for (var j = 0; j <= i; j++) {
                if (this[i] < this[j]) {
                    oValue = this[i];
                    this[i] = this[j];
                    this[j] = oValue;
                }
            }
        }
        return this;
    };
    
    // 数字数组由大到小排序
    Array.prototype.Max2Min = function() {
        var oValue;
        for (var i = 0; i < this.length; i++) {
            for (var j = 0; j <= i; j++) {
                if (this[i] > this[j]) {
                    oValue = this[i];
                    this[i] = this[j];
                    this[j] = oValue;
                }
            }
        }
        return this;
    };
    
    // 获得数字数组中最大项
    Array.prototype.GetMax = function() {
        var oValue = 0;
        for (var i = 0; i < this.length; i++) {
            if (this[i] > oValue) {
                oValue = this[i];
            }
        }
        return oValue;
    };
    
    // 获得数字数组中最小项
    Array.prototype.GetMin = function() {
        var oValue = 0;
        for (var i = 0; i < this.length; i++) {
            if (this[i] < oValue) {
                oValue = this[i];
            }
        }
        return oValue;
    };
    
    // 获取当前时间的中文形式
    Date.prototype.GetCNDate = function() {
        var oDateText = '';
        oDateText += this.getFullYear().LenWithZero(4) + new Number(24180).ChrW();
        oDateText += this.getMonth().LenWithZero(2) + new Number(26376).ChrW();
        oDateText += this.getDate().LenWithZero(2) + new Number(26085).ChrW();
        oDateText += this.getHours().LenWithZero(2) + new Number(26102).ChrW();
        oDateText += this.getMinutes().LenWithZero(2) + new Number(20998).ChrW();
        oDateText += this.getSeconds().LenWithZero(2) + new Number(31186).ChrW();
        oDateText += new Number(32).ChrW() + new Number(32).ChrW() + new Number(26143).ChrW() + new Number(26399).ChrW() + new String('26085199682010819977222352011620845').substr(this.getDay() * 5, 5).ToInt().ChrW();
        return oDateText;
    };
    //扩展Date格式化
    Date.prototype.Format = function(format) {
        var o = {
            "M+": this.getMonth() + 1, //月份
            "d+": this.getDate(), //
            "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时
            "H+": this.getHours(), //小时
            "m+": this.getMinutes(), //
            "s+": this.getSeconds(), //
            "q+": Math.floor((this.getMonth() + 3) / 3), //季度
            "S": this.getMilliseconds() //毫秒
        };
        var week = {
            "0": "u65e5",
            "1": "u4e00",
            "2": "u4e8c",
            "3": "u4e09",
            "4": "u56db",
            "5": "u4e94",
            "6": "u516d"
        };
        if (/(y+)/.test(format)) {
            format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        if (/(E+)/.test(format)) {
            format = format.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "u661fu671f" : "u5468") : "") + week[this.getDay() + ""]);
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(format)) {
                format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }
        return format;
    }
    Date.prototype.Diff = function(interval, objDate) {
        //若参数不足或 objDate 不是日期类型則回传 undefined
        if (arguments.length < 2 || objDate.constructor != Date) { return undefined; }
        switch (interval) {
            //计算秒差
            case 's': return parseInt((objDate - this) / 1000);
            //计算分差
            case 'n': return parseInt((objDate - this) / 60000);
            //计算時差
            case 'h': return parseInt((objDate - this) / 3600000);
            //计算日差
            case 'd': return parseInt((objDate - this) / 86400000);
            //计算周差
            case 'w': return parseInt((objDate - this) / (86400000 * 7));
            //计算月差
            case 'm': return (objDate.getMonth() + 1) + ((objDate.getFullYear() - this.getFullYear()) * 12) - (this.getMonth() + 1);
            //计算年差
            case 'y': return objDate.getFullYear() - this.getFullYear();
            //输入有误
            default: return undefined;
        }
    };
    
    //检测是否为空
    /*
    Object.prototype.IsNullOrEmpty = function() {
        /!*var obj = this;
        var flag = false;
        if (obj == null || obj == undefined || typeof (obj) == 'undefined' || obj == '') {
            flag = true;
        } else if (typeof (obj) == 'string') {
            obj = obj.trim();
            if (obj == '') {//为空
                flag = true;
            } else {//不为空
                obj = obj.toUpperCase();
                if (obj == 'NULL' || obj == 'UNDEFINED' || obj == '{}') {
                    flag = true;
                }
            }
        }
        else {
            flag = false;
        }
        return flag;*!/
    };*/
    
    
    // 事件绑定
    var delegate = V.delegate = function(parent, tagName, evtype, callback){
        parent['on'+evtype] = function(ev){
            var ev = ev || window.event;
            var tar = ev.target || ev.srcElement;
            if(tar.tagName.toLowerCase() === tagName){
                callback && callback(tar);
            }
        }
    };

    var V = { };var AP = ap = Array.prototype;var OP = op = Object.prototype;var objEqual =  V.objEqual = function(objA, objB){
        if (typeof arguments[0] != typeof arguments[1])        return false;
        //数组    if (arguments[0] instanceof Array){        if (arguments[0].length != arguments[1].length)            return false;                var allElementsEqual = true;        for (var i = 0; i < arguments[0].length; ++i){            if (typeof arguments[0][i] != typeof arguments[1][i]){                return false;            }
                if (typeof arguments[0][i] == 'number' && typeof arguments[1][i] == 'number'){                allElementsEqual = (arguments[0][i] == arguments[1][i]);            }            else{                allElementsEqual = arguments.callee(arguments[0][i], arguments[1][i]);            //递归判断对象是否相等                            }        }        return allElementsEqual;    }        //对象    if (arguments[0] instanceof Object && arguments[1] instanceof Object){        var result = true;        var attributeLengthA = 0, attributeLengthB = 0;        for (var o in arguments[0]){            //判断两个对象的同名属性是否相同(数字或字符串)            if (typeof arguments[0][o] == 'number' || typeof arguments[0][o] == 'string'){                result = eval("arguments[0]['" + o + "'] == arguments[1]['" + o + "']");            }            else {                //如果对象的属性也是对象,则递归判断两个对象的同名属性                //if (!arguments.callee(arguments[0][o], arguments[1][o]))                if (!arguments.callee(eval("arguments[0]['" + o + "']"), eval("arguments[1]['" + o + "']"))){                    result = false;                    return result;                }            }            ++attributeLengthA;        }                for (var o in arguments[1]) {            ++attributeLengthB;        }                //如果两个对象的属性数目不等,则两个对象也不等        if (attributeLengthA != attributeLengthB){            result = false;        }        return result;    }    return arguments[0] == arguments[1];};
    var objIndexOf = V.objIndexOf = AP.objIndexOf = function(arr, obj){    if(arguments.length == 1){        if(!(this instanceof Array)){            return "参数不合法";        }        for (var i = 0; i < this.length; i++) {            if(objEqual(this[i],arguments[0])){                return i;            }        }    }else{        if(!(arr instanceof Array)){            return "参数不合法";        }        for (var i = 0; i < arr.length; i++) {            if(objEqual(arr[i], obj)){                return i;            }        }    }    return -1 ;};
    var hasContains = V.hasContains = AP.hasContains  = function (arr, obj){    if(arguments.length == 1){        return (this.objIndexOf(arguments[0]) != -1) ;    }else{        return (objIndexOf(arr, obj) != -1) ;    }};
    var removeObj = V.removeObj  = AP.removeObj = function (arr, obj){    if(arguments.length == 1){        if(this.hasContains(arguments[0])){            var nindex = this.objIndexOf(arguments[0]);            this.splice(nindex, 1);            return this;        }    }else{        if(hasContains(arr, obj)){            var nindex = objIndexOf(arr, obj);            arr.splice(nindex, 1);            return arr;        }    }};
    var removeAt = V.removeAt = AP.removeAt = function(arr,index){    if(arguments.length == 1){        this.splice(arguments[0],1);        return this;    }else{        arr.splice(index, 1);        return arr;    }};


    var isArray = V.isArray = Array.isArray || function(object){ return object instanceof Array };var isFunction = V.isFunction = function(value) {    return type(value) == "function";};
    var type = V.type = function(obj) {    var class2type = {};    return obj == null ? String(obj) :    class2type[toString.call(obj)] || "object";};
    var isObject = function(obj){    return type(obj) == "object";};

    var objExtend = V.objExtend = function(target, source, deep){    for (var p in source) {        if (source.hasOwnProperty(p)) {            target[p] = source[p];        }    }};
    if(!AP.indexOf){    AP.indexOf = function(obj){        return objIndexOf(this, obj);    }}
    var filter = V.filter = function(arr,callback){    var narr = [];
        for(var i = 0; i < arr.length; i++){        if (i in arr) {            var val = arr[i]; // in case fun mutates this           /* if (callback.call(arguments[1], val)){                narr.push(val);            }*/            if (callback(val)){                narr.push(val);            }        }    }    return narr;};
    AP.contains =  function(obj,props){    /*var equals = true;    for(var i = 0;i < this.length;i++){        var thisObj = this[i];
            for(var j = 0;j < props.length;j++){            var prop = props[j];            equals = obj[prop] == thisObj[prop]?true:false;            if(!equals){                break;            }        }        if(equals){            break;        }    }    return equals;*/    return (this.objIndexOf(arguments[0]) != -1) ;};

    /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回 {%example <script> var a = [1,2,3,4].each(function(x){return x > 2 ? x : null}); var b = [1,2,3,4].each(function(x){return x < 0 ? x : null}); alert(a); alert(b); </script> %} * @param {Function} fn 进行迭代判定的函数 * @param more ... 零个或多个可选的用户自定义参数 * @returns {Array} 结果集,如果没有结果,返回空集 */AP.each = function(fn){    fn = fn || Function.k;    var narr = [];    var args = AP.slice.call(arguments, 1);    for(var i=0; i<this.length; i++){        var res = fn.apply(this,[this[i],i].concat(args));        if(res != null){            narr.push(res);        }    }    return narr;};
    /** * 得到一个数组不重复的元素集合
     * 唯一化一个数组 * @returns {Array} 由不重复元素构成的数组 */AP.unique = function(){    var ra = new Array();    for(var i = 0; i < this.length; i ++){        if(!ra.hasContains(this[i])){            ra.push(this[i]);        }    }    return ra;};
    /** * 求两个集合的补集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.complement(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 两个集合的补集 */Array.complement = function(a, b){    return Array.minus(Array.union(a, b),Array.intersect(a, b));};
    /** * 求两个集合的交集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.intersect(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 两个集合的交集 */Array.intersect = function(a, b){    return a.unique().each(function(o){return b.contains(o) ? o : null});};
    /** * 求两个集合的差集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.minus(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 两个集合的差集 */Array.minus = function(a, b){    return a.unique().each(function(o){return b.contains(o) ? null : o});};
    /** * 求两个集合的并集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.union(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 两个集合的并集 */Array.union = function(a, b){    return a.concat(b).unique();};
    // 比较两个 数组 是否 相等Array.prototype.compare = function(testArr) {    if (this.length != testArr.length) return false;    for (var i = 0; i < testArr.length; i++) {        if (this[i].compare) {            if (!this[i].compare(testArr[i])) return false;        }        if (this[i] !== testArr[i]) return false;    }    return true;};
    // 数组插入Array.prototype.insertAt = function($value, $index) {    if($index < 0)        this.unshift($value);    else if($index >= this.length)        this.push($value);    else        this.splice($index, 0, $value);};



    /** * 根据数组的下标来删除元素 */Array.prototype.removeByIndex=function($n) {    if($n<0){ //如果n<0,则不进行任何操作。        return this;    }else{        return this.slice(0,$n).concat(this.slice($n+1,this.length));    }}//依赖indexOfArray.prototype.remove = function($value){    var $index = this.indexOf($value);
        if($index != -1)        this.splice($index, 1);}
    Array.prototype.removeAll = function(){    while(this.length > 0)        this.pop();}
    Array.prototype.replace = function($oldValue, $newValue){    for(var $i=0; $i<this.length; $i++)    {        if(this[$i] == $oldValue)        {            this[$i] = $newValue;            return;        }    }}
    Array.prototype.swap = function($a, $b){    if($a == $b)        return;
        var $tmp = this[$a];    this[$a] = this[$b];    this[$b] = $tmp;}Array.prototype.max = function() {    return Math.max.apply({}, this);}Array.prototype.min = function() {    return Math.min.apply({}, this);}

    // JS创建新对象,扩展对象和拷贝对象方法的实现/*(function(exports){    var mObject=(function(){        return {            //以参数作为原型,创建一个新的对象            fCreate:function(oProto){                var F=function(){};                F.prototype=oProto;                return new F();            },            //扩展一个原有对象            fExtend:function(o,oAdded){                for(var i in oAdded)                {                    o[i]=oAdded[i];                }            },            //深拷贝一个对象            fCopy:function(o){                var oRes;                if(o instanceof Array)                {                    oRes=[];                }                else if(o instanceof Object){                    oRes={};                }                else{                    return o;                }                for(var i in o)                {                    if(typeof o[i] !='object')                    {                        oRes[i]=o[i];                    }                    else{                        oRes[i]=arguments.callee(o[i]);                    }                }                return oRes;            }        };    })();    exports.mObject=mObject;})(window);*/







    if(typeof String.prototype.ltrim=='undefined'){    String.prototype.ltrim = function(){        var s = this;        s = s.replace(/^s*/g, '');        return s;    }}
    if(typeof String.prototype.rtrim=='undefined'){    String.prototype.rtrim = function(){        var s = this;        s = s.replace(/s*$/g, '');        return s;    }}
    if(typeof String.prototype.trim=='undefined'){    String.prototype.trim = function(){        return this.ltrim().rtrim();    }}
    if(typeof String.prototype.htmlEncode=='undefined'){    String.prototype.htmlEncode = function(encodeNewLine){//encodeNewLine:是否encode换行符        var s = this;        s = s.replace(/&/g, '&amp;');        s = s.replace(/</g, '&lt;');        s = s.replace(/>/g, '&gt;');        s = s.replace(/'/g, '&quot;');        if(encodeNewLine){            s = s.replace(/ /g, '<br />');            s = s.replace(/ /g, '<br />');            s = s.replace(/ /g, '<br />');        }        return s;    }}

    function cloneObj(oldObj) { //复制对象方法    if (typeof(oldObj) != 'object') return oldObj;    if (oldObj == null) return oldObj;    var newObj = Object();    for (var i in oldObj)        newObj[i] = cloneObj(oldObj[i]);    return newObj;}
    function extendObj() { //扩展对象    var args = arguments;//将传递过来的参数数组赋值给args变量    if (args.length < 2) return;    var temp = cloneObj(args[0]); //调用复制对象方法    for (var n = 1; n < args.length; n++) {        for (var i in args[n]) {            temp[i] = args[n][i];        }    }    return temp;}

    // es5-safe 模块/*Function.prototype.bindObject.createObject.keysArray.isArrayArray.prototype.forEachArray.prototype.mapArray.prototype.filterArray.prototype.everyArray.prototype.someArray.prototype.reduceArray.prototype.reduceRightArray.prototype.indexOfArray.prototype.lastIndexOfString.prototype.trimDate.now*/

    if (!Array.prototype.every){    Array.prototype.every = function(fun /*, thisp*/) {        var len = this.length;        if (typeof fun != "function")            throw new TypeError();
            var thisp = arguments[1];        for (var i = 0; i < len; i++)        {            if (i in this &&                !fun.call(thisp, this[i], i, this))                return false;        }
            return true;    };}if (!Array.prototype.filter) {    Array.prototype.filter = function(fun /*, thisp*/) {        var len = this.length;        if (typeof fun != "function")            throw new TypeError();
            var res = new Array();        var thisp = arguments[1];        for (var i = 0; i < len; i++) {            if (i in this) {                var val = this[i]; // in case fun mutates this                if (fun.call(thisp, val, i, this))                    res.push(val);            }        }
            return res;    };}if (!Array.prototype.forEach){    Array.prototype.forEach = function(fun /*, thisp*/)    {        var len = this.length;        if (typeof fun != "function")            throw new TypeError();
            var thisp = arguments[1];        for (var i = 0; i < len; i++)        {            if (i in this)                fun.call(thisp, this[i], i, this);        }    };}if (!Array.prototype.map){    Array.prototype.map = function(fun /*, thisp*/)    {        var len = this.length;        if (typeof fun != "function")            throw new TypeError();
            var res = new Array(len);        var thisp = arguments[1];        for (var i = 0; i < len; i++)        {            if (i in this)                res[i] = fun.call(thisp, this[i], i, this);        }
            return res;    };}if (!Array.prototype.some){    Array.prototype.some = function(fun /*, thisp*/)    {        var len = this.length;        if (typeof fun != "function")            throw new TypeError();
            var thisp = arguments[1];        for (var i = 0; i < len; i++)        {            if (i in this &&                fun.call(thisp, this[i], i, this))                return true;        }
            return false;    };}Array.prototype.sortNum = function() {    return this.sort( function (a,b) { return a-b; } );}


    if(typeof Object.create !== "function"){    Object.create = function (o) {        function F(){};        F.property = o;        return new F();    }}
    var Model = {    inherited: function(){},    created: function(){},    prototype: {        init: function(){}    },    create: function(){        var object = Object.create(this);        object.parent = this;        object.prototype = object.fn = Object.create(this.prototype);        object.created();        this.inherited(object);        return object;    },    init: function(){        var instance = Object.create(this.prototype);        instance.parent = this;        instance.init.apply(instance, arguments);        return instance;    }};
    objExtend(Model, {    find: function(){}});
    objExtend(Model.prototype,{    init: function(atts){        if(atts){            this.load(atts);        }    },    load: function(attr){        for(var name in attr)            this[name] = attr[name];    }});


    var modelStore = V.modelStore = function(){
    }

    var assert = function(value, msg){if(!value){throw(msg || (value + " does not equal true"));}};
    var assertEqual = function(val1, val2, msg) {if (val1 !== val2){throw(msg || (val1 + " does not equal " + val2));}};
    // 清除两边的空格String.prototype.trim = function() {    return this.replace(/(^s*)|(s*$)/g, '');};// 合并多个空白为一个空白String.prototype.ResetBlank = function() {    var regEx = /s+/g;    return this.replace(regEx, ' ');};
    // 保留数字String.prototype.GetNum = function() {    var regEx = /[^d]/g;    return this.replace(regEx, '');};
    // 保留中文String.prototype.GetCN = function() {    var regEx = /[^u4e00-u9fa5uf900-ufa2d]/g;    return this.replace(regEx, '');};
    // String转化为NumberString.prototype.ToInt = function() {    return isNaN(parseInt(this)) ? this.toString() : parseInt(this);};
    // 得到字节长度String.prototype.GetLen = function() {    var regEx = /^[u4e00-u9fa5uf900-ufa2d]+$/;    if (regEx.test(this)) {        return this.length * 2;    } else {        var oMatches = this.match(/[x00-xff]/g);        var oLength = this.length * 2 - oMatches.length;        return oLength;    }};
    // 获取文件全名String.prototype.GetFileName = function() {    var regEx = /^.*/([^/?]*).*$/;    return this.replace(regEx, '$1');};
    // 获取文件扩展名String.prototype.GetExtensionName = function() {    var regEx = /^.*/[^/]*(.[^.?]*).*$/;    return this.replace(regEx, '$1');};
    //替换所有String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) {    if (!RegExp.prototype.isPrototypeOf(reallyDo)) {        return this.replace(new RegExp(reallyDo, (ignoreCase ? "gi" : "g")), replaceWith);    } else {        return this.replace(reallyDo, replaceWith);    }};//格式化字符串 add By 刘景宁 2010-12-09String.Format = function() {    if (arguments.length == 0) {        return '';    }
        if (arguments.length == 1) {        return arguments[0];    }
        var reg = /{(d+)?}/g;    var args = arguments;    var result = arguments[0].replace(reg, function($0, $1) {        return args[parseInt($1) + 1];    });    return result;};
    // 数字补零Number.prototype.LenWithZero = function(oCount) {    var strText = this.toString();    while (strText.length < oCount) {        strText = '0' + strText;    }    return strText;};
    // Unicode还原Number.prototype.ChrW = function() {    return String.fromCharCode(this);};
    // 数字数组由小到大排序Array.prototype.Min2Max = function() {    var oValue;    for (var i = 0; i < this.length; i++) {        for (var j = 0; j <= i; j++) {            if (this[i] < this[j]) {                oValue = this[i];                this[i] = this[j];                this[j] = oValue;            }        }    }    return this;};
    // 数字数组由大到小排序Array.prototype.Max2Min = function() {    var oValue;    for (var i = 0; i < this.length; i++) {        for (var j = 0; j <= i; j++) {            if (this[i] > this[j]) {                oValue = this[i];                this[i] = this[j];                this[j] = oValue;            }        }    }    return this;};
    // 获得数字数组中最大项Array.prototype.GetMax = function() {    var oValue = 0;    for (var i = 0; i < this.length; i++) {        if (this[i] > oValue) {            oValue = this[i];        }    }    return oValue;};
    // 获得数字数组中最小项Array.prototype.GetMin = function() {    var oValue = 0;    for (var i = 0; i < this.length; i++) {        if (this[i] < oValue) {            oValue = this[i];        }    }    return oValue;};
    // 获取当前时间的中文形式Date.prototype.GetCNDate = function() {    var oDateText = '';    oDateText += this.getFullYear().LenWithZero(4) + new Number(24180).ChrW();    oDateText += this.getMonth().LenWithZero(2) + new Number(26376).ChrW();    oDateText += this.getDate().LenWithZero(2) + new Number(26085).ChrW();    oDateText += this.getHours().LenWithZero(2) + new Number(26102).ChrW();    oDateText += this.getMinutes().LenWithZero(2) + new Number(20998).ChrW();    oDateText += this.getSeconds().LenWithZero(2) + new Number(31186).ChrW();    oDateText += new Number(32).ChrW() + new Number(32).ChrW() + new Number(26143).ChrW() + new Number(26399).ChrW() + new String('26085199682010819977222352011620845').substr(this.getDay() * 5, 5).ToInt().ChrW();    return oDateText;};//扩展Date格式化Date.prototype.Format = function(format) {    var o = {        "M+": this.getMonth() + 1, //月份        "d+": this.getDate(), //日        "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时        "H+": this.getHours(), //小时        "m+": this.getMinutes(), //分        "s+": this.getSeconds(), //秒        "q+": Math.floor((this.getMonth() + 3) / 3), //季度        "S": this.getMilliseconds() //毫秒    };    var week = {        "0": "u65e5",        "1": "u4e00",        "2": "u4e8c",        "3": "u4e09",        "4": "u56db",        "5": "u4e94",        "6": "u516d"    };    if (/(y+)/.test(format)) {        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));    }    if (/(E+)/.test(format)) {        format = format.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "u661fu671f" : "u5468") : "") + week[this.getDay() + ""]);    }    for (var k in o) {        if (new RegExp("(" + k + ")").test(format)) {            format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));        }    }    return format;}Date.prototype.Diff = function(interval, objDate) {    //若参数不足或 objDate 不是日期类型則回传 undefined    if (arguments.length < 2 || objDate.constructor != Date) { return undefined; }    switch (interval) {        //计算秒差        case 's': return parseInt((objDate - this) / 1000);        //计算分差        case 'n': return parseInt((objDate - this) / 60000);        //计算時差        case 'h': return parseInt((objDate - this) / 3600000);        //计算日差        case 'd': return parseInt((objDate - this) / 86400000);        //计算周差        case 'w': return parseInt((objDate - this) / (86400000 * 7));        //计算月差        case 'm': return (objDate.getMonth() + 1) + ((objDate.getFullYear() - this.getFullYear()) * 12) - (this.getMonth() + 1);        //计算年差        case 'y': return objDate.getFullYear() - this.getFullYear();        //输入有误        default: return undefined;    }};
    //检测是否为空/*Object.prototype.IsNullOrEmpty = function() {    /!*var obj = this;    var flag = false;    if (obj == null || obj == undefined || typeof (obj) == 'undefined' || obj == '') {        flag = true;    } else if (typeof (obj) == 'string') {        obj = obj.trim();        if (obj == '') {//为空            flag = true;        } else {//不为空            obj = obj.toUpperCase();            if (obj == 'NULL' || obj == 'UNDEFINED' || obj == '{}') {                flag = true;            }        }    }    else {        flag = false;    }    return flag;*!/};*/

    // 事件绑定var delegate = V.delegate = function(parent, tagName, evtype, callback){    parent['on'+evtype] = function(ev){        var ev = ev || window.event;        var tar = ev.target || ev.srcElement;        if(tar.tagName.toLowerCase() === tagName){            callback && callback(tar);        }    }};

  • 相关阅读:
    JS 寻路算法
    Fireworks基本使用
    html基础知识汇总(二)之Emmet语法
    JS函数式编程
    Web前端导航
    CSS样式一
    选择器的分类
    框架集
    表单标签元素
    图像热点&图像映射
  • 原文地址:https://www.cnblogs.com/vsmart/p/7597287.html
Copyright © 2020-2023  润新知