V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
sarvatathagata

如何用 js 触发谷歌翻译网站的"交换语言"按钮的 onmousedown 啊?

  •  
  •   sarvatathagata · Aug 23, 2020 · 2928 views
    This topic created in 2083 days ago, the information mentioned may be changed or developed.

    我只会用x.click()触发一个 onclick,但是 jQuery 的jQuery('.swap').mousedown()貌似不管用,不知道为什么。(谷歌翻译没有用 jQuery,是我在控制台里导入的 jQuery )。

    这个按钮的确是使用 mousedown 触发的,因为我从控制台里把它的 mousedown 的最后一个 Event Listener 删掉之后手动点击就没有反应了。

    尝试使用过原生 js 的document.createEvent,然后再dispatchEvent,但是也貌似不管用。

    百度翻译的交换语言按钮就可以很正常地触发。

    14 replies    2020-08-24 10:00:54 +08:00
    ijrou
        1
    ijrou  
       Aug 23, 2020
    trigger,不知道是不是楼主想要的。。。
    当然,我也没明白楼主想要什么功能,可能我没接触到过吧
    sarvatathagata
        2
    sarvatathagata  
    OP
       Aug 23, 2020
    @ijrou jQuery('.swap').trigger("mousedown");也没用
    ijrou
        3
    ijrou  
       Aug 23, 2020
    先确定 jQuery('.swap') 选择到的是否是你要操作的元素,数组的话就取对应的元素,然后再 trigger,如果无聊,那么建议你查看你这个元素上是否绑定了 mousedown 事件,要么就是选择错了元素,要么是这个选择的元素没有 mouedown,要么你要触发的事件的逻辑压根不在 mousedown 上;
    mchl
        4
    mchl  
       Aug 23, 2020 via iPhone
    document.querySelector(‘.swap’).click()
    sarvatathagata
        5
    sarvatathagata  
    OP
       Aug 23, 2020
    @mchl 都说了 click 没用了,别 click 了,这个元素压根就没有 click 的 event listener,只有 mousedown
    sarvatathagata
        6
    sarvatathagata  
    OP
       Aug 23, 2020
    现在自己调试了一下,发现 getEventListeners(jQuery('.swap')[0]).mousedown[0].listener()直接调用时 Ug 函数的 a 参数没有 h 属性(这个 h 应该是一个 MouseEvent ),所以会失败,多半是因为直接调用 mousedown 时没有生成正确的 MouseEvent
    sarvatathagata
        7
    sarvatathagata  
    OP
       Aug 23, 2020
    尝试使用
    let event=document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown',true,false,document.defaultView,0,279,179,207,80,false,false,false,false,0,null);
    node.dispatchEvent(event);

    现在生成的 MouseEvent 与人生成的没有任何区别,除了 isTrusted 是 false 之外。还是没有用。可能谷歌翻译就是不允许脚本点击这个交换按钮吧。
    musi
        8
    musi  
       Aug 23, 2020
    @sarvatathagata 刚研究了一下,需要先触发 mousedown 再触发 mouseup,其实分析一下请求就不难发现 mousedown 这一步是没有请求发出去的
    sarvatathagata
        9
    sarvatathagata  
    OP
       Aug 23, 2020
    @musi 谢谢,能否详细解释一下如何先触发 mousedown 再 mouseup ?我都触发了还是没用
    musi
        10
    musi  
       Aug 23, 2020
    @sarvatathagata 安装你上面的方法同时创建 mousedown event 和 mouseup event,然后先 dispatch mousedown 再 dispatch mouseup
    musi
        11
    musi  
       Aug 23, 2020   ❤️ 1
    @sarvatathagata 就 copy 一下你的代码实现一下吧
    ```
    let down=document.createEvent('MouseEvents'), up=document.createEvent('MouseEvents');
    down.initMouseEvent('mousedown',true,false,document.defaultView,0,279,179,207,80,false,false,false,false,0,null);
    up.initMouseEvent('mousedown',true,false,document.defaultView,0,279,179,207,80,false,false,false,false,0,null);
    node.dispatchEvent(down);
    setTimeout(() => node.dispatchEvent(up), 300);
    ```
    sarvatathagata
        12
    sarvatathagata  
    OP
       Aug 23, 2020
    楼上正解,亲测有效,再次表示感谢。
    musi
        13
    musi  
       Aug 23, 2020
    @musi up 这里的 mousedown 改为 mouseup 手速快了没注意😂
    volvo007
        14
    volvo007  
       Aug 24, 2020
    楼上正解

    最近正在学 js,特别提到有些页面按钮元素并没有设置 .click 方法,所以 .click 无效
    需要绑定一个 mouse 事件才行,但自己还没有实践过,谢谢楼上大佬指点
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4700 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 01:02 · PVG 09:02 · LAX 18:02 · JFK 21:02
    ♥ Do have faith in what you're doing.