JavaScript实现仿淘宝商品购买数量的增减效果


Posted in Javascript onJanuary 22, 2016

近期在开发一个地方O2O租书项目,使用ASP.NET MVC技术,其中在图书详情页,用户可以输入借阅的数量,这里使用了js来控制数量的增减和校验。

1.数量一定是数字

2.点击增减按钮的时候要能自动加1或减1

3.用户输入的内容如果是非数字,则不能输入(退格键除外)

4.用户输入的值最小为1

5.输入框离开焦点时要检查取值范围,确保输入框中必须是范围内的数字

基本就是以上几点

效果如下:

JavaScript实现仿淘宝商品购买数量的增减效果

以下是Html代码

<div class="bookNum">
<a id="sub" href="javascript:void(0);">-</a>
<input type="text" value="1" id="bookNum">
<a id="add" href="javascript:void(0);">+</a>
<a href="javascript:void(0);" id="addCart">加入借阅台</a>
<div class="clear"></div>
</div>

首先看第一条:

输入一定是数字

这很容易想到用keyup事件监测,用正则表达式替换非数字字符

$("#bookNum").keyup(function(){
var regex = /[^\d]*/g;
var numVal = $(this).val();
numVal = numVal.replace(regex,"");
numVal = parseInt(numVal)||;
numVal = numVal < ? : numVal;
$(this).val(numVal);
});

这样就可以保证用户输入的一定是数字了,并且我们中间做了校验,如果使用parseInt转换为整数后值是NaN,就让值为1 ,但是我们会发现一个现象,就是用户如果想清空里面的值输入20的时候,发现里面的值总是会变成1

这是不合理的,并且体验也不好,在输入非数字的时候,会先显示那个字符,然后被替换掉。

再观察一下当当网,京东这些网站,当输入非数字时,输入框根本就不会有任何动静,退格后 还能随意输入数字。经研究发现,他们使用了监控键盘的方法,拦截输入。

经过改进后:

$("#bookNum").keypress(function(b) {
var keyCode = b.keyCode ? b.keyCode : b.charCode;
if (keyCode != 0 && (keyCode < 48 || keyCode > 57) && keyCode != 8 && keyCode != 37 && keyCode != 39) {
return false;
} else {
return true;
}
})

这样我们保证了在用户使用取消回车(0),退格(8),左右箭头(37 39)和数字时 正常输入,其他按键就统统失效了。这样就能保证输入的内容是数字了。

但是还有一个问题,用户使用退格键将内容清空后,用户没有输入的时候,值为空

这就要使用keyup和blur事件来弥补了

$("#bookNum").keypress(function(b) {
var keyCode = b.keyCode ? b.keyCode : b.charCode;
if (keyCode != 0 && (keyCode < 48 || keyCode > 57) && keyCode != 8 && keyCode != 37 && keyCode != 39) {
return false;
} else {
return true;
}
}).keyup(function(e) {
var keyCode = e.keyCode ? e.keyCode : e.charCode;
console.log(keyCode);
if (keyCode != 8) {
var numVal = parseInt($("#bookNum").val()) || 0;
numVal = numVal < 1 ? 1 : numVal;
$("#bookNum").val(numVal);
}
}).blur(function() {
var numVal = parseInt($("#bookNum").val()) || 0;
numVal = numVal < 1 ? 1 : numVal;
$("#bookNum").val(numVal);
});

这样就能保证用户在输入数字的时候的校验。

使用按钮控制就更容易了:

//增加
$("#add").click(function() {
var num = parseInt($("#bookNum").val()) || 0;
$("#bookNum").val(num + 1);
});
//减去
$("#sub").click(function() {
var num = parseInt($("#bookNum").val()) || 0;
num = num - 1;
num = num < 1 ? 1 : num;
$("#bookNum").val(num);
});

好了,这样就完美解决用户输入了。

当然,这里仅仅说明了js的控制,里面还可以加入其它控制,比如最大限制,库存查询,服务器校验等。这里就不再赘述。

Javascript 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
Jquery cookie操作代码
Mar 14 Javascript
尝试在让script的type属性等于text/html
Jan 15 Javascript
基于jquery实现的树形菜单效果代码
Sep 06 Javascript
JS处理json日期格式化问题
Oct 01 Javascript
JavaScript中的闭包
Feb 24 Javascript
jQuery中的基本选择器用法学习教程
Apr 14 Javascript
AngularJs Understanding the Controller Component
Sep 02 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 Javascript
JavaScript程序设计高级算法之动态规划实例分析
Nov 24 Javascript
深入解读Node.js中的koa源码
Jun 17 Javascript
js回调函数原理与用法案例分析
Mar 04 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 #Javascript
JavaScript学习笔记整理之引用类型
Jan 22 #Javascript
jQuery弹层插件jquery.fancybox.js用法实例
Jan 22 #Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 #Javascript
jQuery validate插件实现ajax验证重复的2种方法
Jan 22 #Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 #Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 #Javascript
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
收集的PHP中与数组相关的函数
2007/03/22 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
python读取和保存视频文件
2018/04/16 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python单例模式的多种实现方法
2019/07/26 Python
使用python求解二次规划的问题
2020/02/29 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
小学教师的个人自我鉴定
2013/10/26 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
村班子对照检查材料
2014/08/18 职场文书
捐款活动总结
2014/08/27 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
飞越疯人院观后感
2015/06/09 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