|
@@ -0,0 +1,629 @@
|
|
|
+
|
|
|
+
|
|
|
+import { saveAs } from 'file-saver'
|
|
|
+import {apiGetExportMsg, apiGetModel,} from '../api/api'
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const checkNull = val => val === undefined || val === null
|
|
|
+
|
|
|
+const until = {
|
|
|
+
|
|
|
+ ratioCalculation(a, b) {
|
|
|
+ let num = null
|
|
|
+ if (a !== '-' && b !== '-') {
|
|
|
+ if (a === '0.00' || a === 0) {
|
|
|
+ num = 0
|
|
|
+ } else if (b === '0.00' || b === 0) {
|
|
|
+ num = '-'
|
|
|
+ } else {
|
|
|
+ num = Math.round((Number(a)/Number(b)*100))+'%'
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ num = '-'
|
|
|
+ }
|
|
|
+ return num
|
|
|
+ },
|
|
|
+
|
|
|
+ downloadPer(url,fileName, idss, idsmo) {
|
|
|
+ let params = null
|
|
|
+ if (!idsmo) {
|
|
|
+ params = {
|
|
|
+ ids: idss ? idss.join(',') : ''
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ params = {
|
|
|
+ idsMv: idss ? idss.join(',') : '',
|
|
|
+ idsBcr: idsmo ? idsmo.join(',') : '',
|
|
|
+ }
|
|
|
+ }
|
|
|
+ apiGetExportMsg(url,params).then(datas =>{
|
|
|
+ let blob = new Blob([datas])
|
|
|
+ saveAs(blob, fileName)
|
|
|
+ }).catch((r) => {
|
|
|
+ console.error(r)
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ downloadTemplate(url, params, proName) {
|
|
|
+ apiGetModel(url,params).then(datas =>{
|
|
|
+ let blob = new Blob([datas])
|
|
|
+ saveAs(blob, proName)
|
|
|
+ }).catch((r) => {
|
|
|
+ console.error(r)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getTime(date){
|
|
|
+ var y = date.getFullYear();
|
|
|
+ var m = date.getMonth() + 1;
|
|
|
+ m = m < 10 ? ('0' + m) : m;
|
|
|
+ var d = date.getDate();
|
|
|
+ d = d < 10 ? ('0' + d) : d;
|
|
|
+ var h = date.getHours();
|
|
|
+ h=h < 10 ? ('0' + h) : h;
|
|
|
+ var minute = date.getMinutes();
|
|
|
+ minute = minute < 10 ? ('0' + minute) : minute;
|
|
|
+ var second=date.getSeconds();
|
|
|
+ second=second < 10 ? ('0' + second) : second;
|
|
|
+ return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second;
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+ changePowerPickDate(val) {
|
|
|
+ let endss = val.substring(val.length-2, val.length) * 1
|
|
|
+ let startTime = val.substring(0, val.length-2)
|
|
|
+ let allTime = ''
|
|
|
+ if (0 <= endss && endss < 15) {
|
|
|
+ allTime = startTime + '00'
|
|
|
+ } else if (15 <= endss && endss < 30) {
|
|
|
+ allTime = startTime + '15'
|
|
|
+ } else if (30 <= endss && endss < 45) {
|
|
|
+ allTime = startTime + '30'
|
|
|
+ } else if (45 <= endss && endss < 60) {
|
|
|
+ allTime = startTime + '45'
|
|
|
+ }
|
|
|
+ return allTime
|
|
|
+ },
|
|
|
+ changeElectricPickDate(val) {
|
|
|
+ let endss = val.substring(val.length-2, val.length) * 1
|
|
|
+ let startTime = val.substring(0, val.length-2)
|
|
|
+ let allTime = ''
|
|
|
+ if (0 <= endss && endss < 10) {
|
|
|
+ allTime = startTime + '00'
|
|
|
+ } else if (10 <= endss && endss < 20) {
|
|
|
+ allTime = startTime + '10'
|
|
|
+ } else if (20 <= endss && endss < 30) {
|
|
|
+ allTime = startTime + '20'
|
|
|
+ } else if (30 <= endss && endss < 40) {
|
|
|
+ allTime = startTime + '30'
|
|
|
+ } else if (40 <= endss && endss < 50) {
|
|
|
+ allTime = startTime + '40'
|
|
|
+ } else if (50 <= endss && endss < 60) {
|
|
|
+ allTime = startTime + '50'
|
|
|
+ }
|
|
|
+ return allTime
|
|
|
+ },
|
|
|
+ oninput(str, limit, type, zero) {
|
|
|
+ if (zero) {
|
|
|
+ if (str.substr(0, 1) === '.' || str.substr(0, 1) === '-') {
|
|
|
+ str = ''
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (str.substr(0, 1) === '.' || str.substr(0, 1) === '-' || str.substr(0, 1) === '0') {
|
|
|
+ str = ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (type === 'float') {
|
|
|
+ str = str.replace(/[^\d^\.]+/g, '')
|
|
|
+ if (limit === 1) {
|
|
|
+ str = str.replace(/^\D*([0-9]\d*\.?\d{0,1})?.*$/, '$1')
|
|
|
+ } else if (limit === 2) {
|
|
|
+ str = str.replace(/^\D*([0-9]\d*\.?\d{0,2})?.*$/, '$1')
|
|
|
+ } else if (limit === 3) {
|
|
|
+ str = str.replace(/^\D*([0-9]\d*\.?\d{0,3})?.*$/, '$1')
|
|
|
+ } else if (limit === 4) {
|
|
|
+ str = str.replace(/^\D*([0-9]\d*\.?\d{0,4})?.*$/, '$1')
|
|
|
+ } else if (limit === 6) {
|
|
|
+ str = str.replace(/^\D*([0-9]\d*\.?\d{0,6})?.*$/, '$1')
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ str = str.replace(/[^\d^]+/g, '')
|
|
|
+ str = str.substring(0, limit)
|
|
|
+ }
|
|
|
+ return str
|
|
|
+ },
|
|
|
+ sortBy(attr,rev){
|
|
|
+
|
|
|
+ if(rev == undefined){
|
|
|
+ rev = 1;
|
|
|
+ }else{
|
|
|
+ rev = (rev) ? 1 : -1;
|
|
|
+ }
|
|
|
+ return function(a,b){
|
|
|
+ a = a[attr];
|
|
|
+ b = b[attr];
|
|
|
+ if(a < b){
|
|
|
+ return rev * -1;
|
|
|
+ }
|
|
|
+ if(a > b){
|
|
|
+ return rev * 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ * 字母大小写切换
|
|
|
+ * @param str 要处理的字符串
|
|
|
+ * @param type 1:首字母大写其余小写 2:首子母小写其余大写 3:大小写转换 4:全部大写 5:全部小写
|
|
|
+ */
|
|
|
+ strChangeCase(str, type) {
|
|
|
+ function ToggleCase(str) {
|
|
|
+ var itemText = ""
|
|
|
+ str.split("").forEach(
|
|
|
+ function (item) {
|
|
|
+ if (/^([a-z]+)/.test(item)) {
|
|
|
+ itemText += item.toUpperCase();
|
|
|
+ } else if (/^([A-Z]+)/.test(item)) {
|
|
|
+ itemText += item.toLowerCase();
|
|
|
+ } else {
|
|
|
+ itemText += item;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return itemText;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case 1:
|
|
|
+ return str.replace(/^(\w)(\w+)/, function (v, v1, v2) {
|
|
|
+ return v1.toUpperCase() + v2.toLowerCase();
|
|
|
+ });
|
|
|
+ case 2:
|
|
|
+ return str.replace(/^(\w)(\w+)/, function (v, v1, v2) {
|
|
|
+ return v1.toLowerCase() + v2.toUpperCase();
|
|
|
+ });
|
|
|
+ case 3:
|
|
|
+ return ToggleCase(str);
|
|
|
+ case 4:
|
|
|
+ return str.toUpperCase();
|
|
|
+ case 5:
|
|
|
+ return str.toLowerCase();
|
|
|
+ default:
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ *数字每千位加逗号
|
|
|
+ *
|
|
|
+ */
|
|
|
+ commafy(num) {
|
|
|
+ return num && num.toString()
|
|
|
+ .replace(/\d+/, function(s){
|
|
|
+ return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,')
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ *手机号码中间4位隐藏花号(*)显示
|
|
|
+ *
|
|
|
+ */
|
|
|
+ hideMobile(mobile) {
|
|
|
+ return mobile && mobile.toString().replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
|
|
|
+ },
|
|
|
+
|
|
|
+ * 验证是否为数字
|
|
|
+ */
|
|
|
+ isNumber(n) {
|
|
|
+ return !isNaN(parseFloat(n)) && isFinite(n);
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ * 是否为数组
|
|
|
+ */
|
|
|
+ isArray(obj) {
|
|
|
+ return Object.prototype.toString.call(obj) === '[object Array]';
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ * 递归深拷贝
|
|
|
+ */
|
|
|
+ deepCopy(obj) {
|
|
|
+ let result = Array.isArray(obj) ? [] : {};
|
|
|
+ for (let key in obj) {
|
|
|
+ if (obj.hasOwnProperty(key)) {
|
|
|
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
|
+ result[key] = deepCopy(obj[key]);
|
|
|
+ } else {
|
|
|
+ result[key] = obj[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ },
|
|
|
+ exportTable(name, columnData, tableDatas) {
|
|
|
+ let datalist = [];
|
|
|
+
|
|
|
+ let cluData = ''
|
|
|
+ for(let i=0; i<columnData.length;i++){
|
|
|
+ cluData += columnData[i].label+','
|
|
|
+ }
|
|
|
+ cluData.slice(0, cluData.length-1)
|
|
|
+ datalist.push(cluData.split(','));
|
|
|
+
|
|
|
+ for(let j=0;j<tableDatas.length;j++) {
|
|
|
+ let item = tableDatas[j]
|
|
|
+ let tabelDatas = ''
|
|
|
+ for(let k=0; k<columnData.length;k++){
|
|
|
+ let its = columnData[k]
|
|
|
+ if (item[its.value] !==null) {
|
|
|
+ tabelDatas += item[its.value] + ','
|
|
|
+ } else {
|
|
|
+ tabelDatas += '-,'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ datalist.push(tabelDatas.split(','));
|
|
|
+ }
|
|
|
+ downloadXlsx(datalist, `${name}.xlsx`);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ exportExcel() {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let wb = XLSX.utils.book_new();
|
|
|
+ let headers = {
|
|
|
+ name: '姓名',
|
|
|
+ age: '年龄',
|
|
|
+ sex: '性别'
|
|
|
+ }
|
|
|
+ this.columData.unshift(headers)
|
|
|
+ let contentWs = XLSX.utils.json_to_sheet(this.columData, {
|
|
|
+ header: ['name', 'age', 'sex'],
|
|
|
+ skipHeader: true,
|
|
|
+ origin: 'A2'
|
|
|
+ })
|
|
|
+ contentWs['!merges'] = [{s:{r:0,c:0}, e:{r:1,c:0}}, {s:{r:0,c:1}, e:{r:1,c:1}}]
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ contentWs['!cols'] = [{wch: 30},{wch: 20},{wch: 40}]
|
|
|
+ XLSX.utils.book_append_sheet(wb, contentWs, '明细')
|
|
|
+
|
|
|
+ const tmpDown = new Blob([
|
|
|
+ this.s2ab(
|
|
|
+ XLSXD.write(wb, {
|
|
|
+ bookType: 'xlsx',
|
|
|
+ bookSST: true,
|
|
|
+ type: 'binary',
|
|
|
+ cellStyles: true
|
|
|
+ })
|
|
|
+ )
|
|
|
+ ])
|
|
|
+ this.downExcel(tmpDown, '明细.xlsx')
|
|
|
+ },
|
|
|
+ downExcel(obj, fileName) {
|
|
|
+ const a_node = document.createElement('a')
|
|
|
+ a_node.download = fileName
|
|
|
+ if ('msSaveOrOpenBlob'in navigator) {
|
|
|
+ window.navigator.msSaveOrOpenBlob(obj, fileName)
|
|
|
+ } else {
|
|
|
+ a_node.href = URL.createObjectURL(obj)
|
|
|
+ }
|
|
|
+ a_node.click()
|
|
|
+ setTimeout(() =>{
|
|
|
+ URL.createObjectURL(obj)
|
|
|
+ }, 2000)
|
|
|
+ },
|
|
|
+ s2ab(s) {
|
|
|
+ if (typeof ArrayBuffer !== 'undefined') {
|
|
|
+ const buf = new ArrayBuffer(s.length)
|
|
|
+ const view = new Uint8Array(buf)
|
|
|
+ for(let i =0; i != s.length; ++i) {
|
|
|
+ view[i] = s.charCodeAt(i) & 0xff
|
|
|
+ }
|
|
|
+ return buf
|
|
|
+ } else {
|
|
|
+ const buf = new Array(s.length)
|
|
|
+ for(let i =0; i != s.length; ++i) {
|
|
|
+ buf[i] = s.charCodeAt(i) & 0xff
|
|
|
+ }
|
|
|
+ return buf
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setTooltip(myChart1, myChart2, num) {
|
|
|
+
|
|
|
+
|
|
|
+ myChart1.getZr().on('mousemove', (params) => {
|
|
|
+ const pointInPixel = [params.offsetX, params.offsetY];
|
|
|
+
|
|
|
+ if (myChart1.containPixel('grid', pointInPixel)) {
|
|
|
+
|
|
|
+ const pointInGrid = myChart1.convertFromPixel({ seriesIndex: 0 }, pointInPixel);
|
|
|
+
|
|
|
+ const xIndex = pointInGrid[0];
|
|
|
+
|
|
|
+ const op = myChart1.getOption();
|
|
|
+
|
|
|
+ const xDate = op.xAxis[0].data[xIndex];
|
|
|
+
|
|
|
+ const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate);
|
|
|
+ myChart2.dispatchAction({
|
|
|
+ type: 'showTip',
|
|
|
+ seriesIndex: num,
|
|
|
+
|
|
|
+
|
|
|
+ dataIndex: dataIndex,
|
|
|
+ position: '15%'
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ myChart2.dispatchAction({
|
|
|
+ type: 'hideTip'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ myChart2.getZr().on('mousemove', (params) => {
|
|
|
+ const pointInPixel = [params.offsetX, params.offsetY];
|
|
|
+
|
|
|
+ if (myChart2.containPixel('grid', pointInPixel)) {
|
|
|
+
|
|
|
+ const pointInGrid = myChart2.convertFromPixel({ seriesIndex: 0 }, pointInPixel);
|
|
|
+
|
|
|
+ const xIndex = pointInGrid[0];
|
|
|
+
|
|
|
+ const op = myChart2.getOption();
|
|
|
+
|
|
|
+ const xDate = op.xAxis[0].data[xIndex];
|
|
|
+
|
|
|
+ const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate);
|
|
|
+ myChart1.dispatchAction({
|
|
|
+ type: 'showTip',
|
|
|
+ seriesIndex: num,
|
|
|
+
|
|
|
+
|
|
|
+ dataIndex: dataIndex,
|
|
|
+ position: '15%'
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ myChart1.dispatchAction({
|
|
|
+ type: 'hideTip'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ isHasNum(data) {
|
|
|
+ let num = null
|
|
|
+ if (data && data !== 0) {
|
|
|
+ if (data !== 'NaN' && data !== null) {
|
|
|
+ num = Number(data).toFixed(2)
|
|
|
+ } else {
|
|
|
+ num = '-'
|
|
|
+ }
|
|
|
+ } else if(data === 0) {
|
|
|
+ num = 0
|
|
|
+ } else {
|
|
|
+ num = '-'
|
|
|
+ }
|
|
|
+ return num
|
|
|
+ },
|
|
|
+
|
|
|
+ hasYearMonthDate(a, b) {
|
|
|
+ let d = new Date(a, b, 0)
|
|
|
+ let de = d.getDate()
|
|
|
+ return de
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ sortBubble(arr) {
|
|
|
+ for(let i=0; i<arr.length; i++){
|
|
|
+ for(let j=0; j<arr.length-i; j++){
|
|
|
+ if (arr[j] > arr[j+1]) {
|
|
|
+ let temp = arr[j]
|
|
|
+ arr[j] = arr[j+1]
|
|
|
+ arr[j+1] = temp
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ unique(arr) {
|
|
|
+ let newArr = []
|
|
|
+ for(let i=0; i<arr.length; i++) {
|
|
|
+ if (newArr.indexOf(arr[i]) === -1) {
|
|
|
+ newArr.push(arr[i])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ noRepeatT(arr){
|
|
|
+ var newArr = [...new Set(arr)];
|
|
|
+ return newArr
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ useFilter(arr) {
|
|
|
+ return arr.filter(function(item,index){
|
|
|
+ return arr.indexOf(item) === index;
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ noRepeatF(arr) {
|
|
|
+ for(var i = 0; i < arr.length-1; i++){
|
|
|
+ for(var j = i+1; j < arr.length; j++){
|
|
|
+ if(arr[i]===arr[j]){
|
|
|
+ arr.splice(j,1);
|
|
|
+ j--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ noRepeatFi(arr) {
|
|
|
+ var newArr = [];
|
|
|
+ for (var i = 0; i < arr.length; i++) {
|
|
|
+ if (arr.indexOf(arr[i]) == i) {
|
|
|
+ newArr.push(arr[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return newArr;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ noRepeatS(arr){
|
|
|
+ for (var i = 0; i < arr.length; i++) {
|
|
|
+ for (var j = 0; j < arr.length; j++) {
|
|
|
+ if (arr[i] == arr[j] && i != j) {
|
|
|
+ arr.splice(j, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ noRepeatSe(arr) {
|
|
|
+ let newArr = [];
|
|
|
+ for(i=0; i<arr.length; i++){
|
|
|
+ if(!newArr.includes(arr[i])){
|
|
|
+ newArr.push(arr[i])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return newArr
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ parseQueryString(argu) {
|
|
|
+ let str = argu.split('?')[1]
|
|
|
+ let result = {}
|
|
|
+ let temp = str.split('&')
|
|
|
+ for(let i=0; i<temp.length; i++) {
|
|
|
+ let temp2 = temp[i].split('=')
|
|
|
+ result[temp2[0]] = temp2[1]
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ countStr(str) {
|
|
|
+ let json = {}
|
|
|
+
|
|
|
+ for(let i=0; i<str.length; i++) {
|
|
|
+ if (!json[str.charAt(i)]) {
|
|
|
+ json[str.charAt(i)] = 1
|
|
|
+ } else {
|
|
|
+ json[str.charAt(i)]++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ deepClone(obj) {
|
|
|
+ if (obj instanceof Object) {
|
|
|
+ let isArray = Array.isArray(obj)
|
|
|
+ let cloneObj = isArray ? [] : {}
|
|
|
+ for(let key in obj) {
|
|
|
+ cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
|
|
|
+ }
|
|
|
+ return cloneObj
|
|
|
+ } else {
|
|
|
+ throw new Error('obj不是一个对象')
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ debounce(fn, delay) {
|
|
|
+
|
|
|
+ var delay = delay || 200;
|
|
|
+ var timer;
|
|
|
+ return function () {
|
|
|
+ var th = this;
|
|
|
+ var args = arguments;
|
|
|
+ if (timer) {
|
|
|
+ clearTimeout(timer);
|
|
|
+ }
|
|
|
+ timer = setTimeout(function () {
|
|
|
+ timer = null;
|
|
|
+ fn.apply(th, args);
|
|
|
+ }, delay);
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ throttle(fn, interval) {
|
|
|
+ var last;
|
|
|
+ var timer;
|
|
|
+ var interval = interval || 200;
|
|
|
+ return function () {
|
|
|
+ var th = this;
|
|
|
+ var args = arguments;
|
|
|
+ var now = +new Date();
|
|
|
+ if (last && now - last < interval) {
|
|
|
+ clearTimeout(timer);
|
|
|
+ timer = setTimeout(function () {
|
|
|
+ last = now;
|
|
|
+ fn.apply(th, args);
|
|
|
+ }, interval);
|
|
|
+ } else {
|
|
|
+ last = now;
|
|
|
+ fn.apply(th, args);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+export default until
|