JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)


Posted in Javascript onFebruary 16, 2016

 最近做了个项目,其中有项目需求是要实现跑马灯抽奖效果,实现此功能主要用到js相关知识,废话不多说,感兴趣的朋友可以阅读下全文。

开始之前先来看上篇文章遗漏的两个问题和几个知识点,是自己重构的过程中需要用到的:

1.移动端1px像素线的问题

对于设计师给我的手机端网页的设计稿都是2倍图。按照道理来说,在写网页的时候,所有对象的实际尺寸都是会除2。但是对于1像素的线呢?

先来看两张图,设计稿的效果:

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一) 

在三星 S4下的实际显示效果:

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一) 

可以看到这个时候1px的线竟然显示不出来了。这个问题是跟 S4手机的屏幕像素密度有关。关于屏幕像素密度和1px 线的关系有很多文章介绍,可以自行搜索了解。我这里的解决方案是,对1px 的线不做处理。是多少就写多少。就算我的基础单位是rem,也不是其它单位。

{
position: absolute;
width: 13rem;
height: 9.2rem;
border:1px solid #000;
}

2.pc 端浏览器和移动端浏览器容错率的差异

先来看一段代码:

$('[node-type=row-a').find('div');

很明显可以发现,我使用的选择器是有语法错误的。但是在浏览器中运行会有什么结果呢?看下图:

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

很明显可以看出对于属性选择器,就算我有语法错误,PC 端浏览器也是可以正确解析的。但是在手机端,这种写法是不能够正确解析,代码不能够运行。

所以写代码的时候一定要注意一些小细节哈。。。

3.jQuery中选择器的使用

在使用 jQuery 或者是 Zepto 的过程中最经常使用的选择器的写法就是下面这样吧,

$('div.testClass')

只是在$() 中写上自己需要的 Dom 节点的 class或者 ID 或 者使用属性选择器。
在查看 jQuery的文档,对于$()会有这样的描述:

jQuery([selector,[context]])

最重要的是看看对 context (它也是我们平时使用中最容易忽略,但是却非常有用的一个参数)的描述:

默认情况下, 如果没有指定context参数,$()将在当前的 HTML document中查找 DOM 元素;如果指定了 context 参数,如一个 DOM 元素集或 jQuery 对象,那就会在这个 context 中查找。在jQuery 1.3.2以后,其返回的元素顺序等同于在context中出现的先后顺序。

刚开始学习 JavaScript 那会儿,就听说了操作 DOM 是很损耗浏览器性能,遍历 DOM 也是很影响程序性能的。
如果我们在指定的范围内查找需要的 Dom 会不会比从整个document 中查找快很多。而且在我们写 web 组件的过程中,一个页面上组件可能出现很多次,那我们怎么判断我们要操作哪个组件呢?这个context参数就会起到决定行的作用。具体请继续看哇。。。

4.jQuery对象到数组的转换

刚开始学习 jQuery的时候在一本书上看到一句话:

jQuery对象就是一个 JavaScript 数组。

而且在使用 jQuery的过程中,都会遇到,js对象转 jQuery对象,jQuery对象转 js对象。关于这些基础不做过多介绍。
但是有时候我们会想在 jQuery对象上运用一些原生Array对象的方法或者属性。来看一个简单的例子:

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

由图中的代码运行结果,可以知道在 jQuery对象上是没有我们要使用reverse方法的。尽管test是一个数组。
那么我们怎么办才可以让 jQuery对象使用原生的 Array对象的方法呢?

4.1使用原型链扩展

比如下面的代码:

jQuery.prototype.reverse=function(){
//一些操作
}

使用prototype来扩展方法的时候,大家一直比较认为是缺点的就是可能会污染已经存在的原型链上的方法。还有就是访问方法的时候需要查找原型链。

4.2将 jQuery对象中的对象添加到数组中

看下面的代码

var test = $('div.test');
var a=[];
$(test).each(function(){
a.push($(this));
});
a.reverse();

这样就可以将 jQuery对象翻转。

4.3使用 Array对象的 from()方法

这种方法也是自己在编写插件过程中使用的方法。看一下文档描述:

Array.from() 方法可以将一个类数组对象或可迭代对象转换成真实的数组。
个人感觉使用这个代码比较简洁。暂时还不知道有没有性能的影响。继续看下面的代码:

var test = $('div.test');
var a= Array.from(test);
a.reverse();

5.setInterval()和setTimeout()对程序性能的影响

因为setTimeout()和setInterval()这两个函数在 JavaScript 中的实现机制完全一样,这里只拿 setTimeout()验证

那么来看两段代码

var a ={
test:function(){
setTimeout(this.bbb,1000);
},
bbb:function(){
console.log('----');
}
};
a.test()

输出结果如下:

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

看下面的代码输出是什么

var a ={
test:function(){
setTimeout(function(){
console.log(this);
this.bbb();
},1000);
},
bbb:function(){
console.log('----');
}
};
a.test();

运行这段代码的时候,代码报错

JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

由以上的结果可以知道,当我们在使用setInterval()和setTimeout()的时候,在回掉中使用this的时候,this的作用域已经发生了改变,并且指向了 window。

setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在”任务队列”的尾部添加一个事件,因此要等到同步任务和”任务队列”现有的事件都处理完,才会得到执行。
意思就是说在我们设置 setTimeout()之后,也可能不是立即等待多少秒之后就立即执行回掉,而是会等待主线程的任务都处理完后再执行,所以存在 “等待”超过自己设置时间的现象。同时也会存在异步队列中已经存在了其它的 setTimeout() 也是会等待之前的都执行完再执行当前的。

看一个 Demo:

setTimeout(function bbb(){},4000);
function aaa(){
setTimeout(function ccc(){},1000);
}
aaa();

如果运行上面的代码,当执行完 aaa() 等待一秒后并不会立即执行 ccc(),而是会等待 bbb() 执行完再执行 ccc() 这个时候离主线程运行结束已经4s 过去了。

以上内容是针对JavaScript实现跑马灯抽奖活动实例代码解析与优化(一),下篇继续给大家分享JavaScript实现跑马灯抽奖活动实例代码解析与优化(二),感兴趣的朋友敬请关注。

Javascript 相关文章推荐
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
使用JavaScript触发过渡效果的方法
Jan 19 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
实现Vue的markdown文档可以在线运行的方法示例
Dec 11 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 Javascript
Vue根据条件添加click事件的方式
Nov 09 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
Feb 06 Javascript
js调用网络摄像头的方法
Dec 05 Javascript
webpack的移动端适配方案小结
Jul 25 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 #Javascript
JavaScript中使用数组方法汇总
Feb 16 #Javascript
jquery拖拽排序简单实现方法(效果增强版)
Feb 16 #Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 #Javascript
学习使用AngularJS文件上传控件
Feb 16 #Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 #Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
Feb 15 #Javascript
You might like
php分页函数完整实例代码
2014/09/22 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
newxtree.js代码
2007/03/13 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
js获取url参数的使用扩展实例
2007/12/29 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python字典基本操作实例分析
2015/07/11 Python
Python实现配置文件备份的方法
2015/07/30 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python实现机器人行走效果
2018/01/29 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
python实现字符串和数字拼接
2020/03/02 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
为什么需要版本控制
2016/10/28 面试题
有关打架的检讨书
2014/01/25 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
详解CSS3浏览器兼容
2022/12/24 HTML / CSS