June 23, 2008 - by Macji - HTML/CSS/JS/PHP - microformats
June 1, 2008 - by Macji - HTML/CSS/JS/PHP - javascript
有这么一个需求: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);
}
})();