UNPKG

@ng1005/chrome-extension-common

Version:

chrome扩展通用库--消息与storage

161 lines (154 loc) 4.25 kB
import { EventBusDemo } from "../message/EventBusDemo"; import { SelectorCoverService } from "./SelectorCoverService"; const cover=new SelectorCoverService(); type Offset={ top:number, left:number, bottom:number, right:number, width: number, height:number } /** * dom选择器 */ export class CssSelectorService extends EventBusDemo{ doc:Document|undefined _events:Map<string,Function|Array<Function>>; bindFlag:boolean; disable:boolean; $emitKey:string overlay:HTMLElement|undefined constructor (doc?:Document|undefined) { super() this._events = new Map(); // 存储事件/回调键值对 this.bindFlag=false;//绑定document标示 this.disable=false;//禁用 this.doc=doc//window.document//document // this.overlay//用来显示的标签 this.$emitKey='selector_helper_click' } /** * 验证是否可用 */ isValid(){ return this.bindFlag&&!this.disable } /** * 设置不可用 */ disabled(){ this.disable=true if(this.overlay){ this.overlay.setAttribute('style',''); } } /** * 设置可用 */ enabled(){ this.disable=false } /** * 设置遮罩层位置偏移 * @param {*} offset */ setOverlayOffset(offset:Offset){ if(!offset||!this.overlay)return this.overlay.setAttribute('style', 'z-index: 999999;background-color: rgba(255, 165, 0, 0.3);border: 1px solid #c00;position: absolute;pointer-events: none;' +'top: '+(offset.top-2)+'px;' +'left:'+(offset.left-2)+'px;' +'width: '+(offset.width+5)+'px;' +'height: '+(offset.height+5)+'px;'); } /** * 绑定 * @param {*} window * @param {*} overlay */ bind(overlay?:HTMLElement|undefined){ if(this.bindFlag){ return } this.doc=this.doc||window.document if(!overlay){ overlay=this.doc.createElement('div'); this.doc.body.appendChild(overlay); } this.overlay=overlay; //绑定事件 let _this=this this.doc.addEventListener("mouseover",(evt)=>{ if(!_this.doc)return; // console.log('document===',document,'this.document====',_this.doc,document.work); if(!_this.isValid())return;//不工作了 let element=<HTMLElement>evt.target; if(!element)return; let rect = element.getBoundingClientRect(); let left=element.offsetLeft; let top=element.offsetTop; let width=element.offsetWidth; let height=element.offsetHeight; var scrollTop = Math.max(_this.doc.documentElement.scrollTop, _this.doc.body.scrollTop); var scrollLeft = Math.max(_this.doc.documentElement.scrollLeft, _this.doc.body.scrollLeft); const offset:Offset={ left: rect.left+scrollLeft, top: rect.top+scrollTop, right:rect.right, bottom:rect.bottom, width: width, height: height, }; // console.log('ddd==='); _this.setOverlayOffset(offset); // document.cssSelectorHelper.show(offset); }); this.doc.addEventListener("mousedown",(evt)=>{ if(!_this.isValid())return;//不工作了 evt.preventDefault(); evt.stopPropagation(); _this.$emit(_this.$emitKey,evt.target) this.disabled()//设置成不可用 }); this.bindFlag=true; } /** * 设置提交的key * @param {*} key */ $setKey(key:string){ this.$emitKey=key; } /** * * @param key * @returns */ getSelector(key?:string,isCover:boolean=false,coverSelector='A'){ this.bind(); let _this=this; this.enabled() key=key||'default_key' if(isCover){ cover.show(coverSelector,{background:'rgba(999,999,99,0)'}) } return new Promise<HTMLElement>((resolve,reject)=>{ _this.$setKey(key) _this.$on(key,(target:HTMLElement)=>{ _this.disabled() let el=null; if(isCover){//如果开启覆盖的话返回真实element cover.hide(coverSelector) let uid=target.getAttribute('cover-id')||'' if(uid){ el=document.querySelector(`[cover-uid='${uid}']`) } } resolve(el||target) return true; }) }) } } const $bus=new CssSelectorService() export default $bus