/**
- 秒级延时
- @param time
- @returns {Promise<*>}
*/
async function sleep(time) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(
Sleep ${time}s); resolve() }, time * 1000) }) }
/**
- 等待prepare函数执行成功或执行相应次数
- @param prepare 待执行为true的函数
- @param num 执行次数默认500
- @returns {Promise<*>} */ async function waitStart(prepare, num = 500) { let count = 0; let number = num && parseInt(num) || 500; return new Promise((resolve, reject) => { let ing = setInterval(() => { ++count; if (prepare() || count >= number) { clearInterval(ing); resolve(prepare()) } }, 200); }) }
/**
- 等待滚动条至浏览器最下方
- @param Dom dom节点 (默认是document.documentElement)
- @param type 下滑类型
- @param windowTop
- @param oldWindowTop
- @returns {Promise<*>} */ async function scrollDown(Dom,type = 1,windowTop = 0,oldWindowTop = 0) { return new Promise( (resolve, reject) => { if (type === 1){ windowTop += 100; let scrollDom = Dom || document.documentElement; scrollDom.scrollTo(0, windowTop); setTimeout(async ()=>{ let newWindowTop = scrollDom.scrollTop; if(newWindowTop !== oldWindowTop){ resolve(await scrollDown(scrollDom,type,windowTop,newWindowTop)) }else{ resolve(true) } }, 200) } }); }
/**
- 模拟事件:键盘模拟
- @param el dom节点
- @param evtType 键盘执行类型(keydown keyup keypress)
- @param keyCode 键盘按键code */ function fireKeyEvent(el, evtType, keyCode) { let doc = el.ownerDocument, win = doc.defaultView || doc.parentWindow, evtObj; if (doc.createEvent) { if (win.KeyEvent) { evtObj = doc.createEvent('KeyEvents'); evtObj.initKeyEvent(evtType, true, true, win, false, false, false, false, keyCode, 0); } else { evtObj = doc.createEvent('UIEvents'); Object.defineProperty(evtObj, 'keyCode', { get: function () { return this.keyCodeVal; } }); Object.defineProperty(evtObj, 'which', { get: function () { return this.keyCodeVal; } }); evtObj.initUIEvent(evtType, true, true, win, 1); evtObj.keyCodeVal = keyCode; if (evtObj.keyCode !== keyCode) { console.log("keyCode " + evtObj.keyCode + " 和 (" + evtObj.which + ") 不匹配"); } } el.dispatchEvent(evtObj); } else if (doc.createEventObject) { evtObj = doc.createEventObject(); evtObj.keyCode = keyCode; el.fireEvent('on' + evtType, evtObj); } }
/**
- 模拟事件:焦点模拟
- @param el dom节点
- @param evtType 焦点事件(focus blur focusin focusout) */ function focusEvent(el, evtType) { let evtObj = document.createEvent('HTMLEvents'); evtObj.initEvent(evtType, true, true, document.defaultView); el.dispatchEvent(evtObj) }
/**
- 模拟事件:鼠标模拟
- @param el dom节点
- @param evtType (鼠标事件 click dbclick mousedown mouseup) */ function sbEvent(el, evtType) { let doc = el.ownerDocument, win = doc.defaultView || doc.parentWindow, evtObj; evtObj = new MouseEvent(evtType, { bubbles: true, cancelable: true, detail: 1, button: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, view: win, relatedTarget: el, }); evtObj.relatedTarget = el; el.dispatchEvent(evtObj); }
/**
- 模拟事件:input输入模拟
- @param el dom节点
- @param vla 需要输入的数据 */ function inputEvent(el, vla) { let evtObj = new Event('input', { bubbles: true }), setValue; try { setValue = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; setValue.call(el, vla); } catch (e) { evtObj.simulated = true; setValue = Object.getOwnPropertyDescriptor(el.proto, 'value').set; setValue.call(el, vla) } finally { el.dispatchEvent(evtObj); } }
/**
- 模拟事件:可编辑框输入模拟
- 对可编辑的虚拟输入dom进行输入,使用前需对其进行聚焦
- @param html 需要输入的数据 */ function inputDivEvent(html) { let sel, range; if (window.getSelection) { sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { range = sel.getRangeAt(0); range.deleteContents(); let el = document.createElement("div"); el.innerHTML = html; let frag = document.createDocumentFragment(), node, lastNode; while ((node = el.firstChild)) { lastNode = frag.appendChild(node); } range.insertNode(frag); if (lastNode) { range = range.cloneRange(); range.setStartAfter(lastNode); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } let evtObj = new Event('input', { bubbles: true }); evtObj.simulated = true; sel.focusNode.dispatchEvent(evtObj); } } else if (document.selection && document.selection.type !== "Control") { document.selection.createRange().pasteHTML(html); } }
/**
- 模拟事件:change输入模拟
- 可应用于选择框 select和input输入
- @param el dom节点
- @param vla 需要输入的数据 */ function changeEvent(el, vla) { let evtObj = new Event('change', { bubbles: true } ), setValue; try { setValue = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; setValue.call(el, vla); } catch (e) { evtObj.simulated = true; setValue = Object.getOwnPropertyDescriptor(el.proto, 'value').set; setValue.call(el, vla) } finally { el.dispatchEvent(evtObj); } }