- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要有关 JavaScript 代码的帮助,这里是说明以及我目前所拥有的...
我需要使用 DOM 操作来让 Tic Tac Toe 游戏运行。以下是提供的说明:
确保当用户点击一个正方形时没有任何反应已经包含一个标记:
修改 squareClicked 函数,使其:
在 setBanner 函数中,检查是否已设置横幅并在设置新的之前删除旧的。
不寻找任何解决方案.. 只是关于如何让代码正常运行的指南。
// set the class name of the player who will start
document.getElementById('X').className = 'current-player';
document.getElementById('O').removeAttribute('class');
// this will run when the page loads
function init() {
var game = [[1,3,5,8],[4,6,7,2]];
// find the tbody element. It is there even though we did not put it in our HTML.
var tbody = document.querySelector('tbody');
// row is a single row element. We will step through the rows in the outer while loop.
var row = tbody.firstChild;
var td;
while(row) {
console.log(row.nodeName);
// td is a single td element. We will step through each td in this row in the inner while loop.
td = row.firstChild;
while(td) {
if(td.tagName === 'TD') {
console.log('Found a TD');
td.setAttribute('onclick', 'squareClicked(this);');
}
td = td.nextSibling;
}
row = row.nextSibling;
}
loadGame(game);
// Step 3: add a "Set Banner" button
var newGameButton = document.querySelector('#players input');
var setBannerButton = document.createElement('input');
setBannerButton.setAttribute('type', 'button');
setBannerButton.setAttribute('onclick', 'setBanner();');
setBannerButton.setAttribute('value', 'Set Banner');
newGameButton.parentNode.insertBefore(setBannerButton,newGameButton);
}
// reset the board when the "New Game" button is clicked
function newGame() {
// create a NodeList of all the td elements, again.
// We could make tdNodes a global variable so we don't have to recreate it.
// Here I use a different method.
var tdNodes = document.querySelectorAll('td');
var removeNode;
for(var i=0; i<tdNodes.length; i++) {
// clear the content of each node
//tdNodes[i].innerHTML = '';
// Step 2: instead of innerHTML, we will use DOM manipulation
removeNode = tdNodes[i].firstChild;
if(removeNode) {
removeNode.parentNode.removeChild(removeNode);
}
}
}
function squareClicked(sqr) {
// show an alert. As a bonus we show which square was clicked.
alert('You clicked square ' + sqr.id);
}
function loadGame(state) {
var tbody = document.querySelector('tbody');
// row is a single row element. We will step through the rows in the outer while loop.
var row = tbody.firstChild;
var td;
var newEl;
while(row) {
console.log(row.nodeName);
// td is a single td element. We will step through each td in this row in the inner while loop.
td = row.firstChild;
while(td) {
if(td.tagName === 'TD') {
console.log('Found a TD');
idNum = td.id;
idNum = idNum.replace('c', ''); // Remove the c at the beginning.
idNum = parseInt(idNum); // Convert it to a number.
// Check to see if it is in the X array, state[0]
if(state[0].indexOf(idNum) > -1){
//td.innerHTML = '<div class="X-marker"></div>';
// Step 1: instead of innerHTML, we will use DOM manipulation
newEl = document.createElement('DIV');
newEl.className = 'X-marker';
td.appendChild(newEl);
}
// Check to see if it is in the O array, state[1]
if(state[1].indexOf(idNum) > -1){
//td.innerHTML = '<div class="O-marker"></div>';
// Step 1 again
newEl = document.createElement('DIV');
newEl.className = 'O-marker';
td.appendChild(newEl);
}
}
td = td.nextSibling;
}
row = row.nextSibling;
}
}
// Step 4: setBanner function
// - Prompt the user to input a title for the game.
// - Create an h1 element to contain this input.
// - Securely (careful of HTML) insert the input into the h1 element and add it to
// the page immediately after the opening body tag.
function setBanner() {
var banner = prompt('Banner Text?');
var h1 = document.createElement('h1');
h1.textContent = banner;
//var body = document.querySelector('body');
var playerDiv = document.querySelector('#players');
//insertBefore (newNode, referenceNode)
document.body.insertBefore(h1, playerDiv);
}
<body onload="init();">
<div id="players">
<div id="X" class="">Player X</div>
<div id="O" class="">Player O</div>
<input type="button" class="button" value="New Game" onclick="newGame()"/>
</div>
<table>
<tr>
<td id="c0"></td>
<td id="c1"></td>
<td id="c2"></td>
</tr>
<tr>
<td id="c3"></td>
<td id="c4"></td>
<td id="c5"></td>
</tr>
<tr>
<td id="c6"></td>
<td id="c7"></td>
<td id="c8"></td>
</tr>
</table>
<script src="main.js"></script>
</body>
最佳答案
有我很久以前用js做的井字游戏的代码:)
window.onload = function() {
initXO();
}
function initXO() {
var tbl=document.getElementById('xo');
for(var i=0;i<3;i++) {
var row=tbl.insertRow();
for(var x=0;x<3;x++) {
var cell=row.insertCell();
cell.innerHTML='';
cell.setAttribute('onclick','xoCheck(this);');
}
}
}
function xoCheck(ele) {
if (document.getElementById('ovr').value=='0') {
var row=ele.parentNode;
var red=document.getElementById('red');
var br=(row.rowIndex*3)+(ele.cellIndex+1);
var pl;
if(ele.innerHTML=='' || ele.innerHTML==' ') {
if(red.value=='0') {
ele.innerHTML='X';
ele.style.color='red';
red.value='1';
pl=document.getElementById('pl1');
} else {
ele.innerHTML='O';
ele.style.color='blue';
red.value='0';
pl=document.getElementById('pl2');
}
pl.value+=br.toString()+',';
checkWinner();
}
}
}
function checkWinner() {
var pl1=document.getElementById('pl1').value.split(',');
var pl2=document.getElementById('pl2').value.split(',');
pl1.pop(); pl2.pop();
pl1=pl1.sort(function(a, b){return a-b});
pl2=pl2.sort(function(a, b){return a-b});
var arr=[];
arr.push('1,2,3');
arr.push('4,5,6');
arr.push('7,8,9');
arr.push('1,4,7');
arr.push('2,5,8');
arr.push('3,6,9');
arr.push('1,5,9');
arr.push('3,5,7');
//var res1=pl1.join();
//var res2=pl2.join();
for (var i=0;i<arr.length;i++) {
//for testing
var qq=arr[i].split(',');
var tot=0;
for (var x=0;x<pl1.length;x++) {
if(pl1[x]==qq[0]) {
tot+=1;
} else if(pl1[x]==qq[1]) {
tot+=1;
} else if(pl1[x]==qq[2]) {
tot+=1
}
if(tot==3) {
var rr=parseInt(document.getElementById('rezPl1').innerHTML)+1;
document.getElementById('rezPl1').innerHTML=rr.toString();
drawResult(arr[i]);
return;
}
}
tot=0;
for (var x=0;x<pl2.length;x++) {
if(pl2[x]==qq[0]) {
tot+=1;
} else if(pl2[x]==qq[1]) {
tot+=1;
} else if(pl2[x]==qq[2]) {
tot+=1
}
if(tot==3) {
var rr=parseInt(document.getElementById('rezPl2').innerHTML)+1;
document.getElementById('rezPl2').innerHTML=rr.toString();
drawResult(arr[i]);
return;
}
}
}
}
function drawResult(result) {
var pp=result.split(',');
document.getElementById('ovr').value='1';
var tbl=document.getElementById('xo');
for(var i=0;i<pp.length;i++) {
var x=parseInt(pp[i]);
if(x>=1 && x<=3) {
tbl.rows[0].cells[x-1].style.backgroundColor='yellow';
}
if(x>=4 && x<=6) {
tbl.rows[1].cells[x-4].style.backgroundColor='yellow';
}
if(x>=7 && x<=9) {
tbl.rows[2].cells[x-7].style.backgroundColor='yellow';
}
}
}
function clearRes() {
document.getElementById('pl1').value='';
document.getElementById('pl2').value='';
document.getElementById('ovr').value='0';
var tbl=document.getElementById('xo');
for (var i=0;i<3;i++) {
for(var x=0;x<3;x++) {
tbl.rows[i].cells[x].innerHTML='';
tbl.rows[i].cells[x].style.backgroundColor='transparent';
}
}
}
function startGame() {
document.getElementById('tdImeX').innerHTML=document.getElementById('txtX').value;
document.getElementById('tdImeO').innerHTML=document.getElementById('txtO').value;
document.getElementById('pl1').value='';
document.getElementById('pl2').value='';
document.getElementById('ovr').value='0';
document.getElementById('red').value='0';
document.getElementById('divLoad').style.display='none';
document.getElementById('divGame').style.display='block';
}
function endGame() {
document.getElementById('tdImeX').innerHTML='';
document.getElementById('txtX').value='';
document.getElementById('tdImeO').innerHTML='';
document.getElementById('txtO').value='';
document.getElementById('pl1').value='';
document.getElementById('pl2').value='';
document.getElementById('ovr').value='0';
document.getElementById('red').value='0';
document.getElementById('divLoad').style.display='block';
document.getElementById('divGame').style.display='none';
document.getElementById('txtX').focus();
}
body, html {margin: 0; padding: 0;}
body
{
font: normal 14px "Trebuchet MS";
color: black;
background-color: #f1f1f1;
}
.wrapper
{
display: block;
width: 250px;
border:solid 1px orange;
margin: 30px auto;
padding: 10px;
}
.inbox
{
width: 100%;
box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
}
#xo
{
display: block;
border:solid 1px gray;
width: 94px;
height: 94px;
box-shadow: 2px 2px 8px silver;
margin:0 auto;
}
#xo tr td
{
width: 30px;
height: 30px;
border-right: solid 1px gray;
border-bottom: solid 1px gray;
cursor: pointer;
text-align: center;
vertical-align: middle;
font-size: 18px;
font-weight: bold;
color: black;
}
#xo tr td:last-child
{
border-right:none;
}
#xo tr:last-child td:last-child
{
border-bottom: none;
}
#tblrez
{
margin: 30px 0px;
width: 100%;
box-sizing:border-box;
}
#tblrez td
{
text-align: center;
vertical-align: middle;
font-size: 18px;
border-bottom: solid 1px gray;
width: 50%;
}
#tblrez td:first-child {border-right: solid 1px gray;}
#rezPl1, #rezPl2
{
border-bottom: none !important;
font-size: 22px;
color: navy;
font-weight: bold;
}
#rezPl2
{
color: firebrick;
}
input[type="button"]
{
border:solid 1px navy;
background-color: lightblue;
color: black;
padding: 4px;
cursor: pointer;
border-radius: 4px;
}
input[type="button"]:hover
{
background-color: firebrick;
color:white;
}
.box
{
display: none;
width: 100%;
height: auto;
padding: 10px;
box-sizing:border-box;
}
<input type="hidden" id="pl1" names="pl1" value="" />
<input type="hidden" id="pl2" name="pl2" value="" />
<input type="hidden" id="red" name="red" value="0">
<input type="hidden" id="ovr" name="ovr" value="0">
<div class="wrapper">
<div id="divLoad" style="display:block;" class="box">
<table cellspacing="0" cellspacing="0" class="inbox">
<tr>
<td style="color:firebrick;font-weight:bold;">X</td>
<td><input type="text" id="txtX" value="" placeholder="Player 1" autofocus />
</tr>
<tr>
<td style="color:navy;font-weight:bold;">O</td>
<td><input type="text" id="txtO" value="" placeholder="Player 2" />
</tr>
</table>
<br><br>
<input type="button" value="Start game" onclick="startGame();">
</div>
<div id="divGame" style="display:none;" class="box">
<table cellpadding="0" cellspacing="0" id="xo">
</table>
<table cellpadding="0" cellspacing="0" id="tblrez">
<tr>
<td id="tdImeX">X</td>
<td id="tdImeO">O</td>
</tr>
<tr>
<td id="rezPl1">0</td>
<td id="rezPl2">0</td>
</tr>
</table>
<input type="button" value="New game" onclick="clearRes();" />
<input type="button" value="End game" onclick="endGame();">
</div>
</div>
关于使用 DOM 的 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097319/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
Polymer的light DOM和local DOM有什么区别?来自文档(1): The DOM that an element creates and manages is called its
当内容添加到网页时,我需要触发一个 Action 。更新可能具有不同的性质(例如 AJAX、延迟脚本、用户操作)并且不受我的控制。 我想使用 DOM 突变事件,但它们并非在所有浏览器中都可用。是否有为
我刚遇到一个有趣的情况,我有一个提交 放置在 内的 native 自定义元素的 Shadow DOM 内. Select #shadow-root ...
假设有一个滚动列表,当我插入一些新的 DOM 附加到当前 dom 时,它工作正常。上拉 但是如果我之前插入一些新的 DOM,新的 DOM 将在视口(viewport)中,而旧的 DOM 将被下推。下拉
在我的项目中实现 Shadow DOM 是否会使它们像 React 使用的虚拟 DOM 一样更快? 最佳答案 它们是不同用途的不同事物,因此比较性能没有意义。 虚拟 DOM 虚拟 DOM 旨在避免对
在我的页面内容上,我将多张卡片组织成网格 __________________ | ____ ____ | | | | | | | | | | | |
是否可以在浏览器中看到(调试)从 DOM 元素触发的自定义事件? 假设我想查看 Bootstrap Collapse 的哪个特定元素触发了 show.bs.collapse event ,我能以某种方
我正在生成用于客户端的 XPaths 服务器端,我很困惑为什么在 DOM 中找不到表路径(即 td 中的内容)。 事实证明,现代浏览器(至少是 Chrome 和 Firefox)插入了 tbody在文
是否可以检索文本节点的几何位置(即从父元素、页面等的顶部/左侧偏移量)? 最佳答案 不是直接的。 TextNode 没有用于测量视口(viewport)定位的原始 IE 偏移*(和类似的)扩展。 仅在
以下语句中的 DOM 元素的含义是什么? Statement #1 You can add multiple classes to a single DOM element. Statement #2
有没有办法让 firebug(或任何其他浏览器,或使用任何其他工具)阻止任何 dom 操作的发生?有时布局调试充满悬停事件的屏幕是不可能的,因为元素可能会消失,并且您看不到它们的复合布局。 最佳答案
我需要在html文档中搜索 text here 然后输出完整的节点路径(CSS或XPATH) 例如 html > body > div class ="something" > table > tr
这是我的一个页面的典型加载时间如何拆分为:- Domain Lookup 0 0 % Connect 134 .3% Request
我的 .on() 工作时遇到一些问题。我的网站是here . 如果你看看 www.eliteweb-creation.co.uk/dev/js/nav.js,我正在 mouseenter 和 mous
我是 Javascript 的新手,负责将我们产品的 UI 从 YUI2 迁移到 YUI3。看起来哪里都没有迁移指南,所以我现在正在浏览互联网帖子和 yui 文档。 在我的全局范围内,我临时添加了类似
我想和实习生一起测试一些 DOM 相关的东西,不需要特定的固定装置,只是一般的 DOM 东西,比如我改变了 Element.prototype。这是否需要通过本地 Selenium 服务器(或 sau
我是 HTML 和 HTML5 的初学者。 当我阅读以下内容时 link ,我找到了术语 DOM 和 DOM API。我通读了维基百科,但无法理解其背后的全部思想。 谁能给我解释一下: 文档对象模型
我有两个主要问题。 Object 之类的扩展是否算数? 什么是 DOM 包装? http://perfectionkills.com/whats-wrong-with-extending-the-do
对不起查询,原型(prototype),雅虎 YUI,道场在考虑小的时候不吸引我。我想要一个模块化的库,代码尽可能小,最多 20Kb [un compressed] 是我所期望的。应该提供 Dom 操
我是一名优秀的程序员,十分优秀!