[JavaScript]模拟鼠标拖拽、元素相对于文档坐标计算、页面内发送Http请求等小功能封装
分享一些平时开发和自动化测试时,需要嵌入到页面内的js功能脚本。
1.模拟鼠标拖拽
从源元素selector拖拽到目标元素selector,考虑了拖拽iframe中元素的情况
function simDrag(sourceSel, targetSel, iframeName = "noIframeName"){ console.log(iframeName); let source; let target; if (iframeName == "noIframeName") { source = document.querySelector(sourceSel); } else { source = window.frames[iframeName].document.querySelector(sourceSel); } console.log(source); let rect = source.getBoundingClientRect(); let dragPt = { x: rect.left + (rect.width >> 1), y: rect.top + (rect.height >> 1) }; let dragmiddlePt = { x: dragPt.x + 20, y: dragPt.y + 20 }; let dragmiddlePt2 = { x: dragmiddlePt.x + 20, y: dragmiddlePt.y + 20 }; let emit = function (event, target, pt) { let evt = document.createEvent('MouseEvent'); evt.initMouseEvent(event, true, true, window, 0, 0, 0, pt.x, pt.y, false, false, false, false, 0, null); target.dispatchEvent(evt); console.log(pt.x); console.log(pt.y); }; emit('click', source, dragPt); emit('mousedown', source, dragPt); emit('mousemove', source, dragPt); emit('dragstart', source, dragPt); emit('mousemove', source, dragmiddlePt); emit('mousemove', source, dragmiddlePt2); if (iframeName == "noIframeName") { target = document.querySelector(targetSel); } else { target = window.frames[iframeName].document.querySelector(targetSel); } let targetrect = target.getBoundingClientRect(); let dropPt = { x: targetrect.left + (targetrect.width >> 1), y: targetrect.top + (targetrect.height >> 1) }; emit('mousemove', source, dropPt); emit('dragenter', target, dropPt); emit('dragover', target, dropPt); emit('drop', target, dropPt); emit('dragend', source, dropPt); emit('mouseup', source, dropPt); };
2.页面内发送Get与Post请求
请求的返回结果"response"保存在了sessionStorage中
var httpRequest = {}; httpRequest.quest = function (option, callback) { var url = option.url; var method = option.method; var data = option.data; var timeout = option.timeout || 0; var xhr = new XMLHttpRequest(); (timeout > 0) && (xhr.timeout = timeout); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 400) { var result = xhr.responseText; try { result = JSON.parse(xhr.responseText); } catch (e) { } callback && callback(null, result); } else { callback && callback('status: ' + xhr.status); } } }.bind(this); xhr.open(method, url, true); if (typeof data === 'object') { try { data = JSON.stringify(data); } catch (e) { } } xhr.send(data); xhr.ontimeout = function () { callback && callback('timeout'); console.log('%c连%c接%c超%c时', 'color:red', 'color:orange', 'color:purple', 'color:green'); }; }; httpRequest.get = function (url, callback) { var option = url.url ? url : { url: url }; option.method = 'get'; this.quest(option, callback); }; httpRequest.post = function (option, callback) { option.method = 'post'; this.quest(option, callback); }; function httpRequestGet(getUrl, getTimeout){ httpRequest.get({url: getUrl, timeout: getTimeout}, function (err, result) { window.sessionStorage.setItem("response",JSON.stringify(result)); }); } function httpRequestPost(postUrl, postData, postTimeout){ httpRequest.post({url: postUrl, data: postData, timeout: postTimeout}, function (err, result) { window.sessionStorage.setItem("response",JSON.stringify(result)); }); }
3.返回DOM元素相对于整个文档的x、y 坐标
function getElementPos(elementId) { var ua = navigator.userAgent.toLowerCase(); var isOpera = (ua.indexOf('opera') != -1); var isIE = (ua.indexOf('msie') != -1 && !isOpera); var el = elementId; if(el.parentNode === null || el.style.display == 'none') { return false; } var parent = null; var pos = []; var box; if(el.getBoundingClientRect) { box = el.getBoundingClientRect(); var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft); return {x:box.left + scrollLeft, y:box.top + scrollTop}; }else if(document.getBoxObjectFor) { box = document.getBoxObjectFor(el); var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0; var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0; pos = [box.x - borderLeft, box.y - borderTop]; } else { pos = [el.offsetLeft, el.offsetTop]; parent = el.offsetParent; if (parent != el) { while (parent) { pos[0] += parent.offsetLeft; pos[1] += parent.offsetTop; parent = parent.offsetParent; } } if (ua.indexOf('opera') != -1 || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )) { pos[0] -= document.body.offsetLeft; pos[1] -= document.body.offsetTop; } } if (el.parentNode) { parent = el.parentNode; } else { parent = null; } while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { pos[0] -= parent.scrollLeft; pos[1] -= parent.scrollTop; if (parent.parentNode) { parent = parent.parentNode; } else { parent = null; } } return {x:pos[0], y:pos[1]}; }
4.监听点击冒泡事件中存在标签产生的页面跳转
window.addEventListener('click',function(){ let obj = document.elementFromPoint(event.clientX,event.clientY); let path = window.event.path; let regex = /<.*?>/; let regexTagA = new RegExp("^$"); //匹配a标签 for(let j = 0; j < 5; j++) { let str = path[j].innerHTML; let tag = regex.exec(str); if(regexTagA.test(tag)) { tag = tag + "<\\a>"; let tempDom = document.createElement("a"); tempDom.innerHTML = tag; let target = tempDom.childNodes[0].getAttribute("target"); let href = tempDom.childNodes[0].getAttribute("href"); let regexBlank = new RegExp("^.*_blank.*$"); if (regexBlank.test(target) == true) { console.log("fourierEvent=Click to generate a new page event"); } break; } } },false);