if (jQuery.datepicker) {
    jQuery.datepicker.setDefaults({
        dayNamesMin: ['日', '一', '二', '三', '四', '五', '六'],
        dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
        dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
        monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
        monthNamesShort: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
        weekHeader: '周',
        nextText: '下月&#x3e',
        prevText: '&#x3c上月',
        closeText: '完成',
        currentText: '今天',
        yearSuffix: '年'
    });
}

/*扩展 jQuery.browser 的属性*/
if (!jQuery.browser) {
    jQuery.browser = {};
}
jQuery.extend(jQuery.browser, {
    /*检查浏览器是否支持CSS3*/
    css3: (function () {
        var css3Div = document.createElement('div');
        if ('border-radius' in css3Div.style) {
            css3Div.style['border-radius'] = '3px';
            return css3Div.style['border-radius'] == '3px';
        }
        else {
            return false;
        }
    })(),
    /*检查浏览器是否支持HTML5*/
    html5: (function () {
        return !!document.createElement('canvas').getContext;
    })()
});
jQuery.widget("ui.tabs", $.ui.tabs, {
    addTab: function (options) {
        var _self = this;
        options = $.extend({
            title: 'New Tab', //标题
            content: '', //内容
            id: 'tab_' + new Date().getTime(), //Id
            enableClose: true, //是否允许关闭
            activate: true //是否激活
        }, options || {});

        var id = "tabs-" + options.id;
        var tab = this.element.find('.ui-tabs-nav li[aria-controls="' + id + '"]');
        if (tab.length < 1) {
            var _li = $('<li></li>').append($('<a></a>').attr('href', '#' + id).html(options.title));
            this.element.find(".ui-tabs-nav").append(_li);
            var _div = $('<div></div>');
            _div.attr('id', id);
            _div.append(options.content);
            this.element.append(_div);
            if (options.enableClose) {
                var _closeBtn = $('<span class="ui-icon ui-icon-close" role="presentation" title="关闭"></span>').click(function () {
                    var _this = $(this);
                    var panelId = _li.remove().attr("aria-controls");
                    $("#" + panelId).remove();
                    if (_li.hasClass('ui-tabs-active')) {
                        _self.element.tabs('option', 'active', _self.element.find(".ui-tabs-nav li").length - 1);
                    }
                });
                _li.append(_closeBtn);
            }
            this.refresh();
            if (options.activate) {
                this._activate(this.element.find(".ui-tabs-nav li").length - 1);
            }
            //解决不支持css3的浏览器问题
            if (!$.browser.css3) {
                _div.height(this.element.innerHeight() - this.element.css('padding-top').replace('px', '') - this.element.find(".ui-tabs-nav").outerHeight(true) - Math.mul(_div.css('margin-top').replace('px', ''), 2));
            }
        } else if (options.activate) {
            var activeIndex = this.element.find(".ui-tabs-nav li").index(tab);
            this._activate(activeIndex);
        }
    }
});

由于IE 家族jscript不支持find,需要而外代码实现Array属性find的扩展

if (!Array.prototype.find) {
     Array.prototype.find = function (callback) {
         for(var i in this){
             if (callback(this[i], i, this)) {
                 return this[i];
             }
         }
         return null;
     }
 }

function downloadBase64(base64, fileName) {
	base64 = base64.replace(/.+;base64,/, '');
	var byteCharacters = atob(base64);
	var byteNumbers = new Array(byteCharacters.length);
	for (var i = 0; i < byteCharacters.length; i++) {
		byteNumbers[i] = byteCharacters.charCodeAt(i);
	}
	var byteArray = new Uint8Array(byteNumbers);
	var blob = new Blob([byteArray], { type: 'application/octet-stream' });
	if (navigator.msSaveOrOpenBlob) {// if IE
		navigator.msSaveBlob(blob, fileName);
	} else { //if not IE
		var link = document.createElement('a');
		link.href = window.URL.createObjectURL(blob);
		link.download = fileName;
		link.click();
		window.URL.revokeObjectURL(link.href);
	}
}

比较好用的 js 时间格式化方法,复杂的多种格式。

