在群里聊天,一个群友求助。说要实现 文章对比输入,出错了标红,正确的标绿。 同时还需要统计正确率。

我一开始以为很容易,结果搞了半天。最后折腾出来了。

这里的思路如下:利用js的数组。将文章和输入的内容,都转为数组,一对一进行比对。找到错误的,就修改对应的数组元素。加入Html标签。

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<script type="text/javascript" src="jquery.js"></script> <style type="text/css"> #articleArea{
width: 100%;
height: 150px;
border: 1px solid #000;
display:none; }
#userinput{
width: 100%;
height: 150px;
border: 1px solid #000; } </style>
</head>
<body> <p id="article">鲁迅同时又是20世纪世界文化巨人之一。他创造了内外两面,都和世界的时代思潮合流,而又并未梏亡中国的民族性并具有独特的个人风格的“现今想要参与世界上的事业的中国人”的文学。他与同时期的世界杰出的思想家和文学家一样,在关注本民族的同时,也在关注着人类共同面临的问题,并做出了自己的独特贡献
</p> <textarea id="articleArea" > </textarea> <textarea id="userinput">
</textarea> <p id="info"></p> <script type="text/javascript"> Date.prototype.format = function(format){
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
} if(/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
} for(var k in o) {
if(new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
} //获取p标签的内容 var articleStr = $("#article").text(); //全局变量
articleStr = articleStr.replace(/(^\s*)|(\s*$)/g,'');
var count = 0;//发现的错字数量。 var start = false; //开始计时。
var startTime = 0;//开始的时间
var startTimeStr = "";//开始时间的字符串 function checkError () { //获取输入的字符串
var userInputstr = $("#userinput").val();
//去掉空白
userInputstr.replace(/(^\s*)|(\s*$)/g,''); if(userInputstr.length<=1){
return;
} //开始计时
if(!start){
start = true;
startTime = new Date().getTime();
startTimeStr = new Date().format("yyyy-MM-dd hh:mm:ss");
} //转换数组
var userInputarray = new Array(); for (var i = 0; i < userInputstr.length; i++) { userInputarray[i] = userInputstr.charAt(i);
}; //用户输入的字符串长度
var userInputlength = userInputarray.length; var articleArray = new Array(); for (var i = 0; i < articleStr.length; i++) { articleArray[i] = articleStr.charAt(i);
}; //新建数组保存检查后的结果
var resultArray = new Array();
resultArray = articleArray.slice(0); //复制一份 //2个数组进行对比
for (var i = 0; i < userInputarray.length; i++) {
if(userInputarray[i] != articleArray[i]){
//发现不同。
count++; //错误字数量增加一个
//标注错误的字符串。
resultArray[i] = "<span style='background-color:red;'>"+articleArray[i]+"</span>"; }else{
resultArray[i] = "<span style='background-color:#00DD00;'>"+articleArray[i]+"</span>"; } }; //计算输入速度。
var endTime = new Date().getTime();
var spendTime = parseInt((endTime - startTime)/1000); var spendMinute = Math.floor(spendTime/60);
if(spendMinute<=0){
spendMinute =1;
}
var speed =Math.floor(userInputlength / spendMinute); //输出内容
var result = resultArray.join("");
var info = "统计信息:";
info += "开始时间:"+startTimeStr; info+="花费时间:"+spendTime+"秒"; info +="每分钟输入:"+speed; info +="已经输入:"+userInputlength;
info +="正确字数:"+ (userInputlength-count);
info +="正确率:"+Math.round((userInputlength-count) /userInputlength *100)+"%"; $("#article").html(result); $("#info").html(info); //清空
count =""; } var timename=setInterval("checkError();",1000); </script> </body>
</html>

主要的js代码:

        Date.prototype.format = function(format){
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
} if(/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
} for(var k in o) {
if(new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
} //获取p标签的内容 var articleStr = $("#article").text(); //全局变量
articleStr = articleStr.replace(/(^\s*)|(\s*$)/g,'');
var count = 0;//发现的错字数量。 var start = false; //开始计时。
var startTime = 0;//开始的时间
var startTimeStr = "";//开始时间的字符串 function checkError () { //获取输入的字符串
var userInputstr = $("#userinput").val();
//去掉空白
userInputstr.replace(/(^\s*)|(\s*$)/g,''); if(userInputstr.length<=1){
return;
} //开始计时
if(!start){
start = true;
startTime = new Date().getTime();
startTimeStr = new Date().format("yyyy-MM-dd hh:mm:ss");
} //转换数组
var userInputarray = new Array(); for (var i = 0; i < userInputstr.length; i++) { userInputarray[i] = userInputstr.charAt(i);
}; //用户输入的字符串长度
var userInputlength = userInputarray.length; var articleArray = new Array(); for (var i = 0; i < articleStr.length; i++) { articleArray[i] = articleStr.charAt(i);
}; //新建数组保存检查后的结果
var resultArray = new Array();
resultArray = articleArray.slice(0); //复制一份 //2个数组进行对比
for (var i = 0; i < userInputarray.length; i++) {
if(userInputarray[i] != articleArray[i]){
//发现不同。
count++; //错误字数量增加一个
//标注错误的字符串。
resultArray[i] = "<span style='background-color:red;'>"+articleArray[i]+"</span>"; }else{
resultArray[i] = "<span style='background-color:#00DD00;'>"+articleArray[i]+"</span>"; } }; //计算输入速度。
var endTime = new Date().getTime();
var spendTime = parseInt((endTime - startTime)/1000); var spendMinute = Math.floor(spendTime/60);
if(spendMinute<=0){
spendMinute =1;
}
var speed =Math.floor(userInputlength / spendMinute); //输出内容
var result = resultArray.join("");
var info = "统计信息:";
info += "开始时间:"+startTimeStr; info+="花费时间:"+spendTime+"秒"; info +="每分钟输入:"+speed; info +="已经输入:"+userInputlength;
info +="正确字数:"+ (userInputlength-count);
info +="正确率:"+Math.round((userInputlength-count) /userInputlength *100)+"%"; $("#article").html(result); $("#info").html(info); //清空
count =""; } var timename=setInterval("checkError();",1000);

最后的效果:

js实现的文章输入检查与测速。的更多相关文章

  1. js实现的文章输入检查与测速。(纯js版本)

    朋友又提出一些需求.希望不要jquery .于是修改成js版本. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  2. js限制input只能输入有效的数字,有且只有一个小数点,第一个不能为小数点-备

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. js正则实现用户输入银行卡号的控制及格式化

    //js正则实现用户输入银行卡号的控制及格式化 <script language="javascript" type="text/javascript"& ...

  4. [推荐]InfoQ上的深入浅出Node.js的系列文章

    InfoQ上的深入浅出Node.js的系列文章 详情如下链接:http://www.heiboard.com/?p=2081

  5. 网址测速JS

    /*.route_nav li a:hover{background: #3c7f84 url(title.png) no-repeat;border-color:#84a3a5;}*/ .route ...

  6. BJSV-P-002高精度测速一体机

    测速.抓拍.录像于一体,产品处于行业顶尖水平. 1        测速一体机参数 2       接口和资源 3      相机接口 1.       前面板接口 测速一体机镜头接口采用C-Mount ...

  7. iOS炫酷动画图案、多种选择器、网络测速、滑动卡片效果等源码

    iOS精选源码 对网络进行测速 自实现大标题,配合原生骨架屏demo 简单方便的pickerVIew记录数据 LZPickerView 科技风绘制组件,简单快速"画"出炫酷图案 R ...

  8. 网络测速神器:SpeedTest深度指南

    最近在测试一个项目,里面涉及到一个测试case:在linux服务器上,当网络带宽较差时,观察服务的消息处理能力和表现.限制网卡带宽有许多方法,比如Wondershaper或者ethtool.那验证限速 ...

  9. fio硬盘测速windows+linux

    一.FIO工具简介 Fio工具的介绍网上有很多,都是可以通用的,这里就不做太多个人描述了,直接借鉴一下 fio是一种I / O工具,用于基准测试和压力/硬件验证.它支持19种不同类型的I / O引擎( ...

随机推荐

  1. Django - 模型表单(创建、更新、删除)

    urls.py # /music/alubm/add/ url(r'^album/add/$', views.AlbumCreate.as_view(), name="album-add&q ...

  2. HTTP代理浅说

    简单的说HTTP代理就是处于HTTP客户端和服务器端之间,中转消息的中间人. 一种代理是代客户端去请求服务器,叫做Forward Proxy正向代理:另一种是代理真正的服务器来接收用户请求,叫做Rev ...

  3. jquery控制audio的播放与暂停

    <audio id="audio" src='music.mp3'></audio> <script type="type/javascri ...

  4. Ubuntu vim显示行号语法高亮自动缩进

    配置文件名为Ubuntu vimrc在Fedora中vim的配置文件存放在/etc目录中,配置文件名为Ubuntu vimrc在终端 输入以下命令来编辑Ubuntu vimrc配置文件:sudo vi ...

  5. 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript

    原文:http://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/ Build Your o ...

  6. 使用JQuery结合HIghcharts实现从后台获取JSON实时刷新图表

    项目做了一个报表,可以实时的观察呼叫中心的电话访问量,之前的版本是使用JFreechart做的,使用一段时间后出现内存溢出,服务器的内存使用量会变得很大,所以改用Ajax前台加载数据的方式实现实时报表 ...

  7. Strut2 spring hibernate 整合

    一.创建web项目工程 wzz 点击finish 2.添加spring Jar包   AOP,Core,Persistence Core ,web jar 点击next 点击Finish 3.配置Da ...

  8. Friends and Subsequences

    Friends and Subsequences Mike and !Mike are old childhood rivals, they are opposite in everything th ...

  9. Android ---paint类

    引自:http://www.cnblogs.com/-OYK/archive/2011/10/25/2223624.html Android Paint和Color类   要绘图,首先得调整画笔,待画 ...

  10. 原创:LoadTest系列之Insert Condition

    当脚本中的部分内容需要满足某些条件后才执行时,则可以使用Insert Condition,例如有如下操作: 操作1:登录 操作2:添加一条数据: 在这两个操作中,只有操作1成功后,操作2才有意义,这时 ...