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 相关文章推荐
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
jquery高级编程的最佳实践详解
Mar 23 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
手机端转换rem适应
Apr 01 Javascript
关于express与koa的使用对比详解
Jan 25 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
vue项目中跳转到外部链接的实例讲解
Sep 20 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 Javascript
ES6中的类(Class)示例详解
Dec 09 Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP中的类型约束介绍
2015/05/11 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
js的一些常用方法小结
2011/06/29 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
Python中and和or如何使用
2020/05/28 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
安全员岗位职责
2013/11/11 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
优秀学生评语大全
2014/04/25 职场文书
村干部培训方案
2014/05/02 职场文书
2015年端午节活动总结
2015/02/11 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
浅谈MySQL之select优化方案
2021/08/07 MySQL
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA