常用Common.js工具库备份

常用Common.js工具库备份

/**
 * @Date:   2017-01-08 15:26:37
 * @Last Modified time: 2017-01-08 16:16:59
 * @file name: common.js
 * @desc 对原生JS对象的扩展
 * Object、Array、String、Date、Ajax、Cookie
 */

'use strict';;
(function() {
    Object.extend = function(targetObj, fnJson) {
        for (var fnName in fnJson) {
            targetObj[fnName] = fnJson[fnName];
        }
        return targetObj;
    };


    /**
     * 对Object的扩展
     */
    Object.extend(Object.prototype, {
        values: function() { // 一个静态方法, 传入一个对象, 返回该对象中所有属性所对应的值, 构成数组返回
            var values = [];
            for (var property in this) values.push(this[property]); // 将每个属性的值压入到一个数组中
            return values;
        },
        clone: function(object) { // 一个静态方法, 传入一个对象, 克隆一个新对象并返回
            return Object.extend({}, object);
        },
        getType: function() {
            return Object.prototype.toString.call(this).match(/\[object (.*?)\]/)[1].toLowerCase();
        },
        toJson: function() {
            return JSON.stringify(this);
        },
        serialize: function() {
            if (JSON.parse)
                return JSON.parse(this);
            switch (this.constructor) {
                case Object:
                    var str = "{";
                    for (var o in obj) {
                        str += '"' + o + '"' + ":" + Serialize(obj[o]) + ",";
                    }
                    if (str.substr(str.length - 1) == ",")
                        str = str.substr(0, str.length - 1);
                    return str + "}";
                    break;
                case Array:
                    var str = "{";
                    if (str.substr(str.length - 1) == ",") {
                        str = str.substr(0, str.length - 1);
                    }
                    for (var o in obj) {
                        str += '"' + o + '"' + ":" + Serialize(obj[o]) + ",";
                    }
                    return str + "}";
                    break;
                case Boolean:
                    return "\"" + obj.toString() + "\"";
                    break;
                case Date:
                    return "\"" + obj.toString() + "\"";
                    break;
                case Function:
                    break;
                case Number:
                    return "\"" + obj.toString() + "\"";
                    break;
                case String:
                    return "\"" + obj.toString() + "\"";
                    break;
            }
        }
    });


    /**
     * 对Array的扩展
     */
    Object.extend(Array.prototype, {
        clear: function() {
            this.length = 0;
            return this;
        },
        lastIndexOfArr: function(obj) {
            if (this.lastIndexOf(obj)) {
                return this.lastIndexOf(obj);
            } else {
                this.reverse();
                return this.length - 1 - this.indexOfArr(obj);
            }
        },
        contain: function(obj) {
            return this.indexOfArr(obj) > -1;
        },
        insertAt: function(index, obj) {
            this.splice(index, 0, obj);
            return this;
        },
        removeAt: function(index) {
            this.splice(index, 1);
            return this;
        },
        first: function() {
            return this[0];
        },
        indexOfArr: function(obj) {
            //如果浏览器支持原生的indexOf,则调用原生的方法
            if (this.indexOf) {
                return this.indexOf(obj);
            } else {
                var i = 0;
                len = this.length;
                for (i; i < len; i++) {
                    if (this[i] == obj)
                        return i;
                    return -1;
                }
            }
        },
        last: function() {
            return this[this.length - 1];
        },
        distinct: function() {
            this.sort();
            var res = [this[0]];
            for (var i = 1; i < this.length; i++) {
                if (this[i] !== res[res.length - 1]) {
                    res.push(this[i]);
                }
            }
            return res;
        },
        sumNum: function() {
            if (this.reduce) {
                return this.reduce(function(partial, value) {
                    return partial + value;
                })
            } else {
                return eval(arr.join('+'));
            }
        },
        sortNumAsc: function() {
            this.sort(function(a, b) {
                return a - b;
            });
            return this;
        },
        sortNumDesc: function() {
            this.sort(function(a, b) {
                return b - a;
            });
            return this;
        },
        maxNum: function() {
            return this.sortNumAsc()[this.length - 1];
        },
        minNum: function() {
            return this.sortNumAsc()[0];
        },
        toUpperCase: function() {
            if (this.map) {
                return this.map.call(this, function(elem) {
                    return elem.toUpperCase();
                })
            } else {
                return this.toLocaleString().toUpperCase().split(',');
            }
        },
        toLowerCase: function() {
            if (this.map) {
                return this.map.call(this, function(elem) {
                    return elem.toLowerCase();
                })
            } else {
                return this.toLocaleString().toLowerCase().split(',');
            }

        }
    })


    /**
     * 对String的扩展
     */
    Object.extend(String.prototype, {
        /*
         *使用示例如下
         *var s = String.format("S{0}T{1}","n","e");//结果:SnTe
         */
        format: function() {
            var res = arguments[0];
            for (var i = 0, len = arguments.length - 1; i < len; i++) {
                var b = new Regexp("\\{" + i + "\\", "gm");
                res = res.replace(b, arguments[i + 1]);
            }
            return res;
        },
        append: function(str) {
            return this.concat(str);
        },
        leftpad: function(len, str) {
            if (arguments.length === 1) str = '0';
            var res = new StringBuilder();
            for (var i = 0, c = len - this.length; i < c; i++) {
                res.append(str);
            }
            res.append(this);
            return res.toString();
        },
        rightpad: function(len, str) {
            if (arguments.length === 1) str = '0';
            var res = new StringBuilder();
            res.append(this);
            for (var i = 0, c = len - this.length; i < c; i++) {
                res.append(str);
            }
            return res.toString();
        },
        trim: function() {
            return this.replace(/(^\s+)|(\s+$)/g, '');
        },
        ltrim: function() {
            return this.replace(/^\s+/g, '');
        },
        rtrim: function() {
            return this.replace(/\s+$/g, '');
        },
        startWith: function(str, ignorCase) {
            if (str.length > this.length) return false;
            if (ignorCase) {
                return this.toLowerCase().indexOf(str.toLowerCase()) === 0;
            } else {
                return this.indexOf(str) === 0;
            }
        },
        endWith: function(str, ignorCase) {
            if (str.length > this.length) return false;
            if (ignorCase) {
                return this.toLowerCase().lastIndexOf(str.toLowerCase()) === this.length - str.length;
            } else {
                return this.lastIndexOf(str) === this.length - str.length;
            }
        },
        removeCharAt: function(index) {
            if (index < 0 || index >= this.length) {
                return this.valueOf();
            } else if (index == 0) {
                return this.substring(1, this.length);
            } else if (index == this.length - 1) {
                return this.substring(0, this.length - 1);
            } else {
                return this.substring(0, index) + this.substring(index + 1);
            }
        },
        removeStr: function(start, end) {
            if (start == end) {
                return this.deleteCharAt(start);
            } else {
                if (start > end) {
                    var temp = start;
                    start = end;
                    end = temp;
                }
                if (start < 0) {
                    start = 0;
                }
                if (end > this.length - 1) {
                    end = this.length - 1;
                }
                return this.substring(0, start) + this.substring(end + 1, this.length);
            }

        },
        equalIgnoreCase: function(str) {
            return this.toLowerCase() === str.toLowerCase();
        },
        insertAfter: function(index, str) {
            return this.slice(0, index + 1) + str + this.slice(index + 1);
        },
        insertBefore: function(index, str) {
            return this.slice(0, index) + str + this.slice(index);
        },
        isAllNumber: function() {
            for (var i = 0; i < this.length; i++) {
                if (this.charAt(i) < '0' || this.charAt(i) > '9') {
                    return false;
                }
            }
            return true;
        },
        isInt: function() {
            return /^[1-9]\d$/.test(this);
        },
        isNullOrEmpty: function() {
            if (this === null || this.trim() === "") {
                return true;
            }
            return false;
        },
        isPhoneNum: function() {
            var pattern = /^0{0,1}(13[0-9]|14[6|7]|15[0-3]|15[5-9]|18[0-3]|18[5-9])[0-9]{8}$/;
            return pattern.test(this);
        },
        getCharLength: function() {
            var temp = 0;
            for (var i = 0; i < this.length; i++) {
                if (this.charCodeAt(i) > 255) {
                    temp += 2;
                } else {
                    temp += 1;
                }
            }
            return temp;
        },
        getNum: function() {
            return this.replace(/[^d]/g, "");
        },
        getEn: function() {
            return this.replace(/[^A-Za-z]/g, "");
        },
        getCn: function() {
            return this.replace(/[^u4e00-u9fa5uf900-ufa2d]/g, "");
        },
        left: function(n) {
            return this.slice(0, n);
        },
        right: function(n) {
            return this.slice(this.length - n);
        },
        encodeHTML: function() {
            if (this.isNullOrEmpty()) return this;
            var str = this;

            str = str.replace(/&/g, "&amp;");
            str = str.replace(/</g, "&lt;");
            str = str.replace(/>/g, "&gt;");
            str = str.replace(/\'/g, "&apos;");
            str = str.replace(/\"/g, "&quot;");
            str = str.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
            str = str.replace(/\s+/g, " ");
            str = str.replace(/\s/g, "&nbsp;");
            str = str.replace(/\n/g, "&BR");

            return str;

        },
        decodeHTML: function() {
            if (this.isNullOrEmpty()) return this;
            var str = this;

            str = str.replace(/&amp;/g, "&");
            str = str.replace(/&lt;/g, "<");
            str = str.replace(/&gt;/g, ">");
            str = str.replace(/&apos;/g, "\'");
            str = str.replace(/&quot;/g, "\"");
            str = str.replace(/&nbsp;&nbsp;&nbsp;&nbsp;/g, "\t");
            str = str.replace(/&nbsp;/g, " ");
            str = str.replace(/&BR/g, "\r\n");

            return str;
        },
        truncate: function(len, str) {
            if (this.length <= len) {
                return this;
            } else {
                return this.substring(0, len) + str;
            }
        },
        getUrlQuery: function(name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
            var r = this.substr(this.indexOf("\?") + 1).match(reg);
            if (r != null) return unescape(r[2]);
            return null;
        },
        appendUrlPram: function(name, val) {
            var index = this.indexOf(name + '=');
            if (index > 0) {
                var endPos = this.indexOf('&', index);
                if (endPos > index) return this.replace('/' + this.substr(index, endPos - index) + '/', name + '=' + val);
                else return this.substr(0, index) + name + '=' + val;
            } else return this.indexOf('?') > 0 ? (this + '&' + name + '=' + val) : (this + '?' + name + '=' + val);
        }
    });


    /**
     * 添加StringBuilder类,提高对字符串操作的效率
     */
    function StringBuilder(str) {
        this._strings = new Array();
        this.append(str);
    }
    Object.extend(StringBuilder.prototype, {
        append: function(str) {
            this._strings.push(a);
            return this;
        },
        toString: function() {
            var a = (arguments.length == 0) ? "" : arguments[0];
            return this._strings.join(a);
        }
    });


    /**
     * 对Date的扩展方法
     */
    Object.extend(Date.prototype, {
        format: function(formatStr) {
            var o = {
                'M+': this.getMonth() + 1, //月
                'd+': this.getDate(), //日
                'h+': this.getHours(), //小时
                'm+': this.getMinutes(), //分
                's+': this.getSeconds(), //秒
                'q+': Math.floor((this.getMonth() + 3) / 3), //季度
                'S': this.getMilliseconds() //毫秒
            }
            if (/(y+)/.test(formatStr)) {
                formatStr = formatStr.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
            }
            for (var k in o) {
                if (new RegExp("(" + k + ")").test(fomartStr))
                    formatStr = formatStr.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
                return formatStr;
            }
        },
        addDays: function(num) {
            this.setDate(this.getDate + num);
            return this;
        },
        addWeeks: function(num) {
            return this.addDays(num * 7);
        },
        addMonths: function(num) {
            var d = this.getDate();
            this.setMonth(this.getMonth() + num);
            if (this.getDate < d) {
                this.setDate(0);
            }
            return this;
        },
        addYears: function(num) {
            var m = this.getMonth();
            this.setFullYear(this.getFullYear() + num);
            if (m < this.getMonth()) {
                this.setDate(0);
            }
            return this;
        },
        isValiDate: function(dateStr, formatStr) {
            if (!dateStr) {
                return false;
            }
            if (!formatStr) {
                formatStr = "yyyy-MM-dd"; //默认格式:yyyy-MM-dd
            }
            if (dateStr.length != formatStr.length) {
                return false;
            } else {
                if (formatStr == "yyyy-MM-dd" || formatStr == "YYYY-MM-DD") {
                    var r1 = /^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8]))))))$/;
                    return r1.test(dateStr);
                } else if (formatStr == "yyyy/MM/dd" || formatStr == "YYYY/MM/DD") {
                    var r2 = /^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8]))))))$/;
                    return r2.test(dateStr);
                } else if (formatStr == "MM-dd-yyyy" || formatStr == "MM-DD-YYYY") {
                    var r3 = /^((((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9])))-(((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8])))))-d{2}(([02468][1235679])|([13579][01345789])))$/;
                    return r3.test(dateStr);
                } else if (formatStr == "MM/dd/yyyy" || formatStr == "MM/DD/YYYY") {
                    var r4 = /^((((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9])))\/(((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8])))))\/d{2}(([02468][1235679])|([13579][01345789])))$/;
                    return r4.test(dateStr);
                } else {
                    //                throw  new Error('日期格式不正确');
                    return false;
                }
            }
            return false;
        },
        isValiTime: function(timeStr, formatStr) {
            if (!timeStr) {
                return false;
            }
            if (!formatStr) {
                formatStr = "hh:mm:ss"; //默认格式:hh:mm:ss
            }
            if (timeStr.length != formatStr.length) {
                return false;
            } else {
                if (formatStr == "hh:mm:ss") {
                    var r1 = /^(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])$/;
                    return r1.test(timeStr);
                } else if (formatStr == "hh-mm-ss") {
                    var r2 = /^(([0-1][0-9])|(2[0-3]))-([0-5][0-9])-([0-5][0-9])$/;
                    return r2.test(timeStr);
                } else if (formatStr == "hh/mm/ss") {
                    var r3 = /^(([0-1][0-9])|(2[0-3]))\/([0-5][0-9])\/([0-5][0-9])$/;
                    return r3.test(timeStr);
                } else {
                    //                throw  new Error("时间格式不正确!");
                    return false;
                }
            }
            return false;
        },
        isValiDateTime: function(dateTimeStr) {
            var dateTimeReg = /^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8]))))))(s{1}(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9]))?$/
            return dateTimeReg.test(dateTimeStr);
        },
        isLeapYear: function() {
            return (this.getYear() % 4 == 0 && ((this.getYear() != 0) || (this.getYear() % 400 == 0)));
        },
        daysBetween: function(dateOne, dateTwo) {
            if ((dateOne instanceof Date) == false || (dateTwo instanceof Date) == false) {
                return 0;
            } else {
                return Math.abs(Math.floor((dateOne.getTime() - dateTwo.getTime()) / 1000 / 60 / 60 / 24));
            }
        },
        dateDiff: function(dtEnd, field) {
            var dtStart = this;
            if ((dtEnd instanceof Date) == false) {
                return 0;
            } else {
                if (!field) {
                    field = "d";
                }
                switch (field) {
                    case 'Y':
                    case 'y':
                        return dtEnd.getFullYear() - dtStart.getFullYear();
                        break;
                    case 'M':
                        return (dtEnd.getMonth() + 1) + ((dtEnd.getFullYear() - dtStart.getFullYear()) * 12) - (dtStart.getMonth() + 1);
                        break;
                    case 'W':
                    case 'w':
                        return parseInt((dtEnd - dtStart) / (86400000 * 7));
                        break;
                    case 'D':
                    case 'd':
                        return parseInt((dtEnd - dtStart) / 86400000);
                        break;
                    case 'H':
                    case 'h':
                        return parseInt((dtEnd - dtStart) / 3600000);
                        break;
                    case 'm':
                        return parseInt((dtEnd - dtStart) / 60000);
                        break;
                    case 'S':
                    case 's':
                        return parseInt((dtEnd - dtStart) / 1000);
                        break;
                    default:
                        return 0;
                }
                return 0;
            }
        },
        toArray: function() {
            var myArray = new Array();
            myArray[0] = this.getFullYear();
            myArray[1] = this.getMonth();
            myArray[2] = this.getDate();
            myArray[3] = this.getHours();
            myArray[4] = this.getMinutes();
            myArray[5] = this.getSeconds();
            return myArray;
        },
        datePart: function(field) {
            if (!field) {
                field = "d";
            }
            var Week = ['日', '一', '二', '三', '四', '五', '六'];
            switch (field) {
                case 'Y':
                case 'y':
                    return this.getFullYear();
                    break;
                case 'M':
                    return (this.getMonth() + 1);
                    break;
                case 'W':
                case 'w':
                    return Week[this.getDay()];
                    break;
                case 'D':
                case 'd':
                    return this.getDate();
                    break;
                case 'H':
                case 'h':
                    return this.getHours();
                    break;
                case 'm':
                    return this.getMinutes();
                    break;
                case 's':
                    return this.getSeconds();
                    break;
                default:
                    return this.getDate();
            }
            return this.getDate();
        }
    });


    /**
     * 对ajax的扩展
     * 调用示例:
     * new HttpAjax({
            type:"get",
            url:"testAjax.php",
            data:{"name":'Jack'},
            success:function(data){
                console.log(data);
            },
            failure:function(data){
                console.log(data);
            },
            isAsyn:false
        });
     */
    HttpAjax = (function() {
        function HttpAjax(options) {
            var settings = {
                type: 'post', //请求类型
                url: '', //请求地址
                data: { "id": -1 }, //json格式的参数
                success: function() {}, //成功的回调函数
                failure: function() {}, //失败的回调函数
                isAsyn: true //是否为异步
            };
            this.options = Object.extend(settings, options);

            Object.extend(HttpAjax.prototype, {
                _createXhr: function() {
                    if (typeof XMLHttpRequest !== 'undefined') {
                        return new XMLHttpRequest();
                    } else if (typeof ActiveXObject !== 'undefined') {
                        var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];
                        for (var i = 0, len = versions.length; i < len; i++) {
                            try {
                                var xhr = new ActiveXObject(versions[i]);
                                this.IsCreateOk = versions[i];
                                return xhr;
                            } catch (e) {}
                        }
                        if (typeof this.IsCreateOk === 'undefined') {
                            throw new Error("您的浏览器版本过低,无法创建异步对象,请升级您的浏览器!");
                        }
                    }
                },
                _encodeData: function(paramters) {
                    var data = [];
                    for (var name in paramters) {
                        //将数组中的数据以=拼接后再添加到data数组中 [name=aa,age=11]
                        var _regesp = /%20/g; //空格的正则表达式
                        var _value = paramters[name].toString(); //获取值
                        data.push(encodeURIComponent(name).replace(_regesp, '+') + "=" + encodeURIComponent(_value).replace(_regesp, '+'));
                    }
                    //以&将数组元素拼接后返回 如:name=aa&age=11
                    return data.join("&");
                },
                _regCallback: function(xhr) {
                    var _this = this;
                    xhr.onreadystatechange = function() {
                        if (xhr.readyState == 4) {
                            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 300) {
                                _this.options.success(_this._getResponseData(xhr), xhr.statusText);
                            } else {
                                _this.options.failure(xhr.status, xhr.statusText);
                            }
                        }
                    }
                },
                _getResponseData: function(xhr) {
                    var responseType = xhr.getResponseHeader("Content-Type");
                    switch (responseType) {
                        case 'text/xml':
                            return xhr.responseXML;
                        case 'text/json':
                        case 'text/javascript':
                        case 'application/javascript':
                        case 'application/x-javascript':
                            return eval('(' + xhr.responseText + ')');
                        default:
                            return xhr.responseText;
                    };
                },
                _init: function(options) {
                    this.options = options;
                    if (this.options.url == "") return;
                    this.xhr = this._createXhr(); //创建异步对象
                    this._regCallback(this.xhr); //注册回调事件

                    //根据请求类型,发送异步请求
                    if (this.options.type.toLowerCase() == "post") {
                        this._post(this.xhr);
                    } else {
                        this._get(this.xhr);
                    }
                },
                _post: function(xhr) {
                    this.xhr = xhr;
                    this.data = this._encodeData(this.options.data);
                    this.url = this.options.url + "?d=" + parseInt(Math.random() * 100 + 1, 10);
                    this.asyn = !!this.options.isAsyn;

                    xhr.open("POST", this.url, this.asyn);
                    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                    xhr.send(this.data);
                },
                _get: function(xhr) {
                    this.xhr = xhr;
                    this.data = this._encodeData(this.options.data);
                    this.url = this.options.url + '?' + this.data + '&d=' + parseInt(Math.random() * 100 + 1, 10);
                    this.asyn = !!this.options.isAsyn;

                    xhr.open('GET', this.url, this.asyn);
                    xhr.send(null);
                }
            });
            this._init(this.options);
        };
        return HttpAjax;
    })(window);


    /**
     * 对cookie的扩展
     */
    Object.extend(Document.cookie.prototype, {
        setCookie: function(name, value, days) {
            var d = new Date();
            d.setDate(d.getDate() + days);
            document.cookie = name + '=' + value + ';expires' + d;
        },
        getCookie: function(name) {
            var arr = document.cookie.split(',');
            for (var i = 0, len = arr.length; i < len; i++) {
                var keyV = arr[i].split('=');
                if (keyV[0] == name) {
                    return keyV[1];
                }
            }
            return '';
        },
        removeCookie: function(name) {
            setCookie(name, '', -1);
        }
    });


})(window)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 24,861评论 7 249
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,500评论 1 180
  • 早上我们早早的起了,这几天早起我们都够累的了,这几天感觉睡眠都不够了只能在大巴车上睡,然而我们先去了乳胶展示厅,这...
    IversonKobe3824阅读 309评论 0 1
  • 这鸡年的春儿,当然得由咱姐妹儿几个来开道哟! 你瞅蚕豆这一溜溜儿的媚眼,你能不觉着春光美吗? 介几个探头探脑的蚕豆...
    铃兰空地阅读 209评论 0 1
  • 一席之地 是一张疲乏的躯壳可以歇息的床板 你的臂膀 是心灵深处最渴望的甘泉 她给予的不是温饱 是生存的意识 是想要...
    小糊童Mr阅读 129评论 0 0