学JS的心路历程 - JS应用
各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下。
我们先来看一下折价券的样子。
怎么点都不会有东西对吧?
开启开发人员选项,选到折价券的位置。
可以看到说是因为disable属性,才没有办法点击(leafor)
恩?所以只要取消掉就可以点击了吗?
当然不是这样啊!
我们必须等时间到时候再点击才可以!
那该怎么做呢?
首先必须用JS抓到折价券的DOM元素:
const coupon_list = document.getElementsByClassName(“coupon-list”);
const coupon_250 = coupon_list[0].children[2];
console.log(coupon_250);
再来,我们得设定时间到时执行按下按钮的动作,在JS中时间都是以世界标准时间(UTC)时间计算的,也就是从1970年1月1日开始的毫秒数值来储存时间。
当然可以透过JS的Date()方法转换,但是我这个人比较懒惰,找了个可以直接帮我转的网页。
const coupon_list = document.getElementsByClassName(“coupon-list”);
const coupon_250 = coupon_list[0].children[2];
const endTime = 1541836800 * 1000;
alert ={};
由于网页转出来的是UNIX时间,需要乘上1000才会是JS的时间值。
顺便关闭了弹跳视窗的提醒,不然网页会很难关闭。
接着我们用setInterval()计时,当现在时间-开始抢购时间<= 0时候,再利用setInterval()对折价券的按钮下达按下的指令:
setInterval(waitTime,1)
function waitTime(){
let now = Date.now();
let spanTime = endTime - now;
console.log('剩余时间:',spanTime);
if(spanTime <= 0){
coupon_250.disabled = false;
setInterval(()=>{
console.log(“click”);
coupon_250.click();
},10)
}
}
这样就可以顺利执行了,setInterval(waitTime,10)后面的数字是多少毫秒执行一次(1秒=1000毫秒)。
由于我怕会有误差,所以设定了每一毫秒就执行一次(zflwx)。
但由于时间不一定跟对方网页时间值吻合,所以并不是一定每次都能成功。
当然这个只是秉持学术研究才做出来的,千万别拿来乱用!!
学JS的心路历程 - JS应用的更多相关文章
- 学JS的心路历程 - JS的Class
没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...
- 学JS的心路历程-JS支持面向对象?(二)
昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程-物件与原型(三)
昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-物件与原型(一)
前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...
- 学JS的心路历程-闭包closure
闭包是是纯函式语言的一个特性,也是JS的一个关键性的特色,虽然不了解也能开发程序,但我们不是这种人对吧? 闭包不仅可以减少某些高阶功能的代码数量和复杂度,并且可以让我们做到原本无法做的复杂功能.听到这 ...
随机推荐
- UVa839
这个引用好精髓. #include <iostream> #include <cstring> #include <string> #include <map ...
- sqluldr2 学习心得
前言 最近正在做一个项目,需要导出数据库中的表,单数数据库中有很多带有虚拟列的表,而且表中的数据非常的庞大,有些表中的数据上亿条,项目经理让我研究如何快速导出这些数据. 下面是我研究的一些经历: (1 ...
- 第十七章 java8特性
17.java8中Lambda表达式与Stream API的使用 17.1 Lambda 表达式(Lambda Expressions) 1课时 17.2 函数式(Functional)接口 1课时 ...
- 我发起了一个 操作系统 GUI 和 Tcp / IP 包 的 开源项目 DeviceOS
操作系统 如果 不需要 处理 复杂多样 的 硬件 兼容性, 其实 并不算 大项目, 可以算 毕业设计 . 但是, GUI 和 Tcp / IP 这两个 部分 的 实现逻辑 很多 很复杂, 这 2 ...
- AES对称加密和解密(转)
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- sql server紧急状态下登录脚本
--打开xp_cmdshell功能 EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35) @configv ...
- 【C++】vector用法详解
转自:https://blog.csdn.net/fanyun_01/article/details/56842637#commentBox 一.简介 C++ vector类为内置数组提供了一种替代表 ...
- G2( bizCharts ) React 绘制混合图例
G2( bizCharts ) React 绘制混合图例, // data-set 可以按需引入,除此之外不要引入别的包 import React from 'react'; import { Cha ...
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
- [UE4]Spin Box,数字输入,可拖动
一.Spin Box在Input组下 二.Spin Box的文字样式可以在Spin Box.Display中修改 三.Spin Box事件 1.On Value Changed:值改变时触发 2.On ...