基于原生JS的简易投票系统设计与前端刷票脚本实现
本文介绍如何使用原生JavaScript构建一个简易的前端投票界面,并深入解析通过浏览器控制台模拟点击事件实现刷票的技术原理。文章详细讲解了DOM元素查找、定时器控制投票频率以及监听DOM变化以维持票数优势的具体代码实现,旨在帮助开发者理解前端事件机制与脚本注入的基本逻辑。
简易投票系统设计与开发
此前曾听闻存在各类刷票脚本,针对微博投票等平台的刷票行为屡见不鲜。
出于好奇尝试实践,经过数小时的调试与探索,逐渐理清了相关实现逻辑。
(1)投票系统
实施刷票的前提是拥有一个可供操作的投票界面。
虽然可以直接利用现有的投票网站,但为了便于测试与调试,此处选择自行搭建一个简易的投票页面。
页面大致如下 或者 查看演示

界面设计力求简洁,但已具备投票功能的基本要素。
原始规则设定为:用户仅能投票一次,提交成功后按钮将变为不可用状态。
代码完全采用原生JS编写,DOM操作不熟练的开发者可借此机会进行练习;若使用jQuery则可实现更为便捷的开发。
html/css部分
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<head>
<title>投票系统 & js脚本简单刷票</title>
<style type="text/css">
*{padding: 0;margin: 0;}
#wrap{margin: 0 auto; width:600px; text-align: center;}
.person{position: relative; margin: 20px; float: left;}
.person h4,
.person p,
.person button{margin-bottom: 5px;}
.person h4{color: blue;}
.person span{color: red;}
.person button:hover{cursor: pointer; font-weight: bold;}
.clear{clear: both;}
</style>
</head>
<body>
<div id="wrap">
<h3>给你的小伙伴投上一票吧</h3>
<div class="person">
<h4>one</h4>
<p>总票数: <span>0</span> 票</p>
<button>给它投票</button>
</div>
<div class="person">
<h4>two</h4>
<p>总票数: <span>0</span> 票</p>
<button>给它投票</button>
</div>
<div class="person">
<h4>three</h4>
<p>总票数: <span>0</span> 票</p>
<button>给它投票</button>
</div>
<div class="person">
<h4>four</h4>
<p>总票数: <span>0</span> 票</p>
<button>给它投票</button>
</div>
<div class="clear"></div>
</div>
js部分
<script type="text/javascript">
function getElemensByClassName(className){ // 通过class获取
var classArr = new Array();
var tags = document.getElementsByTagName("*"); //获取所有节点
for(var item in tags){
if(tags[item].nodeType == 1){
if(tags[item].getAttribute("class") == className){
classArr.push(tags[item]); //收集class匹配的节点
}
}
}
return classArr;
}
function delete_FF(element){ // 在FireFox中删除子节点为空的元素
var childs = element.childNodes;
for(var i=0;i<childs.length;i++){
var pattern = /\s/; //模式匹配,内容为空
if(childs[i].nodeName == "#text" && pattern.test(childs[i].nodeValue)){ //处理
//alert(childs[i].nodeName);
element.removeChild(childs[i]); //删除FF中获取的空节点
}
}
}
window.onload = function(){
var persons = getElemensByClassName("person");
// alert(persons);
for(var item in persons){ //遍历所有person,为它们绑定投票事件
(function(_item){ //匿名函数传入item, 防止因作用域问题导致item总为最后一个
delete_FF(persons[_item]); //出去FF中空行代表的子节点
persons[_item].setAttribute("id","person"+(parseInt(_item)+1)); //赋上id
var childs = persons[_item].childNodes;
for(var i = 0;i<childs.length;i++){
//alert(childs[i].nodeName);
if(childs[i].nodeName == "BUTTON"){ //点击按钮投票
var oButton = childs[i];
}
if(childs[i].nodeName == "P"){ //投票结果更新
var oP = childs[i];
var oSpan = oP.getElementsByTagName("span")[0];
}
}
if(oButton != null){
oButton.onclick = function(){ //事件绑定
var num = oSpan.innerHTML; //获取票数
oSpan.innerHTML = (++num); //票数更新
// 这时一般我们可能就需要把这个票数num传送给服务器保存,更新时也是和服务器中的num同步
this.setAttribute("disabled","true"); // 一般只能投票一次的吧
alert("投票成功,谢谢您的支持");
};
}
})(item); // 传入各项person
}
};
</script>
代码注释已尽可能清晰,这构成了一个功能简单的投票页面基础。
前端刷票脚本实现原理
(2)刷票脚本实现
所谓刷票脚本,即通过自动化程序模拟投票行为,其核心在于如何触发投票逻辑。
基于前述代码可知,常规投票流程即点击“投票”按钮,进而触发后端数据处理。
前端存在一个票数统计变量num,后端同样拥有同步的num变量,由于两者保持同步,我们无需关注后端逻辑。
当click事件被触发时,JS会自动同步num值。因此,刷票的本质即模拟触发click事件。
鉴于投票页面属于第三方,我们无法直接修改其源码,所能做的仅是通过JS模拟事件的发生。
脚本编写完成后,应如何调用执行?
通常采用控制台模式,例如Firefox或Chrome浏览器的开发者工具控制台,将编写的脚本粘贴其中,浏览器会自动解析并执行以处理页面数据。
例如在FireBug的控制台中,左侧用于展示信息,右侧为代码输入区。

