您的位置:

首页 >

网页技巧 >

Node.js 日志处理模块log4js >

Node.js 日志处理模块log4js

2016-11-07 09:05:01

分类:网页技巧

log4js 是 Node.js 日志处理中的数一数二的模块。比起 console 或者 TJ 的 debug 有其优势,尤其针对投入生产的 Node.js 项目来说下面这些是不可少的: 日志分级 日志分类 日志落盘 本文将会给你一个 log4js 的全面介绍,让你可以在项目中驾轻就熟的使用 log4js,开发调试容易,线上更好地监控或排查问题。牛刀小试下面这三行代码为你展示了 log4js 最简单的用法:// file: simplest.jsvar log4js = require('log4js');var logger = log4js.getLogger();logger.debug("Time:", new Date());调用 .getLogger() 可以获得 log4js 的 Logger 实例,这个实例的用法与 console 是一致的,可以调用 .debug (也有 .info 、 .error 等方法)来输出日志。运行 node simplest.js ,输出如下:$node simplest.js[2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852ZTime: 2016-08-20T16:01:24.852Z 是我们想要输出的内容,前面的包含说明符 [2016-08-21 00:01:24.852] [DEBUG] [default] 后文再表。使用起来是不是也很简单,好了,在我们深入到 log4js 高级用法之前,我们先来熟悉一下几个 log4js 中的概念。Level这个理解起来不难,就是日志的分级。日志有了分级,log4js 才能更好地为我们展示日志(不同级别的日志在控制台中采用不同的颜色,比如 error 通常是红色的),在生产可以有选择的落盘日志,比如避免一些属于 .debug 才用的敏感信息被泄露出来。log4js 的日志分为九个等级,各个级别的名字和权重如下:{ ALL: new Level(Number.MIN_VALUE, "ALL"), TRACE: new Level(5000, "TRACE"), DEBUG: new Level(10000, "DEBUG"), INFO: new Level(20000, "INFO"), WARN: new Level(30000, "WARN"), ERROR: new Level(40000, "ERROR"), FATAL: new Level(50000, "FATAL"), MARK: new Level(9007199254740992, "MARK"), // 2^53 OFF: new Level(Number.MAX_VALUE, "OFF")}上个图:ALL OFF 这两个等级并不会直接在业务代码中使用。剩下的七个即分别对应 Logger 实例的七个方法, .trace .debug .info ... 。也就是说,你在调用这些方法的时候,就相当于为这些日志定了级。因此,之前的 [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z 中的 DEBUG 既是这条日志的级别。类型log4js 还有一个概念就是 category(类型),你可以设置一个 Logger 实例的类型,按照另外一个维度来区分日志:// file: set-catetory.jsvar log4js = require('log4js');var logger = log4js.getLogger('example');logger.debug("Time:", new Date());在通过 getLogger 获取 Logger 实例时,唯一可以传的一个参数就是 loggerCategory(如 'example' ),通过这个参数来指定 Logger 实例属于哪个类别。这与 TJ 的 debug 是一样的:var debug = require('debug')('worker');setInterval(function(){ debug('doing some work');}, 1000);在 debug 中 'worker' ,同样也是为日志分类。好了,回来运行 node set-catetory.js :[2016-08-21 01:16:00.212] [DEBUG] example - Time: 2016-08-20T17:16:00.212Z与之前的 [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z 唯一不同的地方就在于, [default] 变成了 example 。那类别有什么用呢,它比级别更为灵活,为日志了提供了第二个区分的维度,例如,你可以为每个文件设置不同的 category,比如在 set-catetory.js 中:// file: set-catetory.jsvar log4js = require('log4js');var logger = log4js.getLogger('set-catetory.js');logger.debug("Time:", new Date());就可以从日志 [2016-08-21 01:24:07.332] [DEBUG] set-catetory.js - Time: 2016-08-20T17:24:07.331Z 看出,这条日志来自于 set-catetory.js 文件。又或者针对不同的 node package 使用不同的 category,这样可以区分日志来源于哪个模块。Appender好了,现在日志有了级别和类别,解决了日志在入口处定级和分类问题,而在 log4js 中,日志的出口问题(即日志输出到哪里)就由 Appender 来解决。默认 appender下面是 log4js 内部默认的 appender 设置:// log4js.jsdefaultConfig = { appenders: [{ type: "console" }]}可以看到,在没有对 log4js 进行任何配置的时候,默认将日志都输出到了控制台。设置自己的 appender我们可以通过 log4js.configure 来设置我们想要的 appender。// file: custom-appender.jsvar log4js = require('log4js');log4js.configure({ appenders: [{ type: 'file', filename: 'default.log' }]})var logger = log4js.getLogger('custom-appender');logger.debug("Time:", new Date());在上例中,我们将日志输出到了文件中,运行代码,log4js 在当前目录创建了一个名为 default.log 文件, [2016-08-21 08:43:21.272] [DEBUG] custom-appender - Time: 2016-08-21T00:43:21.272Z 输出到了该文件中。log4js 提供的 appenderConsole 和 File 都是 log4js 提供的 appender,除此之外还有:DateFile:日志输出到文件,日志文件可以安特定的日期模式滚动,例如今天输出到 default-2016-08-21.log ,明天输出到 default-2016-08-22.log ;SMTP:输出日志到邮件;Mailgun:通过 Mailgun API 输出日志到 Mailgun;levelFilter 可以通过 level 过滤;等等其他一些 appender,到 这里 可以看到全部的列表。过滤级别和类别我们可以调整 appender 的配置,对日志的级别和类别进行过滤:// file: level-and-category.jsvar log4js = require('log4js');log4js.configure({ appenders: [{ type: 'logLevelFilter', level: 'DEBUG', category: 'category1', appender: { type: 'file', filename: 'default.log' } }]})var logger1 = log4js.getLogger('category1');var logger2 = log4js.getLogger('category2');logger1.debug("Time:", new Date());logger1.trace("Time:", new Date());logger2.debug("Time:", new Date());运行,在 default.log 中增加了一条日志:[2016-08-21 10:08:21.630] [DEBUG] category1 - Time: 2016-08-21T02:08:21.629Z来看一下代码:使用 logLevelFilter 和 level 来对日志的级别进行过滤,所有权重大于或者等于 DEBUG 的日志将会输出。这也是之前提到的日志级别权重的意义;通过 category 来选择要输出日志的类别, category2 下面的日志被过滤掉了,该配置也接受一个数组,例如 ['category1', 'category2'] ,这样配置两个类别的日志都将输出到文件中。LayoutLayout 是 log4js 提供的高级功能,通过 layout 我们可以自定义每一条输出日志的格式。log4js 内置了四中类型的格式:messagePassThrough:仅仅输出日志的内容;basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。一个 pattern 的例子:// file: layout-pattern.jsvar log4js = require('log4js');log4js.configure({ appenders: [{ type: 'console', layout: { type: 'pattern', pattern: '[%r] [%[%5.5p%]] - %m%n' } }]})var logger = log4js.getLogger('layout-pattern');logger.debug("Time:", new Date());%r %p $m $n 是 log4js 内置的包含说明符,可以借此来输出一些 meta 的信息,更多细节,可以参考 log4js 的 文档 。一张图再来说明一下,Logger、Appender 和 Layout 的定位。实战:输出 Node 应用的 ACCESS 日志 access.log为了方便查问题,在生产环境中往往会记录应用请求进出的日志。那使用 log4js 怎么实现呢,直接上代码:// file: server.jsvar log4js = require('log4js');var express = require('express');log4js.configure({ appenders: [{ type: 'DateFile', filename: 'access.log', pattern: '-yyyy-MM-dd.log', alwaysIncludePattern: true, category: 'access' }]});var app = express();app.use(log4js.connectLogger(log4js.getLogger('access'), { level: log4js.levels.INFO }));app.get('/', function(req,res) { res.send('前端外刊评论');});app.listen(5000);看看我们做了哪些事情:配置了一个 appender,从日志中选出类别为 access 的日志,输出到一个滚动的文件中;log4js.getLogger('access') 获取一个类别为 access 的 Logger 实例,传递给 log4js.connectLogger 中间件,这个中间件收集访问信息,通过这个实例打出。启动服务器,访问 http://localhost:5000,你会发现目录中多了一个名为 access.log-2016-08-21.log 的文件,里面有两条日志:[2016-08-21 14:34:04.752] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 18 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"[2016-08-21 14:34:05.002] [INFO] access - ::1 - - "GET /favicon.ico HTTP/1.1" 404 24 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"通过 log4js 日志的分类和appender功能,我们把访问日志输出到了一个滚动更新的文件之中。总结本文为大家全面地介绍了 log4js 的用法,与 console 或者简单的日志工具相比,log4js 使用起来更复杂,当然功能更强大,适合生产级应用的使用。如果大家有兴趣的话,请留言告诉外刊君,接下来可能为大家介绍如何在 Node 应用中做配置管理。

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。语法arrayObject.splice(index,howmany,item1,.....,itemX) 参数说明 参数 描述 index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 item1, …, itemX 可选。向数组添加的新项目。 实例添加一个元素var array = [1,2,3,4,6];array.splice(4,0,5);结果:array为[1,2,3,4,5,6]。删除并替换一个元素var array = [1,2,2,4,5];array.splice(2,1,2);结果:array为[1,2,3,4,5]。以上就是小编为大家带来的JS 在数组指定位置插入/删除数据的方法全部内容了,

