DOM有关问题求助。

Z.Chen 2020-03-02 04:48:22
题目:制作一个小游戏,从Api取数,导进HTML里,如图:


点击任意灰色格子,可以使之变成白色或蓝色。改变所有灰色格子,但是不能有三个蓝色或白色格子在一行或一列,即为成功。(本题没那么复杂不用写逻辑,正确答案是唯一的,json已经给出了)

我写的代码中第8行所取的json数据如下:
{
rows: [
[
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: false,
currentState: 1,
correctState: 1
},
{
canToggle: false,
currentState: 1,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
}
],
[
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: false,
currentState: 1,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
}
],
[
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
}
],
[
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: false,
currentState: 2,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: false,
currentState: 2,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
}
],
[
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: false,
currentState: 1,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
}
],
[
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: false,
currentState: 2,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 2
},
{
canToggle: true,
currentState: 0,
correctState: 1
},
{
canToggle: true,
currentState: 0,
correctState: 2
}
]
]
}


我写的代码如下:
(function() 
{
window.onload = function()
{
var theGameDiv = document.getElementById('theGame');
var newHtml = "";

fetch('https://www.****.com/3inarow/sample.json')
.then(function(response)
{
return response.json();
})
.then(function(json)
{
for(var i=0; i<json.rows.length; i++)
{
newHtml += "<tr>";
for(var j=0; j<json.rows[i].length; j++)
{
if(json.rows[i][j].currentState === 0)
{
newHtml += `<td class="eachTD" id="rnc${i}${j}" style="background-color:#95918C"></td>`
}
else if(json.rows[i][j].currentState === 1)
{
newHtml += `<td class="eachTD" id="rnc${i}${j}" style="background-color:#1A4876"></td>`
}
else if(json.rows[i][j].currentState === 2)
{
newHtml += `<td class="eachTD" id="rnc${i}${j}" style="background-color:#FFFFFF"></td>`
}
}
newHtml += "</tr>";
}
var fullNewHtml = "<table>"+newHtml+"</table>"
+`<button type="button">Check</button>` + "<br>" + "<br>"
+`<label><input type="checkbox" name="show">Show correct squares</label>`;
theGameDiv.innerHTML = fullNewHtml;

for(var m=0;m<json.rows.length; m++)
{
for(var n=0; n<json.rows[m].length; n++)
{
var element = document.getElementById(`rnc${m}${n}`);
if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===0)
{
element.addEventListener("click", function(e){
json.rows[m][n].currentState === 1;
});
}
else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===1)
{
element.addEventListener("click", function(e){
console.log("bbbb");
});
}
else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===2)
{
element.addEventListener("click", function(e){
console.log("cccc");
});
}
}
}
})
};
})();


我的思路是(45行开始):对每一个格子getElementById,然后addEventListener,当我点击currentState ===0的格子时,把currentState 的值变为1;当我点击currentState ===1的格子时,把currentState 的值变为2;当我点击currentState ===2的格子时,把currentState 的值变为0;

问题来了:
这样做的时候报错了(错在48行),显示“Uncaught TypeError: Cannot read property '6' of undefined
at HTMLTableCellElement.<anonymous> (game.js:48)”

其中“6”是6行6列的意思吧我想。不知道property '6' 在哪里,也不知道错在什么地方。
求高人指点一二。
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Z.Chen 2020-03-02
  • 打赏
  • 举报
回复
引用 4 楼 天际的海浪 的回复:
在事件中使用外面的循环变量需要用闭包保存循环变量当时的值

            for(var m=0;m<json.rows.length; m++)
            {
                for(var n=0; n<json.rows[m].length; n++)
                {
                    (function(m,n) {
                        var element = document.getElementById(`rnc${m}${n}`);
                        element.addEventListener("click", function(e){
                            if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===0)
                            {
                                json.rows[m][n].currentState = 1;
                                element.style.backgroundColor = "#1A4876";
                            }
                            else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===1)
                            {
                                console.log("bbbb");
                            }
                            else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===2)
                            {
                                console.log("cccc");
                            }
                        });
                    })(m,n);
                }
            } 