或者使用Chrome的控制台,在内部输入JS代码并按回车执行即可。

若尚未熟悉此类工具,建议搜索相关教程学习基础知识。
刷票脚本代码编写与测试
接下来编写一个基础的刷票脚本。
首先假设投票页面并非由我们开发,我们需要确定刷票的关键切入点。
必须识别出投票操作的核心要素。
利用浏览器审查元素功能定位,通常目标即为投票按钮。


点击该按钮后,将鼠标悬停在投票页面的按钮上,在页面中搜寻其他标签信息,如id、class等,以便后续脚本调用。

确认相关信息,包括id、标签类型等属性。
假设目标是给“two”选项刷票,设定每两秒执行一次投票,目的是使“two”的总票数始终高于“three”(具体策略可根据需求调整)。
开始编写代码,若习惯使用jQuery,在控制台中可直接调用。

若目标页面未引入jQuery或版本过低,需在代码中动态加载:
javascript:(function(url) {
var s = document.createElement('script');
s.src = url;
(document.getElementsByTagName('head')[0] ||
document.getElementsByTagName('body')[0]).appendChild(s);
})('http://code.jquery.com/jquery-2.1.3.js');

正式开始
1.编写通用刷票函数
function brushVotes(){ //刷票函数
var t = setInterval(function(){
var three_num = $("#person3>p>span").text(); //three票数
var two_num = $("#person2>p>span").text(); // two票数
console.info(two_num+" "+three_num);
if(two_num - three_num < 5){ //要保持领先5票的优势
$("#person2>button").click().attr("disabled",false); //触发投票的事件click,投完后记得把投票权限拿回来
}
if(two_num - three_num == 5){ //5票领先了就此打住
clearInterval(t);
}
},2000);
}
利用定时器,设定每两秒执行一次投票事件,当领先优势达到5票时暂停执行。
2.调用刷票函数
初始调用一次,点击运行时脚本即开始执行。
随后监听“three”票数变化,并绑定相应处理逻辑。
普通的change事件仅支持表单相关标签元素,虽然可将票数显示的span改为input以支持onchange事件。
但页面属于他人,我们无法修改其HTML结构。
经过排查,最终找到检测div、span等非表单标签内容变化的方法。若需深入理解此机制,可参考相关文档。
brushVotes(); // 刷票
$("#person3>p>span").bind('DOMNodeInserted', function(e) { //three改变则 触发
brushVotes(); //继续刷票
});
如此,当“three”票数发生变化时,即可自动触发继续刷票的逻辑。
完整脚本
javascript:(function(url) {
var s = document.createElement('script');
s.src = url;
(document.getElementsByTagName('head')[0] ||
document.getElementsByTagName('body')[0]).appendChild(s);
})('http://code.jquery.com/jquery-2.1.3.js');
brushVotes(); // 刷票
$("#person3>p>span").bind('DOMNodeInserted', function(e) { //three改变则 触发
brushVotes(); //继续刷票
});
function brushVotes(){ //刷票函数
var t = setInterval(function(){
var three_num = $("#person3>p>span").text(); //three票数
var two_num = $("#person2>p>span").text(); // two票数
console.info(two_num+" "+three_num);
if(two_num - three_num < 5){ //要保持领先5票的优势
$("#person2>button").click().attr("disabled",false); //触发投票的事件click,投完后记得把投票权限拿回来
}
if(two_num - three_num == 5){ //5票领先了就此打住
clearInterval(t);
}
},2000);
}
最后进行模拟测试。
1.进入投票页面,调出Firebug,在控制台右侧代码输入区粘贴完整代码。

2.点击左上角运行按钮,使“two”从零开始刷票至5票,即比“three”领先5票。
此过程将触发5次alert提示。

3.模拟其他用户给“three”投一票,点击“three”的按钮。

4.检测到“three”票数变化后,“two”继续自动刷票。

5.最终当“two”达到6票时再次暂停。

------------------------------------------------------------------------------------------------------
这便是简易刷票脚本的实现过程。
通过此案例,核心在于掌握如何利用脚本操作第三方页面,这与常见的恶意脚本注入有所区别。
我们所做的是模拟正常页面的事件交互,由人工触发这些事件。
利用此机制,除投票系统外,还可用于暴力破解登录验证等场景,但遇到验证码则效果受限;此外也可用于火车票抢票脚本,但这涉及更复杂的技术知识。
D3.js 处理大规模数据点的性能优化策略
2026-11-05 15:37:25
JS实现网页摄像头实时扫码:结合getUserMedia与jsQR教程
2026-11-05 15:27:28
D3.js v5 迁移到 v7 的 API 变更与注意事项
2026-11-05 11:57:17
使用 animate.js 实现多元素协同的序列动画
2026-11-04 22:27:53
JS拖拽排序时怎么添加平滑动画效果?FLIP技术实战
2026-11-04 10:12:22