Date.prototype.format = function (mask) {
    var d = this;
    var zeroize = function (value, length) {
        if (!length) length = 2;
        value = String(value);
        for (var i = 0, zeros = ''; i < (length - value.length) ; i++) {
            zeros += '0';
        }
        return zeros + value;
    };

    return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])\1?|[lLZ])\b/g, function ($0) {
        switch ($0) {
            case 'd':
                return d.getDate();
            case 'dd':
                return zeroize(d.getDate());
            case 'ddd':
                return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
            case 'dddd':
                return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];
            case 'M':
                return d.getMonth() + 1;
            case 'MM':
                return zeroize(d.getMonth() + 1);
            case 'MMM':
                return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
            case 'MMMM':
                return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];
            case 'yy':
                return String(d.getFullYear()).substr(2);
            case 'yyyy':
                return d.getFullYear();
            case 'h':
                return d.getHours() % 12 || 12;
            case 'hh':
                return zeroize(d.getHours() % 12 || 12);
            case 'H':
                return d.getHours();
            case 'HH':
                return zeroize(d.getHours());
            case 'm':
                return d.getMinutes();
            case 'mm':
                return zeroize(d.getMinutes());
            case 's':
                return d.getSeconds();
            case 'ss':
                return zeroize(d.getSeconds());
            case 'l':
                return zeroize(d.getMilliseconds(), 3);
            case 'L':
                var m = d.getMilliseconds();
                if (m > 99) m = Math.round(m / 10);
                return zeroize(m);
            case 'tt':
                return d.getHours() < 12 ? 'am' : 'pm';
            case 'TT':
                return d.getHours() < 12 ? 'AM' : 'PM';
            case 'Z':
                return d.toUTCString().match(/[A-Z]+$/);
                // Return quoted strings with the surrounding quotes removed
            default:
                return $0.substr(1, $0.length - 2);
        }
    });
};

实现String转bytes属性扩展

String.prototype.toBytes = function () {
var ch, st, re = [];
for (var i = 0; i < this.length; i++) {
ch = this.charCodeAt(i); // get char
st = []; // set up "stack"
do {
st.push(ch & 0xFF); // push byte to stack
ch = ch >> 8; // shift value down by 1 byte
}
while (ch);
// add stack contents to result
// done because chars have "wrong" endianness
re = re.concat(st.reverse());
}
// return an array of bytes
return re;
}

解决微软MVC请求响应的JSON的日期格式问题。需要结合StringBuilder