感谢大神!!
Z.Chen 2020-03-02
  • 打赏
  • 举报
回复
怎么改不了。。。。48行应该是只有一个等号“=”
Z.Chen 2020-03-02
  • 打赏
  • 举报
回复
引用 1 楼 console.log( ) 的回复:
你48行不应该是赋值的吗,为啥用===? 还是我没看懂
感谢回复。打错了,已改正。 但是结果还是一样的,报错。
console.log( ) 2020-03-02
  • 打赏
  • 举报
回复
你48行不应该是赋值的吗,为啥用===? 还是我没看懂
天际的海浪 2020-03-02
  • 打赏
  • 举报
回复
在事件中使用外面的循环变量需要用闭包保存循环变量当时的值

            for(var m=0;m<json.rows.length; m++)
            {
                for(var n=0; n<json.rows[m].length; n++)
                {
                    (function(m,n) {
                        var element = document.getElementById(`rnc${m}${n}`);
                        element.addEventListener("click", function(e){
                            if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===0)
                            {
                                json.rows[m][n].currentState = 1;
                                element.style.backgroundColor = "#1A4876";
                            }
                            else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===1)
                            {
                                console.log("bbbb");
                            }
                            else if(json.rows[m][n].canToggle === true && json.rows[m][n].currentState ===2)
                            {
                                console.log("cccc");
                            }
                        });
                    })(m,n);
                }
            } 
