Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.4k views
in Technique[技术] by (71.8m points)

如何在网页端用js模拟鼠标移动点击等操作

网页端没有直接的api可以实现鼠标点击,移动等操作。
我目前的思路是,自己创建点击,移动等事件,然后通过元素的dispatchEvent方法,直接把事件发给目标元素。但是这种方式非常麻烦,需要先找到监听鼠标操作的元素,然后才能用dispatchEvent方法,没有通用性,有没有更好的思路或方法。
三种操作的封装

function creatpointerdown(x, y, offsetX, offsetY) {
    let downEvent = new PointerEvent("pointerdown", {
        pointerId: 1,
        bubbles: true, //如果事件是冒泡类型,则返回 true,否则返回 fasle。
        button: 0, // 按下 0(通常是左按钮)  移动时为-1
        buttons: 1, // pointerdown 1(通常是左键)   pointerup时候为 0(没有键被按下)
        cancelable: true, //如果用 preventDefault() 方法可以取消与事件关联的默认动作,则为 true,否则为 fasle。
        composed: true, //用来指示该事件是否可以从 Shadow DOM 传递到一般的 DOM。
        pointerType: "mouse",
        which: 1, //按下和抬起为1  移动时为0
        width: 1, //触摸的物体,与屏幕接触的面积
        height: 1, //触摸的物体,与屏幕接触的面积
        isPrimary: true, //是否为主指针
        isTrusted: true, //是否可信任  判断是脚本操作还是真人操作 ,其实并不能设置,脚本操作则为false
        tiltX: 0, //Y和Z轴的角度 -90到90度
        tiltY: 0,
        view: document.defaultView, //与事件关联的窗口
        clientX: x,
        clientY: y,
        screenX: x, //鼠标在屏幕上的x坐标
        screenY: y + 71, //鼠标在屏幕上的y坐标
        movementX: 0,
        movementY: 0,
        pressure: 0.5 //压力  鼠标点击时为 0.5  鼠标按下为抬起移动时为0  抬起了移动时为0
    });
    return downEvent;
}


//按下时移动
function creatpointermove(x, y, offsetX, offsetY) {

    let moveEvent = new PointerEvent("pointermove", {
        pointerId: 1,
        bubbles: true, //如果事件是冒泡类型,则返回 true,否则返回 fasle。
        button: -1, // 按下 0(通常是左按钮)  移动时为-1
        buttons: 1, // pointerdown 1(通常是左键)   pointerup时候为 0(没有键被按下)
        cancelable: true, //如果用 preventDefault() 方法可以取消与事件关联的默认动作,则为 true,否则为 fasle。
        composed: true, //用来指示该事件是否可以从 Shadow DOM 传递到一般的 DOM。
        pointerType: "mouse",
        which: 0, //按下和抬起为1  移动时为0
        width: 1, //触摸的物体,与屏幕接触的面积
        height: 1, //触摸的物体,与屏幕接触的面积
        isPrimary: true,
        tiltX: 0,
        tiltY: 0,
        view: document.defaultView, //与事件关联的窗口
        clientX: x,
        clientY: y,
        screenX: x, //鼠标在屏幕上的x坐标
        screenY: y + 71, //鼠标在屏幕上的y坐标
        movementX: offsetX,
        movementY: offsetY,
        pressure: 0.5 //压力  鼠标点击时为 0.5  鼠标按下为抬起移动时为0  抬起了移动时为0  抬起时为0
    });

    return moveEvent;
}



function creatpointerup(x, y, offsetX, offsetY) {

    let upEvent = new PointerEvent("pointerup", {
        pointerId: 1,
        bubbles: true, //如果事件是冒泡类型,则返回 true,否则返回 fasle。
        button: -1, // 按下 0(通常是左按钮)  移动时为-1
        buttons: 0, // pointerdown 1(通常是左键)   pointerup时候为 0(没有键被按下)
        cancelable: true, //如果用 preventDefault() 方法可以取消与事件关联的默认动作,则为 true,否则为 fasle。
        composed: true, //用来指示该事件是否可以从 Shadow DOM 传递到一般的 DOM。
        pointerType: "mouse",
        which: 1, //按下和抬起为1  移动时为0
        width: 1, //触摸的物体,与屏幕接触的面积
        height: 1, //触摸的物体,与屏幕接触的面积
        isPrimary: true,
        tiltX: 0,
        tiltY: 0,
        view: document.defaultView, //与事件关联的窗口
        clientX: x,
        clientY: y,
        screenX: x, //鼠标在屏幕上的x坐标
        screenY: y + 71, //鼠标在屏幕上的y坐标
        movementX: offsetX,
        movementY: offsetY,
        pressure: 0 //压力  鼠标点击时为 0.5  鼠标按下为抬起移动时为0  抬起了移动时为0  抬起时为0
    });

    return upEvent;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

这个问题的关键点在于如何准确的拿到目标元素。如果你是模拟了一个鼠标指针在页面上移动,那么你只有指针的坐标信息,该如何通过坐标信息拿到对应位置的元素,这个目前可能无法实现。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...