简易的投票系统以及js刷票思路和方法


Posted in Javascript onApril 07, 2015

早就听说有什么刷票脚本,微博投票等等相关的投票都有某些人去刷票。

试一下吧,兴许自己也会刷票呢?捣鼓了几个小时,终于有所眉目。

(1)投票系统

要刷票,就得先有个投票界面。

当然,可以直接去各个投票网站就行,不过这里还是自己弄个投票页面,方便自己。

页面大致如下 或者 查看演示

简易的投票系统以及js刷票思路和方法

照理,界面很简洁,但也基本有了投票的基本功能。

原始规则是:只能投一次票,然后提示成功,然后按钮不可用。

都是原生JS,DOM操作不灵活的可以借此练练手。当然,用jq将会很便捷。

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,它们是同步的,我们无需理会后端的num,因为前端和后端是同步的。

click事件触发时候,js自然会将num同步好。我们要刷票,其实就是触发click事件就行了。

而且,投票系统是别人的页面,我们也无权修改,我们能做的,其实也就是通过js模拟事件的发生。

那自己写好脚本了,该怎么用?

一般就是使用控制台模式,比如FireFox Chrome的控制台,把自己写的脚本放进去,它自会解析执行,处理页面数据。

比如这里的FireBug的控制台里头,左边就是信息展示,右边可以输入js代码。

简易的投票系统以及js刷票思路和方法

或者用chrome的控制台也可以,在里边输入js回车执行就好

简易的投票系统以及js刷票思路和方法

如果还没使用过这些东西的童鞋可以去搜一下相关知识。

那就写一个简单的刷票脚本吧

首先,我们按照正规方式,假设投票页面不是我们写的,我们要怎么刷票?

我们必然要找出投票的关键点。

用审查元素找一下吧,一般就是那个投票按钮。

简易的投票系统以及js刷票思路和方法

简易的投票系统以及js刷票思路和方法

点击那个,然后把鼠标移动到投票页面的按钮试试?在页面中搜寻其他标签信息,比如id class等等,方便等会用到。

简易的投票系统以及js刷票思路和方法

好,确定好相关信息,id 标签类型等等。

现在,我想给two刷票,每两秒钟就给他投一次。我的目的是让two的总票数要保持大于three的(当然,随你怎么想)

那就开始写代码吧,习惯了jquery,在控制台中也可以直接使用。

简易的投票系统以及js刷票思路和方法

或者再旧版本一点的不支持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');

简易的投票系统以及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事件。

但页面是别人的,我们改不了。

所以找啊找,终于找到检测其他诸如div span 等标签内容改变的方法。如果想深入理解这种方法 welcome

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,在控制台右边代码输入区键入完整代码

简易的投票系统以及js刷票思路和方法

2.然后先点击左上角的运行,先让two从零开始刷到5. 比three领先5票

这样一直alert到5次

简易的投票系统以及js刷票思路和方法

3.然后,模拟性的有人给three投了一票,点击three的按钮

简易的投票系统以及js刷票思路和方法

4.检测到three票数有变化了,two继续刷票

简易的投票系统以及js刷票思路和方法

5. 最后,刷到6票又暂停了

简易的投票系统以及js刷票思路和方法

------------------------------------------------------------------------------------------------------

这就是简单的刷票脚本实现。

通过这个最主要的是要学会怎么使用自己的脚本去操作别人的页面。当然,这和所谓的脚本注入不是一回事..

我们做的只是模拟正常页面的事件,人工的去触发它们。

通过这种机制,不仅可以进行投票系统的刷票,也可以进行暴力验证登录啊..但遇到验证码就亏大发了,也可以所谓的火车票抢票脚本啊..不过那应该涉及到更多知识了。

Javascript 相关文章推荐
JS判断表单输入是否为空(示例代码)
Dec 23 Javascript
JavaScript调试技巧之console.log()详解
Mar 19 Javascript
JS限制文本框只能输入数字和字母方法
Feb 28 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
javascript基本语法
May 31 Javascript
Node.js connect ECONNREFUSED错误解决办法
Sep 15 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
Dec 21 Javascript
基于JavaScript实现窗口拖动效果
Jan 18 Javascript
动态Axios的配置步骤详解
Jan 12 Javascript
js实现单元格拖拽效果
Feb 10 Javascript
js实现ajax的用户简单登入功能
Jun 18 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 #Javascript
TypeScript具有的几个不同特质
Apr 07 #Javascript
实现前后端数据交互方法汇总
Apr 07 #Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 #Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 #Javascript
javascript实现画不相交的圆
Apr 07 #Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 #Javascript
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
php中文字符截取防乱码
2008/03/28 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
python切换hosts文件代码示例
2013/12/31 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
python简单实现获取当前时间
2016/08/27 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
大学生求职推荐信
2013/11/27 职场文书
给实习单位的感谢信
2014/02/01 职场文书
称象教学反思
2014/02/03 职场文书
跑出一片天观后感
2015/06/08 职场文书