V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
sarvatathagata
V2EX  ›  JavaScript

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

  •  
  •   sarvatathagata · 2020-08-23 18:18:43 +08:00 · 2311 次点击
    这是一个创建于 1551 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    14 条回复    2020-08-24 10:00:54 +08:00
    ijrou
        1
    ijrou  
       2020-08-23 18:35:25 +08:00
    trigger,不知道是不是楼主想要的。。。
    当然,我也没明白楼主想要什么功能,可能我没接触到过吧
    sarvatathagata
        2
    sarvatathagata  
    OP
       2020-08-23 18:39:31 +08:00
    @ijrou jQuery('.swap').trigger("mousedown");也没用
    ijrou
        3
    ijrou  
       2020-08-23 19:21:54 +08:00
    先确定 jQuery('.swap') 选择到的是否是你要操作的元素,数组的话就取对应的元素,然后再 trigger,如果无聊,那么建议你查看你这个元素上是否绑定了 mousedown 事件,要么就是选择错了元素,要么是这个选择的元素没有 mouedown,要么你要触发的事件的逻辑压根不在 mousedown 上;
    mchl
        4
    mchl  
       2020-08-23 19:56:55 +08:00 via iPhone
    document.querySelector(‘.swap’).click()
    sarvatathagata
        5
    sarvatathagata  
    OP
       2020-08-23 20:03:43 +08:00
    @mchl 都说了 click 没用了,别 click 了,这个元素压根就没有 click 的 event listener,只有 mousedown
    sarvatathagata
        6
    sarvatathagata  
    OP
       2020-08-23 20:05:22 +08:00
    现在自己调试了一下,发现 getEventListeners(jQuery('.swap')[0]).mousedown[0].listener()直接调用时 Ug 函数的 a 参数没有 h 属性(这个 h 应该是一个 MouseEvent ),所以会失败,多半是因为直接调用 mousedown 时没有生成正确的 MouseEvent
    sarvatathagata
        7
    sarvatathagata  
    OP
       2020-08-23 20:19:37 +08:00
    尝试使用
    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  
       2020-08-23 20:56:21 +08:00
    @sarvatathagata 刚研究了一下,需要先触发 mousedown 再触发 mouseup,其实分析一下请求就不难发现 mousedown 这一步是没有请求发出去的
    sarvatathagata
        9
    sarvatathagata  
    OP
       2020-08-23 21:17:32 +08:00
    @musi 谢谢,能否详细解释一下如何先触发 mousedown 再 mouseup ?我都触发了还是没用
    musi
        10
    musi  
       2020-08-23 21:36:44 +08:00
    @sarvatathagata 安装你上面的方法同时创建 mousedown event 和 mouseup event,然后先 dispatch mousedown 再 dispatch mouseup
    musi
        11
    musi  
       2020-08-23 21:40:46 +08:00   ❤️ 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
       2020-08-23 22:13:30 +08:00
    楼上正解,亲测有效,再次表示感谢。
    musi
        13
    musi  
       2020-08-23 22:47:06 +08:00
    @musi up 这里的 mousedown 改为 mouseup 手速快了没注意😂
    volvo007
        14
    volvo007  
       2020-08-24 10:00:54 +08:00
    楼上正解

    最近正在学 js,特别提到有些页面按钮元素并没有设置 .click 方法,所以 .click 无效
    需要绑定一个 mouse 事件才行,但自己还没有实践过,谢谢楼上大佬指点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1524 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:08 · PVG 01:08 · LAX 09:08 · JFK 12:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.