在javascript中模拟单击(也在窗口外)

在javascript中模拟单击(也在窗口外),javascript,html,Javascript,Html,我正在尝试动态模拟点击,我已经用这个函数对三个缩进的树进行了模拟: document.onmousemove = function(e) { cursorX = e.pageX; cursorY = e.pageY; } function ret_vw(v) { var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); return (v * w) /

我正在尝试动态模拟点击,我已经用这个函数对三个缩进的树进行了模拟:

document.onmousemove = function(e) {
        cursorX = e.pageX;
        cursorY = e.pageY;
}

function ret_vw(v) {
  var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
  return (v * w) / 100;
}

function simulateClick(x, y) {
    var s = d3.select(document.elementFromPoint(x, y));
    s.on("click")(s.datum());
}

function multiple_click() {
    //onmousemove = function(e){console.log("mouse location:", e.clientX, e.clientY)}
    if (cursorX >= ret_vw(15.25) && cursorX < ret_vw(42)) {
        simulateClick(cursorX + ret_vw(28) - window.pageXOffset, cursorY - window.pageYOffset);
        simulateClick(cursorX + ret_vw(56) - window.pageXOffset, cursorY - window.pageYOffset);
    }
    else if (cursorX >= ret_vw(43.25) && cursorX < ret_vw(70.25)) {
        simulateClick(cursorX - ret_vw(28) - window.pageXOffset, cursorY - window.pageYOffset);
        simulateClick(cursorX + ret_vw(28) - window.pageXOffset, cursorY - window.pageYOffset);
    }
    else if (cursorX >= ret_vw(71.25)) {
        simulateClick(cursorX - ret_vw(28) - window.pageXOffset, cursorY - window.pageYOffset);
        simulateClick(cursorX - ret_vw(56) - window.pageXOffset, cursorY - window.pageYOffset);
    }
    else
        console.log("no , cursorX = " + cursorX + " , cursorY = " + cursorY + " vw = " + ret_vw(15.25));
}
document.onmousemove=函数(e){
cursorX=e.pageX;
粗略地=e.pageY;
}
功能更新vw(v){
var w=Math.max(document.documentElement.clientWidth,window.innerWidth | | 0);
返回(v*w)/100;
}
函数模拟单击(x,y){
var s=d3.select(document.elementFromPoint(x,y));
s、 点击(s.datum());
}
函数多次单击(){
//onmousemove=function(e){console.log(“鼠标位置:”,e.clientX,e.clientY)}
如果(cursorX>=ret_vw(15.25)和&cursorX=ret_vw(43.25)和&cursorX=ret_vw(71.25)){
模拟单击(cursorX-ret_vw(28)-window.pageXOffset,cursorY-window.pageYOffset);
模拟单击(cursorX-ret_vw(56)-window.pageXOffset,cursorY-window.pageYOffset);
}
其他的
console.log(“否,cursorX=“+cursorX+”,cursorY=“+cursorY+”vw=“+ret_vw(15.25));
}
它适用于以下情况,如果我单击一个,它将单击其他两个标识为三的:

(无需点击)

(按一下)

但我有两个问题,如果我把一个缩进的树推到窗口外,它将不起作用,其次,我需要动态地这样做,因为我不会总是有3个缩进的3个(我可以有2个,4个,5个标识的树…)

以下是“我的功能”多点单击不起作用的情况的图片(窗口外的树…):

谢谢你们的帮助


(带有d3.js的已识别树的来源:)

我建议不要使用鼠标事件来触发单击-这最终会调用此单击功能:

function click(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
  update(d);
}
您将创建一个新的mouseClick函数,该函数将替换当前的鼠标单击函数。 这将调用所有匹配项的当前单击函数。这是一个概念:

function mouseClick(d) {
  // Assuming you have multiple roots (example only has root)

  for (root in roots) {
      // Find d in the current root (by name?)
      matching_d = ...  

      click(matching_d)
  }
} 

点击应该做什么?如果您依赖屏幕上的单击,则可能会出现问题。你能分享一下点击导致的代码吗?我添加了一张图片以查看差异(没有点击和使用),并在末尾添加了识别树的源代码。希望它能帮助你解决我的问题:)@shushan为什么你要通过点击来驱动它,而不是控制你的应用程序,例如调用一个函数来实现它,你没有访问代码的权限吗?这是用于功能测试的吗?当我单击一棵识别树时,我也需要单击所有其他识别树,所以这就是为什么我要模拟其他人仅在用户已单击一棵识别树时单击,而这实际上是我的代码,但要向您显示所有内容(1k行代码…)@DominicThank you,这帮助我最终找到了解决方案,干得好!