前端性能优化实践# 知识体系与小册格局 ## 写给读者 提起性能优化,大家现在脑海里第一时间会映射出什么内容呢? 可能是类似[“雅虎军规”](https://developer.yahoo.com/performance/rules.html?guccounter=1)和[《高性能 JavaScript》](https://book.douban.com/subject/5362856/)这样历久弥香的经典之作,也可能是搜索引擎聚合给你的一篇又一篇以性能优化为主题的个人或团队实践而来的“私货”。至少当我确定自己的研发方向、并接到第一个性能优化任务时,我做的第一件事是向搜索引擎求助,第二件事是买书,然后开始了摸着石头过河,前后花费了大量的时间和精力。我深感性能优化实在是前端知识树中特别的一环——当你需要学习前端框架时,文档和源码几乎可以告诉你所有问题的答案,当你需要学习 Git 时,你也可以找到放之四海皆准的实践方案。但性能优化却不一样,它好像只能是一个摸索的过程。 这个摸索的过程是痛苦的、漫长的,也是紧要的。因为在如今的互联网环境下,一个前端团队如果只把性能优化这个任务写在纸上,而不投入实践,它将缺失最基本的竞争力。 笔者写这本小册,是希望通过短短十数个章节的讲解,尽可能降低一些大家学习性能优化的成本。 一方面,这本小册为没有接触过性能优化的新同学建立起一个正确的前端性能优化的“世界观”,知道性能优化是什么、为什么、怎么做,从而使性能优化这件事情有迹可循,有路可走。这样在面试现场被问到性能优化层面的问题时,能够做到滔滔不绝、言之有物,而非像背书一样罗列干巴巴的知识点,最终淹没在茫茫的求职大军中。另一方面,小册可以为在职的工程师们提供一线团队已经实践过的“方法论”,知道什么场景下该做什么事情,最终在脑海中留下一张涵盖核心原理和实践的、可随时查阅并且高度可扩展的性能优化思路索引表。然后在今后的开发生活中可以去践行它,更进一步去挖掘它。把性能优化变作你前端工程师生涯的一门必修课,进而演化为自己研发方面的核心竞争力。 同时,相信大家可以明确这样一个学习观念:任何技术的掌握,都离不开一定比例的理论基础和实际操作的支撑。 具体到前端性能优化这件事情上,我认为它是 20% 的理论,加上至少 80% 的实践,甚至很多理论本身也都是我们在具体的业务场景中实践出来的。所以希望大家阅读本小册时,能够读到一些“书本之外的东西”——最好是一边读一边回忆自己既有的开发经历,尝试去留意哪些知识是已知的,哪些是未知的。 这样读完之后,就可以有的放矢地把这些知识转换为自己的项目实践——前端技术日新月异,性能方案永远都在更迭,所以一定要形成自己的学习思路。 建议每一位读者都带着“学了就要用”的心态去读这本小册。如果阅读结束,能够为你带来哪怕一个小小的开发习惯或者优化观念上的改变,这数小时的阅读时间就算没有白费。 ## 知识体系: 从一道面试题说起 在展开性能优化的话题之前,我想先抛出一个老生常谈的面试问题: > 从输入 URL 到页面加载完成,发生了什么? 这个问题非常重要,因为我们后续的内容都将以这个问题的答案为骨架展开。我希望正在阅读这本小册的各位可以在心里琢磨一下这个问题——无须你调动太多计算机的专业知识,只需要你用最快的速度在脑海中架构起这个抽象的过程——我们接下来所有的工作,就是围绕这个过程来做文章。 我们现在站在性能优化的角度,一起简单地复习一遍这个经典的过程:首先我们需要通过 DNS(域名解析系统)将 URL 解析为对应的 IP 地址,然后与这个 IP 地址确定的那台服务器建立起 TCP 网络连接,随后我们向服务端抛出我们的 HTTP 请求,服务端处理完我们的请求之后,把目标数据放在 HTTP 响应里返回给客户端,拿到响应数据的浏览器就可以开始走一个渲染的流程。渲染完毕,页面便呈现给了用户,并时刻等待响应用户的操作(如下图所示)。 ![](https://user-gold-cdn.xitu.io/2018/10/18/16685737b823244c?w=489&h=329&f=png&s=19023) 我们将这个过程切分为如下的过程片段: 1. DNS 解析 2. TCP 连接 3. HTTP 请求抛出 4. 服务端处理请求,HTTP 响应返回 5. 浏览器拿到响应数据,解析响应内容,把解析的结果展示给用户 大家谨记,我们任何一个用户端的产品,都需要把这 5 个过程滴水不漏地考虑到自己的性能优化方案内、反复权衡,从而打磨出用户满意的速度。 ## 从原理到实践:各个击破 我们接下来要做的事情,就是针对这五个过程进行分解,各个提问,各个击破。 具体来说,DNS 解析花时间,能不能尽量减少解析次数
weixin138社区互助养老+ssm是一个基于Spring、SpringMVC和MyBatis(简称SSM)框架的社区互助养老服务平台。该平台主要针对老年人群体,提供了一个便捷、高效的互助养老服务。通过该平台,老年人可以发布求助信息,寻求志愿者的帮助;同时,志愿者也可以在平台上找到需要帮助的老人,为他们提供力所能及的关爱和支持。 该平台采用了以下技术: Spring:一个轻量级的Java开发框架,用于实现项目的依赖注入、事务管理等功能。 SpringMVC:一个基于MVC设计模式的Web框架,用于处理HTTP请求,实现前后端分离。 MyBatis:一个持久层框架,用于实现数据库的增删改查操作,简化了SQL语句的编写。 MySQL:一个关系型数据库管理系统,用于存储平台的数据信息。 Redis:一个高性能的键值对数据库,用于缓存数据,提高系统的响应速度。 Bootstrap:一个前端框架,用于构建响应式布局,使平台在不同设备上都能正常显示。 jQuery:一个JavaScript库,用于简化DOM操作,提高前端开发效率。 该平台具有以下功能: 用户注册与登录:用户可以在平台上注册账号,并通过账号密码登录。 发布求助信息:用户可以发布自己的求助信息,包括标题、内容、图片等。 浏览求助信息:用户可以查看其他用户发布的求助信息,了解他们的需求。 志愿者报名:志愿者可以报名参与帮助老人,填写自己的联系方式等信息。 评价与反馈:用户可以对志愿者的服务进行评价,同时也可以向平台提供反馈意见。 个人信息管理:用户可以修改自己的个人信息,如头像、昵称等。 系统管理:管理员可以对用户、求助信息等进行管理,维护平台的正常运行。 总之,weixin138社区互助养老+ssm是一个基于SSM框架的社区互助养老服务平台,采用了多种技术实现,为老年人提供了一个便捷、高效的互助养老服务。

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