性能,还是性能!

2009-05-28 21:17:42

很简单的一个应用,实现方式当然也是多种多样,最直接的,通过<img>的src属性,但我想这是最废材的方法了,这样一个效果,你至少需要两张图片,然后是更多的DOM操作,你还要面对图片下载延迟的问题。还有啥性能(12)可言?

于是我写了以下的实现方式(DEMO):

function star(id){
	var star = $(id);
	var stars = $(id).getElementsByTagName("li");
	for(var i=0; i<stars.length; i++){
		stars[i].starNum = i+1;
		stars[i].onmouseover = function(){
			star.star = this.starNum;
			star.style.backgroundPosition = 'left '+(-parseInt(this.starNum)*30)+'px';
		}
		stars[i].onclick = function(){
			alert(star.star);
		}
	}
	star.onmouseout = function(){
		star.star = 0;
		this.style.backgroundPosition = 'left top';
	}
}
function $(id){return document.getElementById(id);}

当然要依据特定的DOM,这种方式通过改变背景图片的位置来实现,看起来似乎已经很完美了,可惜这只是较之于src的实现方法而言。

再看一个TZ的改进的版本(DEMO):

    function $(element){
      return document.getElementById(element) ;
    }
    var obj = $('outter').getElementsByTagName("li") ;
    for (var i=0,k;k=obj[i];i++ ) {
      k.no = i ;
      k.onmouseover = function () {
        for (var i=0;i<=this.no;i++ ) {
          obj[i].style.backgroundPosition = 'left -30px' ;
        }
      }
      k.onmouseout = function () {
        for (var i=0;i<=this.no;i++ ) {
          obj[i].style.backgroundPosition = 'left top' ;
        }
      }
    }

很显然,这个写法比我的又更优化了一些。虽然都是通过改变背景图片的坐标来实现,但是,我使用了一个30K的jpg图片,TZ使用的却是一个只有599B的gif图片,但即使不使用gif,他的图片也会比我的小很多,大概是15倍左右~···,因为具体的实现方式决定了。虽然他的方法增加了更多的DOM操作,但是最大限度地优化网络传输方面的性能,总体性能是最佳的!

只有一个感概:只要有可能,就要最大限度的减少页面下载量,就要最大限度的提升代码性能!

相关日志

« [上一篇]
[下一篇] »

5 Comments to “性能,还是性能!”

  1. 佐, Says:

    对星级评分,设计出来的版式可能会出现好几种。制作时变化会比较多。
    最近工作需要刚好碰到这个,我就把效果摘出来。是通过CSS实现hove的效果。然后这个效果是考虑游客是行评论,所以是以记录cookie来表现。。当然登录过后的用户对cookie会进行限制不使用。
    我觉得如果有些星级设计可以用CSS做的话。就不需要用DOM可能会更佳些。
    http://byzuo.com/demo/mousebox/rating/

  2. 游山玩水 Says:

    如果那么注意图片大小,那为什么不做一个横向十颗星的图片呢,那样应该会更小吧.

  3. omiga Says:

    @游山玩水: 恩,非常好的办法~···

  4. colinivy Says:

    嗯 能不用Js的尽量不用css
    佐给的做法不错

  5. colinivy Says:

    sun 说错了“能不用Js的尽量不用Js”

Leave a Reply

[Ctrl+Enter]