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

如何用 js 实现抽奖页面的二次点击(关闭抽奖失败的提醒)?

  •  
  •   Vkin · 2017-09-06 14:20:22 +08:00 · 3390 次点击
    这是一个创建于 2666 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个抽奖页面,每天能抽 100 次,用 js 实现自动点击抽奖按钮(name:go):

    var lottery = document.getElementsByName("go"); lottery[0].onclick();

    不管抽没抽中奖,点击一次之后,页面就会弹出提醒,比如 「未抽中,再抽一次」( name:close )",然后又写继续写一个点击,关闭这个提醒:

    var lotteryClose = document.getElementsByName("close"); lotteryClose[0].onclick();

    我想当然的以为:

    第一个 js 代码是 「点击抽奖按钮」、第二个 js 代码是「关闭抽奖之后页面弹出的提醒」。然后只要把这两段代码放在一起,用 setInterval ()不停的循环就行了。
    

    但让人郁闷的是,这两段代码合并后,放在 chrome 的 console 里跑起来却不是我想要的功能,第二段代码似乎并没有运行,也就是说,无法关闭抽奖之后弹出的弹窗。

    当弹窗弹出后,我在 console 里再运行一次 var lottery = document.getElementsByName("close");lotteryClose[0].onclick();弹窗却能正常关闭,说明这段代码可以实现关闭按钮的点击。

    求教:如何用 js 一步完成这个两个功能? 点击自动抽奖按钮,然后关闭抽奖后弹出的提醒,然后继续循环?

    13 条回复    2017-09-07 01:20:36 +08:00
    Vkin
        1
    Vkin  
    OP
       2017-09-06 14:43:25 +08:00
    顶顶。
    ituren
        2
    ituren  
       2017-09-06 14:44:12 +08:00   ❤️ 1
    因为你 lottery[0].onclick();之后去做网络请求了呀
    请求回来才会弹出提示让你关闭
    懒人做法 : var lotteryClose = document.getElementsByName("close"); lotteryClose[0].onclick(); 这段加上 timeout
    Vkin
        3
    Vkin  
    OP
       2017-09-06 15:24:19 +08:00
    @ituren 加了 settimeout 就可以了。有没有办法做个判断呀,当这个窗弹出时,自动调用关闭代码? 原谅我刚接触 js 一天。
    invoke
        4
    invoke  
       2017-09-06 16:07:14 +08:00   ❤️ 1
    不是太理解。既然你有网络请求那么就把关闭弹窗的函数放到网络请求的返回执行里面不就好了吗?
    Vkin
        5
    Vkin  
    OP
       2017-09-06 16:18:55 +08:00
    @invoke 哪里不太理解? 放到网络请求的返回执行?能否具体点呀?,我对 js 是小白的小白。。
    ituren
        6
    ituren  
       2017-09-06 16:22:28 +08:00   ❤️ 1
    看一下网站的具体处理逻辑,如果关闭按钮只是把弹出框隐藏掉的话就不用管它了
    lottery[0].onclick(); * 100 就可以了
    autoxbc
        7
    autoxbc  
       2017-09-06 16:57:14 +08:00   ❤️ 1
    js 是事件驱动的,基本思路是把所有的操作都和事件关联起来
    比如点击关闭按钮的代码,应该挂在按钮出现的事件上

    怎么判断按钮出现,可以用突变观察者
    http://javascript.ruanyifeng.com/dom/mutationobserver.html
    https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

    如果觉得观察者比较复杂,可以用事件监听
    http://javascript.ruanyifeng.com/dom/event.html

    一个元素出现,一般会伴随节点插入事件 DOMNodeInserted
    如果是修改现有元素,会伴随属性修改事件 DOMAttrModified

    如果不想深入学习,那就用上面的延时吧,不过延时是不可靠的
    zgx030030
        8
    zgx030030  
       2017-09-06 17:07:52 +08:00   ❤️ 1
    selenium 自动化。。。
    wxsm
        9
    wxsm  
       2017-09-06 21:56:17 +08:00
    为什么你要关闭这个提醒。它应该并不妨碍你继续执行 lottery[0].onclick(),有可能只是“看起来妨碍了”而已
    Vkin
        10
    Vkin  
    OP
       2017-09-06 22:10:39 +08:00
    @wxsm 不清楚影不影响,但是不及时关闭,会一直弹弹弹,然后到时候也是一样要关闭。。。。。
    kyuuseiryuu
        11
    kyuuseiryuu  
       2017-09-06 22:35:51 +08:00
    直接用将弹窗的 CSS display:none !important;
    popok
        12
    popok  
       2017-09-06 22:48:23 +08:00
    如果请求简单,直接抓包,发请求包
    如果复杂,就继续模拟点击,那个弹窗可能只是一个遮挡而已,不影响你执行点击的事件。

    如果那个弹窗确实能限制你点击抽奖,那就照 7 楼,监听事件

    实在不行,只能延时了。
    codermagefox
        13
    codermagefox  
       2017-09-07 01:20:36 +08:00 via iPhone
    楼主,这就是你开始学习 js 异步的机会啊!或者用 se 也行,se 是有内置的等候方法的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:54 · PVG 08:54 · LAX 16:54 · JFK 19:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.