PageSourceSearch

https://jingan.gov.cn/js/libs/futil.js

js jingan.gov.cn collected 2026-10-02 06:06:17 UTC 33,595 bytes, 956 lines download raw bytes

1// 工具方法
2
3if (!window.FUtil) {
4    window.FUtil = {};
5}
6$.extend(window.FUtil, {
7    /**
8     * 获取数组中指定属性的最大值
9     * @param {Array} arr 数组
10     * @param {String} key 指定属性
11     * @returns {Number} 最大数值
12     * @example [{key:166},{key:200},{key:33}]=>getMax(arr,'key);=>200
13     */
14    getMax: function(arr, key) {
15        var max = 0,
16            len = arr.length;
17        for (var i = 0; i < len; i++) {
18            var item = arr[i][key];
19            if (max < item) max = item;
20        }
21        return max;
22    },
23    /**
24     * 获取数组中指定属性的最小值
25     * @param {Array} arr 数组
26     * @param {String} key 指定属性
27     * @returns {Number} 最小值
28     * @example [{key:166},{key:200},{key:33}]=>getMax(arr,'key);=>33
29     */
30    getMin: function(arr, key) {
31        if (arr.length === 0) return;
32        var min = arr[0][key],
33            len = arr.length;
34        for (var i = 1; i < len; i++) {
35            var item = arr[i][key];
36            if (min > item) min = item;
37        }
38        return min;
39    },
40    /**
41     * 获取数组指定属性的和
42     * @param {Array} arr 数组
43     * @param {String} key 指定属性
44     * @returns {Number} 和
45     * @example [{key:166},{key:200},{key:33}]=>getSum(arr,'key);=>399
46     */
47    getSum: function(arr, key) {
48        var sum = 0,
49            len = arr.length;
50        for (var i = 0; i < len; i++) {
51            sum += arr[i][key];
52        }
53        return sum;
54    },
55    /**
56     * 获取数组中指定属性的数组
57     * @param {Array} arr 源数组
58     * @param {String} key 指定属性
59     * @returns {Array} 目标数组
60     * @example [{key:166},{key:200},{key:33}]=>getValArr(arr,'key);=>[166,200,33]
61     */
62    getValArr: function(arr, key) {
63        var val = [],
64            len = arr.length;
65        for (var i = 0; i < len; i++) {
66            val.push(arr[i][key]);
67        }
68        return val;
69    },
70    /**
71     * 快速渲染数字
72     * @param {String} space 命名空间
73     * @param {Object} data 数据
74     * @param {Function} filterFn 过滤函数,处理渲染结果,比如加单位
75     */
76    renderNum: function(space, data, filterFn) {
77        for (var i in data) {
78            if (Object.prototype.hasOwnProperty.call(data, i)) {
79                var $dom = $('#' + space + '-' + i);
80                if ($dom.length > 0) {
81                    $dom.text(filterFn ? filterFn(data[i]) : data[i]);
82                }
83            }
84        }
85    },
86    /**
87     * 获取百分比
88     * @param {Number} max 总数
89     * @param {Number} data 数据
90     * @param {Number} fixed 精确到小数点位数,可不传,默认为0
91     * @param {Number} unit 配置单位,可不传,默认%,不要百分号传""
92     */
93    getPercent: function(max, data, fixed, unit) {
94        var _fixed = fixed || 0,
95            unit = unit == "" ? "" : (unit || '%');
96        return max == 0 ? percent = 0 + unit : (data / max * 100).toFixed(_fixed) + unit;
97    },
98    /**
99     * 图表自动切换展示tooltip
100     * @param {Object} chart 图表实例
101     * @param {Number} length 图表数据量
102     * @param {Number} interval 切换间隔,单位ms
103     */
104    showTooltip: function(chart, length, interval) {
105        chart.dataLength = length;
106        chart.currentIndex = 0;
107        clearInterval(chart.timer);
108        chart.interval = interval || 3000;
109        chart.timer = setInterval(function() {
110            if (chart.currentIndex === chart.dataLength) {
111                chart.currentIndex = 0;
112            }
113            chart.dispatchAction({
114                type: 'showTip',
115                seriesIndex: 0,
116                dataIndex: chart.currentIndex
117            });
118            chart.currentIndex++;
119        }, chart.interval);
120    },
121    // 鼠标悬浮到图表,停止showTooltip
122    chartHover: function(chart, length, interval) {
123        chart.on('mouseover', function() {
124            clearInterval(chart.timer);
125        });
126        chart.on('mouseout', function() {
127            FUtil.showTooltip(chart, length, interval);
128        });
129    },
130    /**
131     * 自定义高亮,可配置高亮触发行为、高亮类名、回调等。
132     * @param {Object} $ct 被委托jq容器
133     * @param {String} target 委托监听目标选择器字符串
134     * @param {Function} successFn 成功回调
135     * @param {String} event 触发行为,可不传,默认监听click事件
136     * @param {String} activeClass 高亮类名,可不传,默认active
137     */
138    activeDom: function($ct, target, successFn, event, activeClass) {
139        var cls = activeClass || 'active';
140        $ct.on(event || 'click', target, function(e) {
141            var $this = $(this);
142            if ($this.hasClass(cls)) return;
143            $this.addClass(cls).siblings().removeClass(cls);
144            // successFn接收点击事件和点击目标的jq对象作为参数
145            successFn(e, $this);
146            // 返回父容器jq对象,可以链式执行其他操作
147            return $ct;
148        });
149    },
150    // 数字千分位转换
151    addCommas: function(n) {
152        if (isNaN(n)) {
153            return '-';
154        }
155        n = (n + '').split('.');
156        return n[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') +
157            (n.length > 1 ? ('.' + n[1]) : '');
158    },
159    // 生成随机数
160    randNum: function(m, n) {
161        if (!n) {
162            return Math.floor(Math.random() * m);
163        } else {
164            var c = n - m + 1;
165            return Math.floor(Math.random() * c + m);
166        }
167    },
168    // echarts自适应
169    echartsResize: function() {
170        var echartsResizeTimer = null;
171        return function() {
172            $(window).on('resize', function() {
173                // 获取所有echarts容器的jQuery对象
174                var $echarts = $('[_echarts_instance_]');
175                if (echartsResizeTimer) clearTimeout(echartsResizeTimer);
176                echartsResizeTimer = setTimeout(function() {
177                    $.each($echarts, function(i, e) {
178                        // 调用echarts的api获取图表实例,执行缩放
179                        var chart = echarts.getInstanceByDom(e);
180                        chart.resize();
181                    });
182                }, 50);
183            });
184        };
185    },
186    /**
187     * 定时切换地图高亮
188     * @param {Object}chartInstance 图表实例
189     * @param {Number} length 数据长度
190     */
191    areaHight: function(chartInstance, length) {
192        chartInstance.dataLen = length;
193        chartInstance.curData = 0;
194        chartInstance.arr = [];
195        // 数据下标组成数组
196        for (var i = 0; i < chartInstance.dataLen; i++) {
197            chartInstance.arr.push(i);
198        }
199        clearInterval(chartInstance.hightTimer);
200        chartInstance.hightTimer = setInterval(function() {
201            if (chartInstance.curData === chartInstance.dataLen) {
202                chartInstance.curData = 0;
203            }
204            // 取消高亮
205            chartInstance.dispatchAction({
206                type: 'downplay',
207                seriesIndex: 0,
208                dataIndex: chartInstance.arr
209            });
210            // 高亮地图区域
211            chartInstance.dispatchAction({
212                type: 'highlight',
213                seriesIndex: 0,
214                dataIndex: chartInstance.curData
215            });
216            chartInstance.curData++;
217        }, 3000);
218    },
219    /**
220     * 地图图表专用:鼠标悬浮到地图,停止showTooltip
221     * @param {Object} chart 图表实例
222     * @param {Number} length 图表数据量
223     */
224    mapChartHover: function(chart, length) {
225        chart.on('mouseover', function() {
226            clearInterval(chart.hightTimer);
227        });
228        chart.on('mouseout', function() {
229            Util.areaHight(chart, length, chart.interval || 3000);
230        });
231    },
232    /**
233     * 加载滚动数字
234     * @param {Object} $dom dom容器
235     * @param {Number} data 数值
236     * @param {Number} figure 长度
237     */
238    scrollNum: function($dom, data, figure) {
239        if (!$dom.isScrolled) {
240            $dom.isScrolled = true;
241            $dom.ScrollNumber({
242                number: data,
243                figure: figure || (data + '').length
244            });
245        } else {
246            $dom.ScrollNumber('refresh', data);
247        }
248    },
249    /**
250     * echarts渐变色,适用双色渐变,可根据实际需求改写,方向参数可不传,默认水平方向渐变
251     * @param {String} color1 jquery dom对象
252     * @param {String} color2 html字符串
253     * @param {Number} x1 渐变色方向起点的x坐标
254     * @param {Number} y1 渐变色方向起点的y坐标
255     * @param {Number} x2 渐变色方向终点的x坐标
256     * @param {Number} y2 渐变色方向终点的y坐标
257     */
258    linearColor: function(color1, color2, x1, y1, x2, y2) {
259        return new echarts.graphic.LinearGradient(
260            ((typeof x1 === 'number') && x1 < 1) ? x1 : 1,
261            ((typeof y1 === 'number') && y1 < 1) ? y1 : 0,
262            ((typeof x2 === 'number') && x2 < 1) ? x2 : 0,
263            ((typeof y2 === 'number') && y2 < 1) ? y2 : 0, [{
264                offset: 0,
265                color: color1
266            }, {
267                offset: 1,
268                color: color2
269            }]
270        );
271    },
272    // 滚动列表
273    scrollList: function($dom, htmlStr) {
274        $dom.empty().append(htmlStr);
275        if (!$dom.isScroll) {
276            $dom.isScroll = true;
277            $dom.parent().scrollbox();
278        }
279    },
280    // 点击高亮
281    act: function($dom, fn) {
282        if ($dom.hasClass('active')) {
283            return;
284        } else {
285            var ctx = this,
286                args = Array.prototype.slice.call(arguments, 2);
287            $dom.addClass('active').siblings().removeClass('active');
288            args.unshift($dom)
289            fn && fn.apply(ctx, args);
290        }
291    },
292    /**
293     *将字符串按照固定的字数截取
294     * @param {String} str 需要处理的字符串
295     * @param {Number} num 截断间隔
296     * @param {Str} split 需要插入的字符,不传默认换行符 '\n'
297     */
298    splitStr: function(str, num, split) {
299        var splitStr = split || '\n',
300            reg = new RegExp('(\\S{' + num + '})', 'g'),
301            reg2 = new RegExp('(\\' + splitStr + ')$'),
302            fmtStr = str.replace(reg, '$1' + splitStr);
303        return fmtStr.replace(reg2, '');
304    },
305    /**
306     * 数组分组,用于多页面渲染
307     * @param {Number} num 每组元素的数量
308     * @param {Array} arr 需要处理的数组
309     */
310    getArrTrans: function(arr, num) {
311        var resultArr = [];
312        for (var i = 0, len = arr.length; i < len; i++) {
313            var page = Math.floor(i / num);
314            if (!resultArr[page]) {
315                resultArr[page] = [];
316            }
317            resultArr[page].push(arr[i]);
318        }
319        return resultArr;
320    },
321    /**
322     * 根据value查找key
323     * @param {Object} object 需要查找的对象
324     * @param {Function} predicate 查询条件
325     */
326    findKey: function(object, predicate) {
327        var result;
328        if (object == null) {
329            return result;
330        }
331        Object.keys(object).some(function(key) {
332            var value = object[key];
333            if (predicate(value, key, object)) {
334
335                result = key;
336                return true;
337            }
338        });
339        return result;
340    },
341    /**
342     * 动态载入、更新数字,需要引入插件countUp.js
343     * @param {String} space 命名空间
344     * @param {Number} data 数据
345     * @param {Object} options 插件自定义配置,可不传
346     */
347    animateRender: function(space, data, options) {
348        for (var i in data) {
349            if (Object.prototype.hasOwnProperty.call(data, i)) {
350                var $dom = $('#' + space + '-' + i),
351                    d = data[i] - 0;
352                if ($dom.length > 0) {
353                    if (!isNaN(d)) {
354                        var dotIdx = String(data[i]).indexOf('.'), //获取小数点的位置
355                            decimal = 0; // 默认整数
356                        if (dotIdx > -1) {
357                            decimal = String(data[i]).length - dotIdx - 1; //获取小数点后的个数
358                        }
359                        var countUpOption = $.extend({}, {
360                            //定义是否开启缓动
361                            useEasing: true,
362                            //是否开启分组
363                            useGrouping: false,
364                            decimalPlaces: decimal
365                        }, options || {});
366                        if (!$dom.data('countUp')) {
367                            var num = new CountUp(space + '-' + i, data[i], countUpOption);
368                            if (!num.error) {
369                                //开启滚动
370                                num.start();
371                            } else {
372                                // eslint-disable-next-line no-console
373                                console.log(num.error);
374                            }
375                            //  = num;
376                            $dom.data('countUp', num);
377                        } else {
378                            $dom.data('countUp').update(data[i]);
379                        }
380                    } else {
381                        $dom.text(data[i]);
382                    }
383                }
384            }
385        }
386    },
387    /**
388     * 载入状态,类似renderNum
389     * @param {String} space 命名空间
390     * @param {Number} data 数据
391     * @param {String} stateCls 状态名称前缀,不传默认'state'
392     */
393    renderState: function(space, data, stateCls) {
394        for (var i in data) {
395            if (Object.prototype.hasOwnProperty.call(data, i)) {
396                var $dom = $('#' + space + '-' + i);
397                if ($dom.length > 0) {
398                    $dom.attr('data-' + (stateCls || 'state'), data[i]);
399                }
400            }
401        }
402    },
403    /**
404     * 定位调试辅助方法
405     * @param {Object} $dom jquery dom对象
406     * @param {Boolean} isCss 是否转换为css
407     */
408    getPos: function($dom, isCss) {
409        $dom.on('click', function(e) {
410            var pos = this.getBoundingClientRect(),
411                psdStr = '[' + (e.pageX - pos.x - window.scrollX) + ',' + (e.pageY - pos.y - window.scrollY) + ']';
412            if (isCss) {
413                psdStr = 'left: ' + (e.pageX - pos.x - window.scrollX) + 'px;top: ' + (e.pageY - pos.y - window.scrollY) + 'px;';
414            }
415            // eslint-disable-next-line no-console
416            var target = document.createElement('div');
417            target.id = 'tempTarget';
418            target.style.opacity = '0';
419            target.style.position = 'absolute';
420            target.innerText = psdStr;
421            var range = document.createRange();
422            var target2 = document.body.appendChild(target);
423            try {
424                range = document.createRange();
425                range.selectNode(target);
426                window.getSelection().removeAllRanges();
427                window.getSelection().addRange(range);
428                document.execCommand('copy');
429                window.getSelection().removeAllRanges();
430                // eslint-disable-next-line no-catch-shadow
431            } catch (error) {}
432            target.remove();
433            target2.remove();
434        });
435    },
436    /**
437     * 删除链接中的html后缀
438     * @param {String} url 需要处理的url字符串
439     */
440    removeHtml: function(url) {
441        if (Config.debugInF9) {
442            return url.replace(/\.html/ig, '');
443        }
444        return url;
445    },
446    // 饼图自动切换
447    pieAuto: function(curChart, chartLength, timer) {
448        var mytimer = timer || 3000;
449        var app = {
450            currentIndex: -1
451        };
452        clearInterval(curChart.timer);
453        curChart.timer = setInterval(function() {
454            var dataLen = chartLength;
455            // 取消之前高亮的图形
456            curChart.dispatchAction({
457                type: 'downplay',
458                seriesIndex: 0,
459                dataIndex: app.currentIndex
460            });
461            app.currentIndex = (app.currentIndex + 1) % dataLen;
462            // 高亮当前图形
463            curChart.dispatchAction({
464                type: 'highlight',
465                seriesIndex: 0,
466                dataIndex: app.currentIndex
467            });
468            // 显示 tooltip
469            curChart.dispatchAction({
470                type: 'showTip',
471                seriesIndex: 0,
472                dataIndex: app.currentIndex
473            });
474        }, mytimer);
475    },
476
477    /**
478     * 函数防抖
479     * @param func 执行函数
480     * @param delay 延迟时间,不传默认160ms
481     */
482    debounce: function(func, delay) {
483        var timeout;
484        return function(e) {
485            clearTimeout(timeout);
486            var context = this,
487                args = arguments;
488            timeout = setTimeout(function() {
489                func.apply(context, args);
490            }, delay || 160)
491        };
492    },
493    // 去除html标签中的换行符和空格
494    clearHtml: function(html) {
495        return html.replace(/(\r\n|\n|\r)/g, "")
496            .replace(/[\t ]+\</g, "<")
497            .replace(/\>[\t ]+\</g, "><")
498            .replace(/\>[\t ]+$/g, ">");
499    },
500    /**
501     * 美化滚动条
502     * @param {*} dom 滚动条容器class或者id
503     * @param {*} subdom 直接子元素
504     * @param {*} param 滚动条配置参数,不传则使用opt默认样式
505     */
506    niceScroll: function(dom, subdom, param) {
507        var opt = $.extend({
508            cursorwidth: "6px",
509            cursorborder: 0,
510            cursorcolor: "#c7c7c7",
511            background: "rgba(37,144,235,0)",
512            autohidemode: false
513        }, param);
514        if (subdom != "") {
515            dom.niceScroll(subdom, opt);
516        } else {
517            dom.niceScroll(opt);
518        }
519    },
520    /**
521     * 重置滚动条
522     * @param {*} dom 滚动条容器class或者id
523     */
524    resetNiceScroll: function(dom) {
525        dom.getNiceScroll().resize();
526    },
527    // layer弹出层
528    layer: function(config) {
529        layer.open($.extend(config, {
530            type: 2,
531            title: false,
532            closeBtn: false,
533            shadeClose: false
534        }));
535    },
536    /**
537     * tab切换
538     * @param {*} dom tab切换dom对象
539     * @param {*} opts 配置项
540     */
541    tabview: function(dom, opts) {
542        $(dom).each(function(index, el) {
543            new TabView($.extend({
544                dom: el,
545                activeCls: 'current',
546                triggerEvent: 'click',
547                speed: 50
548            }, opts));
549        });
550    },
551    // 判断浏览器是否为IE9以下
552    isIE9Below: function() {
553        if (navigator.appName === 'Microsoft Internet Explorer') {
554            if (parseInt(navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE", "")) < 9) {
555                return true;
556            } else {
557                return false;
558            }
559        }
560    },
561    /**
562     * 日期比较
563     * @param {*} stime 开始日期
564     * @param {*} etime 结束日期
565     */
566    checkEndTime: function(stime, etime) {
567        var start = new Date(stime.replace("-", "/").replace("-", "/")),
568            end = new Date(etime.replace("-", "/").replace("-", "/"));
569        if (end < start) {
570            return false;
571        }
572        return true;
573    },
574    /**
575     * 多行省略
576     * @param {*} $dom dom对象
577     * @param {*} rowNumber 行数
578     * @param {*} offset 最后一行偏移量,默认1,即右侧不空位置
579     */
580    multilineEllipsis: function($dom, rowNumber, offset) {
581        var offsetNumer = offset || 1,
582            txt = $.trim($dom.text()),
583            txtFontSize = parseInt($dom.css("fontSize").split("px")[0]),
584            wordsNumber = Math.floor($dom.width() / txtFontSize);
585        if (txt.length > wordsNumber * (rowNumber - offset + 1)) {
586            $dom.text(txt.substring(0, (rowNumber - 1) * wordsNumber + wordsNumber / offsetNumer) + "...");
587        }
588    },
589    // 页面尺寸发生变化时
590    pageResize: function(callback, time) {
591        var resizeTimer = null;
592        $(window).on('resize', function() {
593            if (resizeTimer) {
594                clearTimeout(resizeTimer);
595            }
596            resizeTimer = setTimeout(function() {
597                callback();
598            }, time || 400);
599        });
600    },
601    // 按照格式输出日期,如:yyyy-MM-dd HH:mm:ss
602    dateFormat: function(date, fmt) {
603        var o = {
604            "M+": date.getMonth() + 1, //月份
605            "d+": date.getDate(), //日
606            "h+": date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, //小时
607            "H+": date.getHours(), //小时
608            "m+": date.getMinutes(), //分
609            "s+": date.getSeconds(), //秒
610            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
611            "S": date.getMilliseconds() //毫秒
612        };
613        var week = {
614            "0": "\u65e5",
615            "1": "\u4e00",
616            "2": "\u4e8c",
617            "3": "\u4e09",
618            "4": "\u56db",
619            "5": "\u4e94",
620            "6": "\u516d"
621        };
622        if (/(y+)/.test(fmt)) {
623            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
624        }
625        if (/(E+)/.test(fmt)) {
626            fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[date.getDay() + ""]);
627        }
628        for (var k in o) {
629            if (new RegExp("(" + k + ")").test(fmt)) {
630                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
631            }
632        }
633        return fmt;
634    },
635    // 获取url参数值
636    getUrlParams: function(name) {
637        var params = {},
638
639            query = location.search.substring(1),
640            arr = query.split('&'),
641            rt;
642
643        $.each(arr, function(i, item) {
644            var tmp = item.split('='),
645                key = tmp[0],
646                val = decodeURIComponent(tmp[1]);
647
648            if (typeof params[key] == 'undefined') {
649                params[key] = val;
650
651            } else if (typeof params[key] == 'string') {
652                params[key] = [params[key], val];
653
654            } else {
655                params[key].push(val);
656            }
657        });
658
659        rt = name ? params[name] : params;
660
661        return rt;
662    },
663    // 是否为移动端
664    isMobile: function() {
665        var ua = navigator.userAgent;
666
667        var detect = {
668            // 是否为移动终端
669            mobile: !!ua.match(/AppleWebKit.*Mobile.*/),
670            // ios终端
671            ios: !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
672            // android终端或者uc浏览器
673            android: ua.indexOf('Android') > -1 || ua.indexOf('Linux') > -1,
674            // 是否为iPhone或者QQHD浏览器
675            iPhone: ua.indexOf('iPhone') > -1,
676            // 是否iPad
677            iPad: ua.indexOf('iPad') > -1
678        };
679
680        return (detect.mobile || detect.ios || detect.android || detect.iPhone || detect.iPad);
681    },
682    /**
683     * 设置左右等高
684     * @param {*} left 左侧容器
685     * @param {*} right 右侧容器
686     */
687    setEqualHeight: function(left, right) {
688        var l = $(left).height(),
689            r = $(right).height();
690        $(left + "," + right).css('height', l > r ? l : r);
691    },
692    /**
693     * 排序
694     * @param {*} data 数组
695     * @param {*} key 排序字段,默认"value"
696     * @param {*} order 排序顺序,默认降序"0"
697     */
698    sort: function(data, sortField, order) {
699        var order = order || 0,
700            sortField = sortField || "value";
701        var compare = function(key) {
702            return function(value1, value2) {
703                var val1 = value1[key];
704                var val2 = value2[key];
705                if (order == 0) {
706                    return val2 - val1;
707                } else {
708                    return val1 - val2;
709                }
710            }
711        }
712        return data.sort(compare(sortField))
713    },
714    /**
715     * 文字滚动
716     * @param {*} dom 文字滚动的class
717     * @param {*} config 配置项
718     */
719    liMarquee: function(dom, config) {
720        var dom = dom || ".text-scroll";
721        $(dom).liMarquee($.extend({
722            runshort: false,
723            scrollamount: 20
724        }, config));
725    },
726    /**
727     * 进度条动画
728     * @param {*} space 命名空间
729     * @param {*} speed 速度,默认200
730     * @param {*} callback 回调
731     */
732    progressBar: function(space, speed, callback) {
733        $("." + space + "-" + "percent").each(function(i, e) {
734            $(this).stop().animate({
735                "width": $(this).attr("data-width")
736            }, speed || 200, function() {
737                callback
738            });
739        });
740    },
741    /**
742     * @name 判断数据是否为数组
743     * @param {Object|Array} data
744     * @return {Booleam} 返回值
745     */
746    isArray: function(data) {
747        return Object.prototype.toString.call(data) === "[object Array]";
748    },
749    /**
750     * mustache 模板渲染
751     * @param {*} id 模板id
752     * @param {*} data 数据
753     */
754    mustache: function(id, data) {
755        var isArray = this.isArray(data);
756        data = isArray ? {
757            items: data
758        } : data;
759        var dom = document.getElementById(id);
760        var tpl = dom ? dom.innerHTML : dom;
761        return Mustache.render(tpl, data);
762    },
763    /**
764     * @name 为状态添加文字表述
765     * @param {Object|Array} data
766     * @example
767     *      var data= [{status:1},{status:2},...]
768     *      Util.setStatusText(data,'status','statusText',{
769     *          1:'待提交',
770     *          2:'提交完成'
771     *      })
772     *      // [{status:1,statusText:'待提交'},{status:2,statusText:'提交完成'},...]
773     */
774    setStatusText: function(data, key, name, status) {
775        if (Util.isArray(data)) {
776            $(data).each(function() {
777                Util.setStatusText(this, key, name, status);
778            });
779        } else {
780            for (var k in status) {
781                if (data[key] == k) data[name] = status[k];
782            }
783        }
784    },
785    /**
786     * @name 根据关键字自定义字符串
787     * @param {Object|Array} data 数据
788     * @param {String} value 关键字
789     * @param {String} replace 自定义规则  - {{name}} 中的 name 表示需要查找的值的字段名
790     * @return {array}
790 带有高亮的数组
791     * @example
792     *      var data =[{name:'我要给这段话中的这段话添加高亮'}]
793     *      Util.replaceStrByKey(data,'这段话','<span style="color:#f00">{{name}}</span>')
794     *      // [{name:'我要给这段话中的这段话添加高亮',replaceName:"我要给<span stype="color:#f00">这段话<span>中的<span stype="color:#f00">这段话<span>添加高亮"}]
795     */
796    replaceStrByKey: function(data, key, replace) {
797        var value = key.toString().replace(/\s*/g, ""),
798            regValue = new RegExp(value, "g"),
799            matchName = replace.match(/{{([\s\S]*?)}}/),
800            name = matchName[1].replace(/\s*/g, ""),
801            replaceName = matchName[0],
802            regName = new RegExp(replaceName, "g");
803
804        if (Util.isArray(data)) {
805            $.each(data, function() {
806                var v = this[name].toString();
807                this["search" + name] = v.replace(regValue, function(str) {
808                    return "<span>" + str + "</span>";
809                });
810            });
811        } else {
812            var v = data[name].toString();
813            data["replace" + name] = v.replace(regValue, function(str) {
814                return replace.replace(regName, str);
815            });
816        }
817
818        return data;
819    },
820    // 获取目标的类型
821    getType: function(obj) {
822        var s = Object.prototype.toString.call(obj);
823        return s.substring(8, s.length - 1).toLowerCase();
824    },
825    /**
826     *  设置多Y轴同步分割段数
827     * @param {*} chart 图表实例
828     * @param {*} data 图表数据
829     * @param {*} keyArr value的key值['key1','key2',...]
830     * @param {*} segment 分割段数,默认5
831     */
832    alignSplitLine: function(chart, data, keyArr, segment) {
833        var option = [];
834        $.each(keyArr, function(i, e) {
835            var max = parseInt(FUtil.getMax(data, e)),
836                maxArr = (max + "").split(""),
837                numlength = maxArr.length,
838                value = 0;
839            if (max < 1000) {
840                value = (parseInt(maxArr[0]) + 1) * Math.pow(10, numlength - 1);
841            } else {
842                value = parseInt(maxArr[0]) * Math.pow(10, numlength - 1) + (parseInt(maxArr[1]) + 1) * Math.pow(10, numlength - 2);
843            }
844            option.push({
845                max: value,
846                interval: value / (segment || 5)
847            });
848        });
849        chart.setOption({
850            yAxis: option
851        });
852    },
853    /**
854     * 读秒倒计时
855     * @param K:秒数,id:容器id
856     * @param successcallback 读秒结束回调
857     */
858    secondCountDown: function(K, id, successcallback) {
859        document.getElementById(id).innerText = K;
860        K = K - 1;
861        if (K >= 0) {
862            var timer = setTimeout(function() {
863                FUtil.secondCountDown(K, id, successcallback);
864            }, 1000);
865        } else {
866            successcallback();
867        }
868    },
869    /**
870     * 页面resize事件优化
871     * @param {*} callback 回调
872     * @param {*} time 响应时间
873     */
874    pageResize: function(callback, time) {
875        var resizeTimer = null;
876        $(window).on('resize', function() {
877            if (resizeTimer) {
878                clearTimeout(resizeTimer);
879            }
880            resizeTimer = setTimeout(function() {
881                callback();
882            }, time || 400);
883        });
884    },
885    /**
886     * 日期比较
887     * @param {*} stime 开始日期
888     * @param {*} etime 结束日期
889     */
890    checkEndTime: function(stime, etime) {
891        var start = new Date(stime.replace("-", "/").replace("-", "/")),
892            end = new Date(etime.replace("-", "/").replace("-", "/"));
893        if (end < start) {
894            return false;
895        }
896        return true;
897    },
898    /**
899     * layer弹出层
900     * @param {*} config 配置项
901     * @param {*} isParent 是否parent打开,默认false
902     */
903    layer: function(config, isParent) {
904        var openState = isParent || false;
905        var par = $.extend(config, {
906            type: 2,
907            title: false,
908            closeBtn: false,
909            shadeClose: false
910        });
911        openState ? parent.layer.open(par) : layer.open(par)
912    },
913    /**
914     * @name 渲染分页
915     * @param {id} string 分页标签的id
916     * @param {Nubmer}  pageindex 当前页
917     * @param {Nubmer} pagesize 每页条目数
918     * @param {Nubmer}  total 总页数
919     * @param {Function} fn 分页按钮点击之后触发的函数
920     */
921    renderPager: function(id, pageindex, pagesize, total, fn) {
922        var $pager = $(document.getElementById(id));
923        if ($pager.pagination()) {
924            $pager.pagination("setPageIndex", pageindex);
925            $pager.pagination("setPageSize", pagesize);
926            $pager.pagination("render", total);
927        } else {
928            var pagerConfig = {
929                pageIndex: pageindex,
930                pageSize: pagesize,
931                pageBtnCount: 7,
932                total: total,
933                showInfo: true,
934                showJump:true,
935                infoFormat: "{currentPageIndex}/{allPage} 共 {total}条"
936            };
937            if (FUtil.isMobile()) {
938                $pager.pagination($.extend(pagerConfig, {
939                    pageBtnCount: 3,
940                    showFirstLastBtn: false,
941                    showInfo: false,
942                    showJump:true,
943                    showPageSizes: false
944                }));
945            } else {
946                $pager.pagination(pagerConfig);
947            }
948            $pager.on("pageClicked jumpClicked pageSizeChanged", function(e, data) {
949                fn && fn(data.pageIndex, data.pageSize);
950            });
951        }
952        $pager.toggle(pagesize < total);
953    }
954
955
956});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.