/** *! 创建h5页面上拖动的气泡标签 */ function createH5Bubble(options, devTools) { let tagConfig = localStorage.getItem('devTools_tagConfig') if (!tagConfig) { tagConfig = {} } else { tagConfig = JSON.parse(tagConfig) } tagConfig = Object.assign( { show: options.bubble.status, x: window.innerWidth - 90, y: window.innerHeight - 90, }, tagConfig, ) tagConfig.show = options.bubble.status // 拖动范围限制 let dragLimit = { min: { x: 0, y: 0 }, max: { x: window.innerWidth - 70, y: window.innerHeight - 24, }, } tagConfig.x = Math.min(Math.max(tagConfig.x, dragLimit.min.x), dragLimit.max.x) tagConfig.y = Math.min(Math.max(tagConfig.y, dragLimit.min.y), dragLimit.max.y) let tag = document.createElement('div') tag.style = ` box-sizing: border-box; position: fixed; z-index: 9999999; left: ${tagConfig.x}px; top: ${tagConfig.y}px; width: 70px; height: 24px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 4px; border-radius: 6px; background-color: ${options.bubble.bgColor}; color: ${options.bubble.color}; font-size: 10px; cursor: grab; box-shadow: 0px 0px 6px ${options.bubble.bgColor}; backdrop-filter: blur(1px); ` tag.innerHTML = options.bubble.text tag.setAttribute('id', 'debugTag') if (tagConfig.show) { document.body.appendChild(tag) } /** * 标签单击事件 */ function tagClick() { let pages = getCurrentPages() let route = options.route.substring(1, options.route.length - 2) if (pages[pages.length - 1].route == route) { // 已经处于debug页面,不响应点击事件 return } devTools.show() } let isTouch = false let touchStartPoint = { clientX: 0, clientY: 0, tagX: tagConfig.x, tagY: tagConfig.y, hasMove: false, } function touchStart(e) { if (isTouch) return if (e.preventDefault) { e.preventDefault() } let clientX = e.clientX ? e.clientX : e.targetTouches[0].clientX let clientY = e.clientX ? e.clientY : e.targetTouches[0].clientY touchStartPoint.clientX = clientX touchStartPoint.clientY = clientY touchStartPoint.tagX = tagConfig.x touchStartPoint.tagY = tagConfig.y touchStartPoint.hasMove = false isTouch = true } function touchMove(e) { if (!isTouch) return if (e.preventDefault) { e.preventDefault() } let clientX = e.clientX ? e.clientX : e.targetTouches[0].clientX let clientY = e.clientX ? e.clientY : e.targetTouches[0].clientY touchStartPoint.hasMove = true let offsetX = touchStartPoint.clientX - clientX let offsetY = touchStartPoint.clientY - clientY let tx = touchStartPoint.tagX - offsetX let ty = touchStartPoint.tagY - offsetY tx = Math.min(Math.max(tx, dragLimit.min.x), dragLimit.max.x) ty = Math.min(Math.max(ty, dragLimit.min.y), dragLimit.max.y) tag.style.left = `${tx}px` tag.style.top = `${ty}px` tagConfig.x = tx tagConfig.y = ty } function touchEnd(e) { if (!isTouch) return if (e.preventDefault) { e.preventDefault() } isTouch = false localStorage.setItem('devTools_tagConfig', JSON.stringify(tagConfig)) if (!touchStartPoint.hasMove) { tagClick() } } tag.addEventListener('touchstart', touchStart) tag.addEventListener('touchmove', touchMove) tag.addEventListener('touchend', touchEnd) tag.addEventListener('mousedown', touchStart) document.addEventListener('mousemove', touchMove) document.addEventListener('mouseup', touchEnd) localStorage.setItem('devTools_tagConfig', JSON.stringify(tagConfig)) } export default createH5Bubble