代码分两个部分:1、HTML部分,根据注释处理即可;2、play.js插件部分,引到HTML里面即可。1、HTML部分:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title></title> <style>/*style标签及其内的内容,在实际项目中可以不要*/ * { margin: 0; padding: 0; } </style></head><body><!--body标签里的内容,没说可以增减或更改的,不要增减或更改--><div id="box"> <div> <!--以下是可增减区域--> <div><img src="img/banner1.jpg" alt=""/></div> <div><img src="img/banner2.jpg" alt=""/></div> <div><img src="img/banner3.jpg" alt=""/></div> <div><img src="img/banner4.jpg" alt=""/></div> <div><img src="img/banner5.jpg" alt=""/></div> <div><img src="img/banner6.jpg" alt=""/></div> <div><img src="img/banner7.jpg" alt=""/></div> <!--以上是可增减区域--> </div></div><script src="play.js"></script><script> var play= new Banner('1000px', '500px'); /*这两个参数分别是轮播区的宽和高,可以根据需要更改*/</script></body></html>2、play.js插件部分function Banner(width, height) {/*类*/ /*以下最外层div*/ var that = this; this.width = width; this.height = height; this.oBox = document.getElementById("box"); this.oBox.style.width = width; this.oBox.style.height = height; this.oBox.style.margin = "0 auto"; this.oBox.style.overflow = "hidden"; this.oBox.style.position = "relative"; /*以下轮播区的div*/ this.oBoxInner = this.oBox.getElementsByTagName('div')[0]; this.oBoxInner.style.height = height; this.oBoxInner.style.position = "absolute"; this.oBoxInner.style.left = 0; this.oBoxInner.style.right = 0; this.aDiv = this.oBoxInner.getElementsByTagName('div');//单个轮播图 this.oBoxInner.innerHTML/* 轮播区的内部后面*/ += this.aDiv[0].outerHTML/*第一个轮播图片的外部*/; this.oBoxInner.style.width = parseFloat(width) * this.aDiv.length + "px";//轮播区的宽度 for (var i = 0; i < this.aDiv.length; i++) {/*遍历轮播区的每个div及其内部的图片*/ this.aDiv[i].style.width = width; this.aDiv[i].style.height = height; this.aDiv[i].style.float = "left"; this.aDiv[i].aImg = this.aDiv[i].getElementsByTagName('img')[0]; this.aDiv[i].aImg.style.width = "100%"; this.aDiv[i].aImg.style.height = "100%"; } /*以下是焦点区部分(定位在轮播区的右下方)*/ var oUl=document.createElement('ul'); for(i=0; i<this.aDiv.length-1; i++){ oUl.innerHTML+='<li class='+i+'===1?"on":null></li>'; } this.oBox.appendChild(oUl); this.oUl = this.oBox.getElementsByTagName('ul')[0]; this.oUl.style.position = "absolute"; this.oUl.style.right = "10px"; this.oUl.style.bottom = "10px"; this.aLi = this.oUl.getElementsByTagName('li'); for (i = 0; i < this.aLi.length; i++) {/*遍历焦点区的每个焦点*/ this.aLi[i].style.width = "18px"; this.aLi[i].style.height = "18px"; this.aLi[i].style.float = "left"; this.aLi[i].style.listStyle = "none"; this.aLi[i].style.background = "green"; this.aLi[i].style.borderRadius = "50%"; this.aLi[i].style.marginLeft = "10px"; this.aLi[i].style.cursor = "pointer"; } /*以下是向左向右两个箭头式按钮*/ for(i=0; i<2; i++){ var oA=document.createElement('a'); oA.href="javascript:;" rel="external nofollow" this.oBox.appendChild(oA); } /*以下是左按钮(点击它,图片向左运动)*/ this.oBtnL = this.oBox.getElementsByTagName('a')[0]; this.oBtnL.style.width = "30px"; this.oBtnL.style.height = "30px"; this.oBtnL.style.position = "absolute"; this.oBtnL.style.top = (parseFloat(this.height) / 2 - 15) + "px"; this.oBtnL.style.left = "30px"; this.oBtnL.style.border = "10px solid red"; this.oBtnL.style.borderLeft = "none"; this.oBtnL.style.borderBottom = "none"; this.oBtnL.style.opacity = "0.3"; this.oBtnL.style.filter = "alpha(opacity=30)"; this.oBtnL.style.display = "none"; this.oBtnL.style.transform = "rotate(-135deg)"; this.oBtnL.onclick = function () { if (that.step <= 0) { that.step = that.aDiv.length - 1; that.css(that.oBoxInner, 'left', -that.step * parseFloat(that.width)); } that.step--; that.animate(that.oBoxInner, {left: -that.step * parseFloat(that.width)}); that.bannerTip(); }; /*以下是右按钮(点击它,图片向右运动)*/ this.oBtnR = this.oBox.getElementsByTagName('a')[1]; this.oBtnR.style.width = "30px"; this.oBtnR.style.height = "30px"; this.oBtnR.style.position = "absolute"; this.oBtnR.style.top = (parseFloat(this.height) / 2 - 15) + "px"; this.oBtnR.style.right = "30px"; this.oBtnR.style.border = "10px solid red"; this.oBtnR.style.borderLeft = "none"; this.oBtnR.style.borderBottom = "none"; this.oBtnR.style.opacity = "0.3"; this.oBtnR.style.filter = "alpha(opacity=30)"; this.oBtnR.style.display = "none"; this.oBtnR.style.transform = "rotate(45deg)"; this.oBtnR.onclick = function () { if (that.step >= that.aDiv.length - 1) { that.step = 0; that.css(that.oBoxInner, 'left', 0) } that.step++; that.animate(that.oBoxInner, {left: -that.step * parseFloat(that.width)}, 1000); that.bannerTip(); }; /*以下是其它*/ this.step = 0;//记录每次运动 this.timer = null;//定时器 this.init();//初始化轮播图}Banner.prototype = {//类的原型 constructor: Banner, /*getCss:获取元素的属性值*/ getCss: function (curEle, attr) { var val = null; var reg = null; if (getComputedStyle) {//标准浏览器 val = getComputedStyle(curEle, false)[attr]; } else {//非标准浏览器 if (attr === 'opacity') { val = curEle.currentStyle.filter; //'alpha(opacity=10)' reg = /^alpha\(opacity[=:](\d+)\)$/i; return reg.test(val) ? reg.exec(val)[1] / 100 : 1; } val = curEle.currentStyle[attr]; } reg = /^[+-]?((\d|([1-9]\d+))(\.\d+)?)(px|pt|rem|em)$/i; return reg.test(val) ? parseInt(val) : val; }, /*setCss:设置元素的属性值*/ setCss: function (curEle, attr, value) { if (attr === 'float') { curEle.style.cssFloat = value; curEle.style.styleFloat = value; return; } if (attr === 'opacity') { curEle.style.opacity = value; curEle.style.filter = 'alpha(opacity=' + (value * 100) + ')'; return; } var reg = /^(width|height|top|right|bottom|left|((margin|padding)(top|right|bottom|left)?))$/i; if (reg.test(attr)) { if (!(value === 'auto' || value.toString().indexOf('%') !== -1)) { value = parseFloat(value) + 'px'; } } curEle.style[attr] = value; }, /*setGroupCss:设置元素的一组属性值*/ setGroupCss: function (curEle, options) { if (options.toString() !== '[object Object]') return; for (var attr in options) { this.setCss(curEle, attr, options[attr]); } }, /*css:getCss、setCss、setGroupCss的合写*/ css: function () { if (typeof arguments[1] === 'string') { if (typeof arguments[2] === 'undefined') { return this.getCss(arguments[0], arguments[1]);//当第三个参数不存在,是获取; } else { this.setCss(arguments[0], arguments[1], arguments[2]);//当第三个参数存在时,是设置; } } if (arguments[1].toString() === '[object Object]') { this.setGroupCss(arguments[0], arguments[1]);//设置元素的一组属性值 } }, /*animate:轮播图动画函数*/ animate: function (curEle, target, duration) { /*1.定义动画的运行轨迹*/ function tmpEffect(t, b, c, d) { return b + c / d * t;//开始时的位置+总变化/总时间*已经过去的时间 } /*2.为公式的每个参数做准备*/ var begin = {}; var change = {}; for (var attr in target) { begin[attr] = this.css(curEle, attr); change[attr] = target[attr] - begin[attr]; } duration = duration || 700; var time = 0; var that = this; /*3.开启一个定时器,让时间不断累加;根据时间和公式,求出最新的位置;*/ clearInterval(curEle.timer); //开起一个定时器前,先关闭没用的定时器 curEle.timer = setInterval(function () { time += 10; /*4.定时器停止运动的条件(time>=duration)*/ if (time >= duration) { that.css(curEle, target); clearInterval(curEle.timer); return; } /*5.拿到每个属性的最新值,并且赋值给元素对应的属性;*/ for (var attr in target) { var curPos = tmpEffect(time, begin[attr], change[attr], duration); that.css(curEle, attr, curPos); } }, 10) }, /*初始化轮播图*/ init: function () { var _this = this; /*1.开启自动轮播*/ this.timer = setInterval(function () { _this.autoMove(); }, 2000); /*2.开启焦点,每个焦点与每张轮播图对应*/ this.bannerTip(); /*3.鼠标移入轮播区,轮播暂停;鼠标移出轮播区,轮播恢复*/ this.over_out(); /*4.点击焦点,响应对应的轮播图片*/ this.handleChange(); }, handleChange: function () { for (var i = 0; i < this.aLi.length; i++) { this.aLi[i].index = i; var that = this; this.aLi[i].onclick = function () { that.step = this.index; that.animate(that.oBoxInner, {left: -that.step * parseFloat(that.width)}); that.bannerTip(); } } }, autoMove: function () { if (this.step >= this.aDiv.length - 1) { this.step = 0; this.css(this.oBoxInner, 'left', 0) } this.step++; this.animate(this.oBoxInner, {left: -this.step * parseFloat(this.width)}, 1000); this.bannerTip(); }, bannerTip: function () { var tmpStep = this.step >= this.aLi.length ? 0 : this.step; for (var i = 0; i < this.aLi.length; i++) { this.aLi[i].className = i === tmpStep ? 'on' : null; if (this.aLi[i].className === "on") { this.aLi[i].style.background = "red"; } else { this.aLi[i].style.background = "green"; } } }, over_out: function () { var _this = this; _this.oBox.onmouseover = function () { clearInterval(_this.timer); _this.oBtnL.style.display = 'block'; _this.oBtnR.style.display = 'block'; }; _this.oBox.onmouseout = function () { _this.timer = setInterval(function () { _this.autoMove() }, 2000); _this.oBtnL.style.display = 'none'; _this.oBtnR.style.display = 'none'; } }};以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

文本框只能输入数字的实现方法(兼容IE火狐)<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>无标题文档</title><script language="javascript" type="text/javascript"> //注意:火狐使用event时, function inputNum(evt){ //火狐使用evt.which获取键盘按键值,IE使用window.event.keyCode获取键盘按键值 var ev = evt.which?evt.which:window.event.keyCode; if(ev>=48&&ev<=57){ return true; }else{ return false; } } </script> </head><body> <input type="text" onKeyPress="return inputNum(event);" > </body></html>以上就是小编为大家带来的文本框只能输入数字的实现方法(兼容IE火狐)全部内容了,

接触jquery也有一段时间了,今天刚好利用轮播图来练练手。博文的前面会介绍一个简单用jquery做轮播图的例子,中间会插入一些关于轮播图更多的思考,在后面会用Javascript的方法来写一个轮播图,最后则是关于jquery和Javascript的比较。jquery做轮播图的例子:html部分代码:<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>轮播图</title> <link rel="stylesheet" type="text/css" href="demo.css"/> <script src="../jquery/jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script> <script src="demo.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="igs"> <a class="ig" href="#"><img src="images/1.jpg"/></a> <a class="ig" href="#"><img src="images/2.jpg"/></a> <a class="ig" href="#"><img src="images/3.jpg"/></a> <a class="ig" href="#"><img src="images/4.jpg"/></a> <a class="ig" href="#"><img src="images/5.jpg"/></a> <div class="btn btn1"><</div> <div class="btn btn2">></div> <ul id="tabs"> <li class="tab">1</li> <li class="tab">2</li> <li class="tab">3</li> <li class="tab">4</li> <li class="tab">5</li> </ul> </div> </body></html>css部分代码:* { margin: 0; padding: 0;}#igs { margin: 10px auto; width: 700px; height: 320px; position: relative;}.ig { position: absolute;}#tabs { position: absolute; list-style: none; background-color: rgba(255,255,255,.5); left: 300px; bottom: 10px; border-radius: 10px; padding: 5px 0 5px 5px;}.tab{ float: left; text-align: center; line-height: 20px; width: 20px; height: 20px; cursor: pointer; overflow: hidden; margin-right: 4px; border-radius: 100%; background-color: rgb(200,100,150);}.btn{ position: absolute; color: #fff; top: 110px; width: 40px; height: 100px; background-color: rgba(255,255,255,.3); font-size: 40px; font-weight: bold; text-align: center; line-height: 100px; border-radius: 5px; margin: 0 5px;}.btn2{ position: absolute; right: 0px;}.btn:hover{ background-color: rgba(0,0,0,.7);}js部分代码://定义全局变量和定时器var i = 0 ;var timer;$(document).ready(function(){ //用jquery方法设置第一张图片显示,其余隐藏 $('.ig').eq(0).show().siblings('.ig').hide(); //调用showTime()函数(轮播函数) showTime(); //当鼠标经过下面的数字时,触发两个事件(鼠标悬停和鼠标离开) $('.tab').hover(function(){ //获取当前i的值,并显示,同时还要清除定时器 i = $(this).index(); Show(); clearInterval(timer); },function(){ // showTime(); }); //鼠标点击左侧的箭头 $('.btn1').click(function(){ clearInterval(timer); if(i == 0){ i = 5;//注意此时i的值 } i--; Show(); showTime(); }); //鼠标点击右侧的箭头 $('.btn2').click(function(){ clearInterval(timer); if(i == 4){ i = -1;//注意此时i的值 } i++; Show(); showTime(); }); });//创建一个showTime函数function showTime(){ //定时器 timer = setInterval(function(){ //调用一个Show()函数 Show(); i++; //当图片是最后一张的后面时,设置图片为第一张 if(i==5){ i=0; } },2000);}//创建一个Show函数function Show(){ //在这里可以用其他jquery的动画 $('.ig').eq(i).fadeIn(300).siblings('.ig').fadeOut(300); //给.tab创建一个新的Class为其添加一个新的样式,并且要在css代码中设置该样式 $('.tab').eq(i).addClass('bg').siblings('.tab').removeClass('bg'); /* * css中添加的代码: * .bg{ background-color: #f00; } * */}完成效果图:关于jquery做轮播图更多的思考思考一:在第七行代码中用jquery方法设置第一张图片显示,其余隐藏,我们还有没有其他方法可以实现?思路:通过jquery的筛选器来实现代码示例:$("#igs a:not(:first-child)").hide(); 扩展:这样来看的话,在a标签中的class我们都可以省略,于此同时我们对于jquery选择器的了解要更深入。思考二:在第64行代码中,我们创建了一个Show函数,在这里我们只能看到简单的效果,我们能不能将我们的动画效果做的更炫?思路:用jquery中的自定义动画,为其设置多个动画效果代码示例://代码提示:可以用fadeIn()、fadeOut()、fadeTo()、animate()等,具体实现方法请查阅相关资料 思考三:如果我们在原来的基础上在增加一张或多张图片,我们又要修改我们的代码了,我们可不可以将该段代码适用到更多的轮播图中?思路:我们在前面设置一个计数器count,通过DOM的方法获取到图片的数量代码示例:var count;$(document).ready(function(){ count= $(".main a").length; /*给动态变化的i备用*/; //。。。代码省略 //鼠标点击左侧的箭头 $('.btn1').click(function(){ clearInterval(timer); if(i == 0){ i = count;//注意此时i的值 } i--; Show(); showTime(); }); //鼠标点击右侧的箭头 $('.btn2').click(function(){ clearInterval(timer); //console.log(count-1); if(i == count-1){ i = -1;//注意此时i的值 } i++; Show(); showTime(); }); });用原生Javascript方法写一个简单的轮播图 html部分代码:<div id="container"> <div id="list" style="left: -600px;"> <img src="img/5.jpg" alt="1"/> <img src="img/1.jpg" alt="1"/> <img src="img/2.jpg" alt="2"/> <img src="img/3.jpg" alt="3"/> <img src="img/4.jpg" alt="4"/> <img src="img/5.jpg" alt="5"/> <img src="img/1.jpg" alt="5"/> </div> <div id="buttons"> <span index="1" class="on"></span> <span index="2"></span> <span index="3"></span> <span index="4"></span> <span index="5"></span> </div> <a href="javascript:;" id="prev" class="arrow"><</a> <a href="javascript:;" id="next" class="arrow">></a></div>js部分代码: <script type="text/javascript"> /* 知识点: */ /* this用法 */ /* DOM事件 */ /* 定时器 */ window.onload = function () { var container = document.getElementById('container'); var list = document.getElementById('list'); var buttons = document.getElementById('buttons').getElementsByTagName('span'); var prev = document.getElementById('prev'); var next = document.getElementById('next'); var index = 1; var timer; function animate(offset) { //获取的是style.left,是相对左边获取距离,所以第一张图后style.left都为负值, //且style.left获取的是字符串,需要用parseInt()取整转化为数字。 var newLeft = parseInt(list.style.left) + offset; list.style.left = newLeft + 'px'; //无限滚动判断 if (newLeft > -600) { list.style.left = -3000 + 'px'; } if (newLeft < -3000) { list.style.left = -600 + 'px'; } } function play() { //重复执行的定时器 timer = setInterval(function () { next.onclick(); }, 2000) } function stop() { clearInterval(timer); } function buttonsShow() { //将之前的小圆点的样式清除 for (var i = 0; i < buttons.length; i++) { if (buttons[i].className == "on") { buttons[i].className = ""; } } //数组从0开始,故index需要-1 buttons[index - 1].className = "on"; } prev.onclick = function () { index -= 1; if (index < 1) { index = 5 } buttonsShow(); animate(600); }; next.onclick = function () { //由于上边定时器的作用,index会一直递增下去,我们只有5个小圆点,所以需要做出判断 index += 1; if (index > 5) { index = 1 } animate(-600); buttonsShow(); }; for (var i = 0; i < buttons.length; i++) { (function (i) { buttons[i].onclick = function () { /* 这里获得鼠标移动到小圆点的位置,用this把index绑定到对象buttons[i]上,去谷歌this的用法 */ /* 由于这里的index是自定义属性,需要用到getAttribute()这个DOM2级方法,去获取自定义index的属性*/ var clickIndex = parseInt(this.getAttribute('index')); var offset = 600 * (index - clickIndex); //这个index是当前图片停留时的index animate(offset); index = clickIndex; //存放鼠标点击后的位置,用于小圆点的正常显示 buttonsShow(); } })(i) } container.onmouseover = stop; container.onmouseout = play; play(); } </script>更多关于Javascript动画的知识请参考:Javascript动画效果一Javascript动画效果二Javascript动画效果三Javascript动画效果四jquery和Javascript方法的比较 经过比较,我们不难看出,jquery方法比我们的Javascript方法写的代码要少得多。事实上,直接用Javascript省略了好多问题,比如说兼容性的问题(该示例没有做测试,只是用来做比较);还有,如果当class的值有两个,中间用空格隔开,那么我们用DOM该如何操作(思路:用正则表达式和数组的相关方法),这样我们的代码量会更多;如果我们想要更改动画效果,我们需要修改的地方也很多,而从前面的介绍,我们知道,想要修改动画效果直接修改调用的动画函数就行了……后面的话:这篇博文记录自己思维多一点,其中很多方法的具体实现效果都还没写。现在边学习jquery边复习前面学过的Javascript,越来越觉得Javascript强大了(其实是自己弱爆了),好多东西都值得去深究,越来越觉得这个东西有意思了。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 5060网址大全 网站地图

联系我们

827570882

扫描二维码分享到微信