有这么一个需求:CMS在页面一容器内输出50个a标签(该容器为display:none),要我随机从这容器取出10个a,放到另一容器内。
本能反应:建立一个随机数组,然后clone节点,放到另一容器去。但这样会把重复的a节点放进去。
随机数不重复,那就得用生成一个随机数,放到数组去,再生成一个和之前的数组一个一个比过去,如果重复就重新生成。我的最初想法。
(function(){
var obj = $("hotClick");//容器,里面有个隐藏的p,他里面有50个a
var links = obj.getElementsByTagName("a"), r = [], temp;
var randomNum = function(n, p){
var p = p || -1, newNum = Math.floor(Math.random() * (n + 1));
for(var i = 0; i < r.length; i++){
if(r[i] == newNum)
return randomNum(n, newNum);
}
return newNum;
}
}
for (var i = 0; i < 10; i++){
r.push(randomNum(50));
temp = links[r[i]].cloneNode(true);
obj.appendChild(temp);
};
})();
虽然这样可行,但效率比较差劲,于是google了一下,看到无忧脚本的一个帖子。于是我想到了,先生成0到50的数组,然后对数组随机排序,最后取输出的0到10拿出来用。太帅了。我对帖子上的方法简单的修改。
(function(){
Array.prototype.riffle = function(){
this.sort(function(){
return Math.random() > 0.5 ? -1 : 1;
});
}
var obj = $("hotClick");
var links = obj.getElementsByTagName("a"), r = [], temp;
for(var i = 0; i <= 50; i++)r[i] = i;
r.riffle();
for (i = 0; i < 10; i++){
temp = links[r[i]].cloneNode(true);
obj.appendChild(temp);
}
})();
本博客所有文章遵循创作共用版权协议,要求署名、非商业、保持一致。转载时请先阅读以上许可协议,并以超链接形式注明出处。
这篇文章发表于2008年06月01日 09:48:36, 并被分类于HTML/CSS/JS/PHP. 您可以通过订阅 RSS 2.0 跟踪对这篇文章的评论, 也可以发表你的评论, 或者在您自己的网站中引用(trackback)该篇日志.
当前暂无评论