1. 程式人生 > 其它 >[JavaScript]模擬滑鼠拖拽、元素相對於文件座標計算、頁面內傳送Http請求等小功能封裝

[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.監聽點選冒泡事件中存在<a>標籤產生的頁面跳轉

  window.addEventListener('click',function(){
  let obj = document.elementFromPoint(event.clientX,event.clientY);
  let path = window.event.path;
  let regex = /<.*?>/;
  let regexTagA = new RegExp("^<a{1}.*?>$"); //匹配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);