2023-02-07 21:07:16 +08:00

276 lines
9.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//表现层的处理
if (window.location.href.indexOf("backEndAddressServiceWrapper") >= 0) {
throw "serviceGrid"; //如果是服务器网页页面,则不执行工具
}
//返回element相对node节点的xpath默认的node节点是: /
function readXPath(element, type = 1, node = document.body) {
try {
if (type == 0) //type=0代表默认可通过id生成xpath type=1代表只能从根节点生成xpath, nodeList里必须使用绝对xpath!
{
if (element.id !== "") { //判断id属性如果这个元素有id则显示//*[@id="xPath"] 形式内容
return '//*[@id=\"' + element.id + '\"]';
}
if (element.className != ""){ //如果有class且某个class name只有一个元素则使用class name生成xpath
console.log("class name: " + element.className);
names = element.className.split(" ");
for (var i = 0; i < names.length; i++) {
if (names[i] != "") {
// return '//*[@class=\"' + names[i] + '\"]';
console.log('//*[@contains(@class, \"' + names[i] + '\")]');
elements_of_class = node.getElementsByClassName(names[i]);
console.log("Length of elements_of_class: " + elements_of_class.length);
if(elements_of_class.length == 1){
return '//*[contains(@class, \"' + names[i] + '\")]'
}
}
}
}
}
//这里需要需要主要字符串转译问题可参考js 动态生成html时字符串和变量转译注意引号的作用
if (element == node) { //递归到body处结束递归
if (node == document.body) {
return '/html/' + element.tagName.toLowerCase();
} else {
return "";
}
}
var ix = 1, //在nodelist中的位置且每次点击初始化
siblings = element.parentNode.childNodes; //同级的子元素
for (var i = 0, l = siblings.length; i < l; i++) {
var sibling = siblings[i];
//如果这个元素是siblings数组中的元素则执行递归操作;arguments.callee代表当前函数的名称
if (sibling == element) {
return readXPath(element.parentNode, type, node) + '/' + element.tagName.toLowerCase() + '[' + (ix) + ']';
//如果不符合判断是否是element元素并且是否是相同元素如果是相同的就开始累加
} else if (sibling.nodeType == 1 && sibling.tagName == element.tagName) {
//注意此处为了防止多计算了插入的操作台的3个div元素导致定位错误这里需要屏蔽掉三个元素的索引号
if(sibling.id != "wrapperDiv" && sibling.id != "wrapperTdiv" &&sibling.id != "wrapperToolkit"){
ix++;
}
}
}
} catch {
return "/"
}
};
//创造div作为选中元素后的样式存在
var div = document.createElement('div');
div.style.zIndex = -2147483647;
div.setAttribute("id", "wrapperDiv");
div.style.position = "fixed";
div.style.boxSizing = "border-box";
div.style.border = "dotted";
var tdiv = document.createElement('div');
tdiv.style.zIndex = 2147483647;
tdiv.style.position = "fixed";
tdiv.setAttribute("id", "wrapperTdiv");
tdiv.classList = "tdiv";
tdiv.style.top = "0px";
tdiv.style.width = "3000px";
tdiv.style.height = "3000px";
tdiv.style.pointerEvents = "none";
var mousemovebind = false; //如果出现元素默认绑定了mousemove事件导致匹配不到元素的时候开启第二种模式获得元素
var toolkit = document.createElement("div")
toolkit.classList = "tooltips"; //添加样式
toolkit.setAttribute("id", "wrapperToolkit");
var tooltips = false; //标记鼠标是否在提示框上
var defaultbgColor = 'rgba(221,221,255,0.8)'; //移动到元素的背景颜色
var selectedColor = "rgba(151,255,255, 0.6)"; //选中元素的背景颜色
var boxShadowColor = "blue 0px 0px 5px"; //待选元素的边框属性
//右键菜单屏蔽
document.oncontextmenu = () => false;
var nodeList = []; //已被选中的节点列表
var readyList = []; //预备选中的list
var outputParameters = []; //输出参数列表
var outputParameterNodes = []; //输出参数节点列表
NowNode = null;
var xnode = null;
var step = 0; //记录这是第几次点击操作
var style = ""; //记录上个元素的颜色
document.addEventListener("mousemove", function() {
if (mousemovebind) {
tdiv.style.pointerEvents = "none";
}
//如果鼠标在元素框内则点击和选中失效
var x = event.clientX;
var y = event.clientY;
var divx1 = toolkit.offsetLeft;
var divy1 = toolkit.offsetTop;
var divx2 = toolkit.offsetLeft + toolkit.offsetWidth;
var divy2 = toolkit.offsetTop + toolkit.offsetHeight;
if (x >= divx1 && x <= divx2 && y >= divy1 && y <= divy2) {
tooltips = true;
return;
}
oe = document.elementFromPoint(event.x, event.y);
if (oe == tdiv) {
return;
}
tooltips = false;
NowNode = oe;
te = 0;
exist = 0;
exist2 = 0;
for (o of nodeList) {
if (o["node"] == oe) {
exist = 1;
break;
}
}
for (o of nodeList) {
if (o["node"] == xnode) {
exist2 = 1;
break;
}
}
// console.log(oe);
if (xnode == null) {
xnode = oe;
}
if (xnode != oe) {
if (exist2 == 0) { //如果上个元素不在数组里,改回上个元素的初始颜色
try {
xnode.style.backgroundColor = style; //上个元素改回原来元素的背景颜色
} catch {
xnode.style.backgroundColor = ""; //上个元素改回原来元素的背景颜色
}
}
try {
style = oe.style.backgroundColor;
} catch {
style = "";
}
if (exist == 1) {
} else {
try {
oe.style.backgroundColor = defaultbgColor; //设置新元素的背景元素
} catch {}
}
xnode = oe;
div.style.display = "none";
}
if (mousemovebind) {
tdiv.style.pointerEvents = "";
}
});
//点击没反应时候的替代方案
document.onkeydown = function(event) {
// console.log("keydown");
var e = event || window.event || arguments.callee.caller.arguments[0];
if (e && e.keyCode == 118) { // 按 F7
addEl();
} else if (e && e.keyCode == 119) { //按F8
clearEl();
} else if (e && e.keyCode == 120) { //按F9
NowNode.focus();
NowNode.click();
// console.log("click",NowNode);
} else {
return event.keyCode;
}
};
//选中元素到列表中
function addEl() {
// if (tooltips) {
// return;
// }
let exist = false;
for (o of nodeList) {
if (o["node"] == oe) {
exist = true;
break;
}
}
//元素没有被添加过才去添加
if (!exist) {
step++;
exist = false; //判断刚加入的元素是否在readyList中如果在则将所有readylist中的元素全部放入list中
for (o of readyList) {
if (o["node"] == oe) {
exist = true;
break;
}
}
if (exist) { //存在在readylist就全选中
readyToList(step);
if (app._data.selectedDescendents) {
handleDescendents(); //如果之前有选中子元素,新加入的节点又则这里也需要重新选择子元素
}
} else //不然只添加一个元素
{
clearReady(); //readylist清零重新算
nodeList.push({ node: NowNode, "step": step, bgColor: style, "boxShadow": NowNode.style.boxShadow == "" || boxShadowColor ? "none" : NowNode.style.boxShadow, xpath: readXPath(NowNode, 1) });
NowNode.style.backgroundColor = selectedColor;
}
handleElement(); //处理新状态
//将虚线框显示在元素上方但屏蔽其鼠标操作
var pos = NowNode.getBoundingClientRect();
div.style.display = "block";
div.style.height = NowNode.offsetHeight + "px";
div.style.width = NowNode.offsetWidth + "px";
div.style.left = pos.left + "px";
div.style.top = pos.top + "px";
div.style.zIndex = 2147483645;
div.style.pointerEvents = "none";
}
// console.log("------");
// for (i = 0; i < nodeList.length; i++) {
// console.log(nodeList[i]["xpath"]);
// }
//对于可点击元素屏蔽a标签默认点击事件
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault ? event.preventDefault() : event.returnValue = false;
}
document.addEventListener("mousedown", addEl);
toolkit.addEventListener("mousedown", function(e) { e.stopPropagation(); }); //重新定义toolkit里的点击事件
//清除选择项
function clearEl() {
//如果最后停留的元素被选中则调整此元素的style为原始style否则不进行调整
for (node of nodeList) {
node["node"].style.backgroundColor = node["bgColor"];
node["node"].style.boxShadow = node["boxShadow"];
if (NowNode == node["node"]) {
style = node["bgColor"];
}
}
step = 0;
clearReady();
clearParameters();
nodeList.splice(0, nodeList.length); //清空数组
app._data.option = 0; //选项重置
app._data.page = 0; //恢复原始页面
}
//清除预备数组
function clearReady() {
for (node of readyList) //节点列表状态恢复原状
{
node["node"].style.boxShadow = node["boxShadow"];
}
readyList.splice(0, readyList.length); //清空数组
}
document.body.append(div); //默认如果toolkit不存在则div和tdiv也不存在
document.body.append(tdiv);
document.body.append(toolkit);
var timer;