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弹簧振子超简洁版 完全符合能量守恒,胡克定理
Oct 25 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
Mar 04 Javascript
微信小程序实战之自定义抽屉菜单(7)
Apr 18 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
在Vue项目中使用Typescript的实现
Dec 19 Javascript
JS实现横向轮播图(初级版)
Jun 24 Javascript
js实现无缝轮播图效果
Mar 09 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 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
桌面中心(四)数据显示
2006/10/09 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
值传递还是引用传递
2015/02/08 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
网络程序员自荐信
2014/01/25 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
创先争优个人总结
2015/03/04 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
爱国之歌(8首)
2019/09/29 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
教你部署vue项目到docker
2022/04/05 Vue.js
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL
基于Python实现nc批量转tif格式
2022/08/14 Python