JavaScriptSerializer = {};
JavaScriptSerializer._charsToEscapeRegExs = [];
JavaScriptSerializer._charsToEscape = [];
JavaScriptSerializer._dateRegEx = new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\\"', 'g');
JavaScriptSerializer._escapeChars = {};
JavaScriptSerializer._escapeRegEx = new RegExp('["\\\\\\x00-\\x1F]', 'i');
JavaScriptSerializer._escapeRegExGlobal = new RegExp('["\\\\\\x00-\\x1F]', 'g');
JavaScriptSerializer._jsonRegEx = new RegExp('[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]', 'g');
JavaScriptSerializer._jsonStringRegEx = new RegExp('"(\\\\.|[^"\\\\])*"', 'g');
JavaScriptSerializer._init = function () {
    var replaceChars = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007',
                        '\\b', '\\t', '\\n', '\\u000b', '\\f', '\\r', '\\u000e', '\\u000f', '\\u0010', '\\u0011',
                        '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019',
                        '\\u001a', '\\u001b', '\\u001c', '\\u001d', '\\u001e', '\\u001f'];
    JavaScriptSerializer._charsToEscape[0] = '\\';
    JavaScriptSerializer._charsToEscapeRegExs['\\'] = new RegExp('\\\\', 'g');
    JavaScriptSerializer._escapeChars['\\'] = '\\\\';
    JavaScriptSerializer._charsToEscape[1] = '"';
    JavaScriptSerializer._charsToEscapeRegExs['"'] = new RegExp('"', 'g');
    JavaScriptSerializer._escapeChars['"'] = '\\"';
    for (var i = 0; i < 32; i++) {
        var c = String.fromCharCode(i);
        JavaScriptSerializer._charsToEscape[i + 2] = c;
        JavaScriptSerializer._charsToEscapeRegExs[c] = new RegExp(c, 'g');
        JavaScriptSerializer._escapeChars[c] = replaceChars[i];
    }
}
JavaScriptSerializer.serialize = function (object) {
    var stringBuilder = new StringBuilder();
    var booleanWithBuilder = function (bool, builder) {
        if (typeof bool !== 'undefined') {
            builder.append(bool);
        } else {
            builder.append('false');
        }
    }
    var numberWithBuilder = function (number, builder) {
        if (typeof number !== 'undefined' && number.toString() !== 'NaN') {
            builder.append(number);
        } else {
            builder.append('null');
        }
    }
    var stringWithBuilder = function (string, builder) {
        builder.append('"');
        if (JavaScriptSerializer._escapeRegEx.test(string)) {
            if (JavaScriptSerializer._charsToEscape.length === 0) {
                JavaScriptSerializer._init();
            }
            if (string.length < 128) {
                string = string.replace(JavaScriptSerializer._escapeRegExGlobal,
                function (x) { return JavaScriptSerializer._escapeChars[x]; });
            }
            else {
                for (var i = 0; i < 34; i++) {
                    var c = JavaScriptSerializer._charsToEscape[i];
                    if (string.indexOf(c) !== -1) {
                        if ($.browser.opera || $.browser.mozilla) {
                            string = string.split(c).join(JavaScriptSerializer._escapeChars[c]);
                        }
                        else {
                            string = string.replace(JavaScriptSerializer._charsToEscapeRegExs[c],
                            JavaScriptSerializer._escapeChars[c]);
                        }
                    }
                }
            }
        }
        builder.append(string);
        builder.append('"');
    }
    var dateWithBuilder = function (date, builder) {
        if (date && date.toString() !== 'NaN') {
            builder.append('"\\/Date(');
            var timeOffset = date.getTimezoneOffset() * 60 * 1000;
            if (timeOffset != 0) {
                var time = date.getTime() - timeOffset;
                builder.append(time);
            }
            else {
                builder.append(date.getTime());
            }
            builder.append(')\\/"');
        } else {
            builder.append('null');
        }
    }
    var plainObjectWithBuilder = function (plainObject, builder) {
        builder.append('{');
        var row = 0;
        for (var item in plainObject) {
            if (row++ > 0) {
                builder.append(',');
            }
            stringWithBuilder(item, builder);
            builder.append(':');
            withBuilder(plainObject[item], builder);
        }
        builder.append('}');
    }
    var arrayWithBuilder = function (array, builder) {
        if (array) {
            builder.append('[');
            if (array.length > 0) {
                $.each(array, function (i, item) {
                    if (i > 0) {
                        builder.append(',');
                    }
                    withBuilder(item, builder);
                });
            }
            builder.append(']');
        } else {
            builder.append('null');
        }
    }
    var withBuilder = function (object, builder) {
        builder = builder || new StringBuilder();
        var type = $.type(object);
        switch (type) {
            case 'object':
                if (object) {
                    if (jQuery.isPlainObject(object)) {
                        plainObjectWithBuilder(object, builder);
                    } else {
                        builder.append('null');
                    }
                } else {
                    builder.append('null');
                }
                break;
            case 'array':
                arrayWithBuilder(object, builder);
                break;
            case 'number':
                numberWithBuilder(object, builder);
                break;
            case 'string':
                stringWithBuilder(object, builder);
                break;
            case 'date':
                dateWithBuilder(object, builder);
                break;
            case 'boolean':
                booleanWithBuilder(object, builder);
                break;
            default:
                builder.append('null');
                break;
        }
    }

    withBuilder(object, stringBuilder);

    return stringBuilder.toString();
}
JavaScriptSerializer.deserialize = function (data, secure) {
    if (data == null || typeof data !== "string" || data.length === 0) {
        return null;
    }
    var exp = data.replace(JavaScriptSerializer._dateRegEx, "$1new Date($2)");
    try {
        if (secure && JavaScriptSerializer._jsonRegEx.test(exp.replace(JavaScriptSerializer._jsonStringRegEx, ''))) {
            throw null;
        }
    } catch (e) {
        throw 'Cannot deserialize. The data does not correspond to valid JSON.';
    }
    return eval('(' + exp + ')');
}

StringBuilder = function (initialText) {
    this._array = (typeof (initialText) !== 'undefined' && initialText !== null && initialText !== '') ? [initialText] : [];
    this.append = function (text) {
        this._array[this._array.length] = text;
    }
    this.appendLine = function (text) {
        this._array[this._array.length] = ((typeof (text) === 'undefined') || (text === null) || (text === '')) ? '\r\n' : text + '\r\n';
    }
    this.clear = function (text) {
        this._array = [];
    }
    this.isEmpty = function () {
        return (this._array.length == 0 ? true : false);
    }
    this.toString = function (separator) {
        separator = separator || ''
        var array = this._array;
        if (separator !== '') {
            for (var i = 0; i < array.length; ) {
                if ((typeof (array[i]) === 'undefined') || (array[i] === '') || (array[i] === null)) {
                    array.splice(i, 1);
                }
                else {
                    i++;
                }
            }
        }
        return array.join(separator);
    }
    this.indexOf = function (searchvalue) {
        return this._array.indexOf(searchvalue);
    }
    this.contains = function (text) {
        return this._array.contains(text);
    }
}