发表于: 2018-07-10 16:54:52

1 592


#今天完成的事

完成了js1

#明天计划的事

开始js2-4

#遇到的问题

因为昨天实现的九宫格,出现了很多问题,比如有时候显示两种颜色,有时候显示一种颜色,改来改去到后面有时候干脆不闪动了。所以全部删除了重写,通过在网上查各种资料,终于是没有bug的实现了。虽然网上查的的资料有些还不是很懂,就只是拿来用而已。


先说一下昨天后来改来改去都没改对的问题,说到底都是对知识不熟悉,很痛苦心里有想法却写不出的感觉。还是要多学多练,熟悉各种函数,语句,变量,数组的用法。昨天的问题是逻辑说不通。按照昨天的想法:

  1. function begin() {
  2.    var one = Math.floor(Math.random()*list.length);
  3.    var two = Math.floor(Math.random()*list.length);
  4.    var three = Math.floor(Math.random()*list.length);
  5.    if(one==two){
  6.        one = Math.floor(Math.random()*list.length);
  7.    }else if(two==three) {
  8.        two = Math.floor(Math.random()*list.length);
  9.    }else if(one==three)  {
  10.        three = Math.floor(Math.random()*list.length);
  11.    }

假如one=two,one重新随机一个块,这里就是问题所在了,one的再次随机完全有可能再次随机到那个和two一样的块,所以要改变逻辑,再次随机要随机到除去one以外的其他块。后来想着想着,这么写似乎是多余的,因为本来就随机了三个块,只是有可能这三个块会随机到一个,但是这么写也有可能随机到一个,所以等于白写。后来又换了一种想法,虽然也是错误的,但还是说一下吧,既然上面觉得是多余的,所以干脆把上面都删了,我后面的想法是

  1. function begin() {
  2.    var one = Math.floor(Math.random()*list.length);
  3.    var two = Math.floor(Math.random()*list.length);
  4.    var three = Math.floor(Math.random()*list.length);
  5.    if(one!==two&&two!==three&&one!==three){
  6.        list[one].style.background = randomColor();
  7.        list[two].style.background = randomColor();
  8.        list[three].style.background = randomColor();
  9.        console.log("abc:" + one + two + three);
  10.    }
  11. }
  12.    function randomColor() {
  13.    return '#'+(Math.random()*0xffffff<<0).toString(16);
  14. }

如果1不等于2,且2不等于3,且1不等于3就赋予三个块一个随机背景色,后来一想这样的逻辑更加是不对的,因为一旦他们有两个相等了就干脆不执行了,问题更多,按照这种写法我觉得自己是想不出来了,干脆全部删除,重新写。


现在就告别昨天的过去,把今天正确实现的思路再捋一遍。

首先第一步是获取html中的元素

  1. var list = document.getElementsByClassName('box');

第二步给两个按钮添加一个点击事件

  1. <button id="run" onclick="start_flash()">
  2.        开始闪
  3. </button>
  4. <button id="stop" onclick="end_flash()">
  5.        停止闪
  6. </button>

第三步,定义一个索引数组,这个数组里有九个值,对应九宫格

  1. var ArrList = [0,1,2,3,4,5,6,7,8,];

第四步,比较关键的一步,获取不同的随机块!昨天不懂的就是这里,今天换了种方法

  1. //从一个给定的数组arr中随机返回num个不重复项
  2. function getArrayItems(arr,num) {
  3.    //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组
  4.    var temp_array = new Array();
  5.    for(var index in arr) {
  6.    temp_array.push(arr[index]);
  7.    }
  8. //取出的数值项,保存在此数组
  9. var return_array = new Array();
  10. for(var i = 0;i<num;i++) {
  11.    //判断数组还有可以取出的元素,以防下标越界
  12.    if(temp_array.length>0) {
  13.    //在数组中产生一个随机索引
  14.    var arrIndex = Math.floor(Math.random()*temp_array.length);
  15.    //将此随机索引的对应的数组元素值复制出来
  16.    return_array[i] = temp_array[arrIndex];
  17.    //然后删掉此索引的数组元素,这时候temp_array变为新的数组
  18.    temp_array.splice(arrIndex,1);
  19.    }else{
  20.    //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项.
  21.    break;
  22.    }
  23. }
  24.    return return_array;
  25. }

这一段代码是在百度搜索“js在指定数组中随机取出不同的数据”得到的,在任务中就是获取不同的随机块,用法是这么用的,自己进行了理解,但是理解的还不够透彻。 
第五步,定义生成随机颜色的函数,这是在网上找的,方法有很多。

  1. function randomColor() {
  2.    //随机颜色
  3. return '#'+('00000'+ (Math.random()*0x1000000<<0).toString(16)).substr(-6);
  4. }

第六步,使用setInterval()方法实现一个无限循环的函数,setInterval(changeColor, 1000),changeColor是选块变色函数,1000代表1000毫秒,每1000毫秒执行一次changeColor函数。

  1. var start;//定义延时变量
  2. function start_flash() {
  3.    //延时函数,开始闪动
  4.    window.clearInterval(start);//先清除延时,防止速度累加
  5.    start = setInterval(changeColor,1000);
  6. }

第七步,清除延时,停止时重置颜色,使用for循环遍历取得的NodeList中所有内容,并修改相应颜色

  1. unction end_flash() {
  2.    //停止闪动(使用延时变量清除延时)
  3.    window.clearInterval(start);
  4.    for(var i = 0;i<ArrList.length;i++) {
  5.    ist[i].style.backgroundColor = "orange";
  6.    }
  7. }

最后贴个效果 


返回列表 返回列表
评论

    分享到