import isArray from 'lodash/isArray'; import mergeWith from 'lodash/mergeWith'; /** * 触发事件 * * @format * @param componentId 组件id * @param eventType 事件类型 * @param detail 自定义事件参数 */ export function DispatchEvent( componentId: string | undefined, eventType: string, detail: any, ) { if (!componentId || !eventType) { throw new Error('非法参数'); } const event = new CustomEvent(`edata-${componentId}-${eventType}`, { detail, }); document.dispatchEvent(event); } /** * 触发事件 * @param eventType 事件类型 * @param detail 自定义事件参数 */ export function DispatchIOCEvent(eventType: string, detail: any) { if (!eventType) { throw new Error('非法参数'); } const event = new CustomEvent(`edata-${eventType}`, { detail, }); document.dispatchEvent(event); } /** * lodash mergeWith * 当为数组合并时,使用后者的数组 * @param objValue * @param srcValue */ export function customizer(objValue: any, srcValue: any) { if (isArray(objValue)) { return srcValue; } } export function customMergeWith(base: Record, ...args: any) { return mergeWith(base, ...args, customizer); } export function desensitization( str: string, beginLen: number, endLen?: number, ) { const len = str.length; const firstStr = str.substr(0, beginLen); let lastStr = ''; if (typeof endLen !== 'undefined' && str.length > 2) { lastStr = str.substr(endLen); } const middleStr = str .substring( beginLen, typeof endLen !== 'undefined' && str.length > 2 ? len - Math.abs(endLen) : len, ) .replace(/[\s\S]/gi, '*'); return firstStr + middleStr + lastStr; } /** * #色值转换rbg * @param str * @param opacity */ export function colorRgb(str: string, opacity?: number) { // 16进制颜色值的正则 const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; // 把颜色值变成小写 let color = str.toLowerCase(); if (reg.test(color)) { // 如果只有三位的值,需变成六位,如:#fff => #ffffff if (color.length === 4) { let colorNew = '#'; for (let i = 1; i < 4; i += 1) { colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1)); } color = colorNew; } // 处理六位的颜色值,转为RGB const colorChange = []; for (let i = 1; i < 7; i += 2) { colorChange.push(parseInt('0x' + color.slice(i, i + 2))); } return ( 'RGBA(' + colorChange.join(',') + `,${opacity ? opacity : '1'}` + ')' ); } else { const arr = color.split(',').splice(0, 3); let newColor = arr.join(','); newColor += ','; newColor += opacity ? opacity : '1'; newColor += ')'; return newColor; } } export function _loadScript(url: string) { if (!url) { throw new Error('loadScript值不能为空'); } return new Promise(resolve => { const script: any = document.createElement('script'); script.type = 'text/javascript'; script.src = url; // script.async = true; if (script.readyState) { // IE script.onreadystatechange = () => { if ( script.readyState === 'loaded' || script.readyState === 'complete' ) { script.onreadystatechange = null; resolve('success'); } }; } else { // Others script.onload = () => { resolve('success'); }; } document.body.appendChild(script); }); } /** * 加载外部脚本 * @param url string | string[] * @param options object * {keepOrder?: boolean} 是否保持脚本加载顺序 */ export async function loadScript( url: string | string[], options?: { keepOrder?: boolean }, ) { const keepOrder = options?.keepOrder; const urls = Array.isArray(url) ? url : [url]; if (keepOrder) { let successCount = 0; for (let index = 0; index < urls.length; index++) { const _url = urls[index]; const flag = await _loadScript(_url); if (flag) { successCount++; } else { break; } } if (successCount === urls.length) { return 'success'; } } else { return await Promise.all(urls.map(_url => _loadScript(_url))); } } import close from '../assets/close.svg'; //构建自定义信息窗体 export function createInfoWindow( title: string, content: string, closeInfoWindow: () => void, window: any, ) { const info = document.createElement('div'); info.className = 'custom-info input-card content-window-card'; //可以通过下面的方式修改自定义窗体的宽高 //info.style.width = "400px"; // 定义顶部标题 const top = document.createElement('div'); const titleD = document.createElement('div'); const closeX = document.createElement('img'); top.className = 'info-top'; titleD.innerHTML = title; closeX.src = close; closeX.onclick = closeInfoWindow; top.style.backgroundColor = window.background; top.style.borderRadius = `${window.borderRadius}px ${window.borderRadius}px 0 0`; top.style.padding = `${window.padding.paddingTop}px ${window.padding.paddingRight}px 0 ${window.padding.paddingLeft}px`; top.appendChild(titleD); top.appendChild(closeX); info.appendChild(top); // 定义中部内容 const middle = document.createElement('div'); middle.className = 'info-middle'; middle.style.backgroundColor = window.background; middle.style.borderRadius = `0 0 ${window.borderRadius}px ${window.borderRadius}px`; middle.style.padding = `5px ${window.padding.paddingRight}px ${window.padding.paddingBottom}px ${window.padding.paddingLeft}px`; middle.style.fontSize = window.textStyle.fontSize; middle.style.fontFamily = window.textStyle.fontFamily; middle.style.color = window.textStyle.color; middle.style.fontWeight = window.textStyle.fontWeight; middle.innerHTML = content; info.appendChild(middle); // 定义底部内容 // const bottom = document.createElement('div'); // bottom.className = 'info-bottom'; // bottom.style.position = 'relative'; // bottom.style.top = '0px'; // bottom.style.margin = '0 auto'; // const sharp = document.createElement('img'); // sharp.src = 'https://webapi.amap.com/images/sharp.png'; // bottom.appendChild(sharp); // info.appendChild(bottom); return info; }