- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嘿, friend 们,我有一个元素数组。我想为每个元素添加一个子跨度元素。我用了一个for循环
for(let i = 0; i < slots.length; i++) {
//add class to each div
slots[i].classList.add('c' + i);
//add the slot to each div
slots[i].appendChild(slot);
//add the function with the game logic to each slot
slots[i].addEventListener('click', runGame);
}
并观察每个元素附加子元素。但是当我查看我的 devtools 中的元素时,其中唯一具有 span 的元素是最后一个?不是所有的人?有什么想法吗?
//grab all slot positions on the board
const slots = document.querySelectorAll('.board div');
let player = 'p1';
let board = [
0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41,
]
let slot = document.createElement('span');
//assign a class to each slot to represent its position
for (let i = 0; i < slots.length; i++) {
//add class to each div
slots[i].classList.add('c' + i);
//add the slot to each div
slots[i].appendChild(slot);
//add the function with the game logic to each slot
slots[i].addEventListener('click', runGame);
}
function runGame() {
//figure out which column the selected slot sits in
const slotColumn = (Number(this.className.slice(1, 3)) % 7);
//create an array to store all the slots that share the above column
const columnArray = [];
//grab all the slots that sit in that column
for (let i = 0; i < board.length; i++) {
if (board[i] % 7 === slotColumn) columnArray.push(board[i]);
}
//drop chip in the chosen column
dropChip(columnArray);
function dropChip(column) {
//select bottom most slot that's available in the column
for (let i = column.length - 1; i > 0; i--) {
if (column[i] !== 'p1' || column[i] !== 'p2') {
board[column[i]] = player;
slots[column[i]].classList.add(player);
switchPlayer(player);
break;
}
}
function switchPlayer(currentPlayer) {
if (currentPlayer === 'p1') player = 'p2';
else if (currentPlayer === 'p2') player = 'p1';
}
console.log(board);
}
}
/** {
outline: 1px solid red;
}*/
*,
*:before,
*:after {
box-sizing: inherit;
}
html {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
background-color: #e5e6e8;
}
body {
display: flex;
justify-content: center;
min-height: 100vh;
}
.board-wrapper {
padding-top: 100px;
display: flex;
justify-content: center;
margin: auto auto 0 auto;
/*ask why this is needed*/
position: relative;
}
.board {
display: flex;
flex-wrap: wrap;
max-width: 706px;
background-color: #00c;
padding: 3px;
}
.board div {
width: 100px;
height: 100px;
background-color: blue;
border: 3px solid #00c;
position: relative;
}
.board div:after {
content: "";
display: inline-block;
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #00c;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
box-shadow: inset 0px 0px 13px #0606aa;
}
.board .chip {
display: block;
position: absolute;
background-color: transparent;
top: 0;
left: 0;
right: 0;
height: 100px;
}
.board .chip:after {
content: "";
width: 80px;
height: 80px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 3px;
top: 0;
opacity: 0;
transition: all .5s ease;
}
.board .chip:before {
content: "";
width: 50px;
height: 50px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 18px;
top: 15px;
z-index: 1;
box-shadow: inset 0px 0px 20px #cc0000;
opacity: 0;
transition: all .5s ease;
}
.board div:nth-of-type(7n+1):hover~.chip:after {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+1):hover~.chip:before {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:after {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:before {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:after {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:before {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:after {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:before {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:after {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:before {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:after {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:before {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:after {
transform: translateX(610px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:before {
transform: translateX(610px);
opacity: 1;
}
<div class="board-wrapper">
<div class="board">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<span class="chip"></span>
</div>
</div>
最佳答案
您需要克隆 slot
元素,否则它只会从一个父元素移动到下一个父元素。
所以我添加了 cloneNode()
来为每个位置创建一个新的克隆。
//grab all slot positions on the board
const slots = document.querySelectorAll('.board div');
let player = 'p1';
let board = [
0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41,
]
let slot = document.createElement('span');
//assign a class to each slot to represent its position
for (let i = 0; i < slots.length; i++) {
//add class to each div
slots[i].classList.add('c' + i);
//add the slot to each div
slots[i].appendChild(slot.cloneNode()); //<--------------------------- cloneNode()
//add the function with the game logic to each slot
slots[i].addEventListener('click', runGame);
}
function runGame() {
//figure out which column the selected slot sits in
const slotColumn = (Number(this.className.slice(1, 3)) % 7);
//create an array to store all the slots that share the above column
const columnArray = [];
//grab all the slots that sit in that column
for (let i = 0; i < board.length; i++) {
if (board[i] % 7 === slotColumn) columnArray.push(board[i]);
}
//drop chip in the chosen column
dropChip(columnArray);
function dropChip(column) {
//select bottom most slot that's available in the column
for (let i = column.length - 1; i > 0; i--) {
if (column[i] !== 'p1' || column[i] !== 'p2') {
board[column[i]] = player;
slots[column[i]].classList.add(player);
switchPlayer(player);
break;
}
}
function switchPlayer(currentPlayer) {
if (currentPlayer === 'p1') player = 'p2';
else if (currentPlayer === 'p2') player = 'p1';
}
console.log(board);
}
}
/** {
outline: 1px solid red;
}*/
*,
*:before,
*:after {
box-sizing: inherit;
}
html {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
background-color: #e5e6e8;
}
body {
display: flex;
justify-content: center;
min-height: 100vh;
}
.board-wrapper {
padding-top: 100px;
display: flex;
justify-content: center;
margin: auto auto 0 auto;
/*ask why this is needed*/
position: relative;
}
.board {
display: flex;
flex-wrap: wrap;
max-width: 706px;
background-color: #00c;
padding: 3px;
}
.board div {
width: 100px;
height: 100px;
background-color: blue;
border: 3px solid #00c;
position: relative;
}
.board div:after {
content: "";
display: inline-block;
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #00c;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
box-shadow: inset 0px 0px 13px #0606aa;
}
.board .chip {
display: block;
position: absolute;
background-color: transparent;
top: 0;
left: 0;
right: 0;
height: 100px;
}
.board .chip:after {
content: "";
width: 80px;
height: 80px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 3px;
top: 0;
opacity: 0;
transition: all .5s ease;
}
.board .chip:before {
content: "";
width: 50px;
height: 50px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 18px;
top: 15px;
z-index: 1;
box-shadow: inset 0px 0px 20px #cc0000;
opacity: 0;
transition: all .5s ease;
}
.board div:nth-of-type(7n+1):hover~.chip:after {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+1):hover~.chip:before {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:after {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:before {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:after {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:before {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:after {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:before {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:after {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:before {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:after {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:before {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:after {
transform: translateX(610px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:before {
transform: translateX(610px);
opacity: 1;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Connect Four</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="board-wrapper">
<div class="board">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<span class="chip"></span>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
我同意@Mohd Asim Suhail 和@Towkir 的观点。您可以将 slot
的创建移动到循环中。这很好,您所做的只是创建插槽而不对其进行任何其他操作。但是,如果您创建 slot
,然后添加类和子类,那么使用 cloneNode(true)
会更快。 (true
也将克隆所有子项。)
鉴于您的示例是如何编写的,我可能会将其更改为如下所示:
//grab all slot positions on the board
const COLUMNS = 7;
const ROWS = 7;
const boardEl = document.querySelector('.board');
let player = 1;
let board = [];
boardEl.addEventListener('click', runGame);
let c = 0;
// Set up the board, assign a class to each slot to represent its position
for (let row = 0; row < ROWS; row++) {
const newRow = [];
for (let col = 0; col < COLUMNS; col++) {
newRow.push(0);
slot = document.createElement('div');
slot.classList.add('c' + c++); //add class to each div
slot.setAttribute('col', col);
slot.setAttribute('row', row);
slot.innerHTML = '<span></span>'; //add the slot to each div
boardEl.appendChild(slot);
}
board.push(newRow);
}
const chip = document.createElement('span');
chip.className = 'chip';
boardEl.appendChild(chip);
function switchPlayer() {
player = player === 1 ? 2 : 1;
}
function dropChip(col) {
const colData = board[col];
//select bottom most slot that's available in the column
for (let i = ROWS-1; i >= 0; i--) {
if (colData[i] === 0) {
colData[i] = player;
const el = boardEl.querySelector(`[col="${col}"][row="${i}"]`)
el.classList.add(`p${player}`);
break;
}
}
switchPlayer(player);
}
function runGame(evt) {
let slot = evt.target;
// If they clicked on the `<span>` the move to the `<div>`
if (slot.nodeName === 'SPAN') {
slot = slot.parentElement;
}
//figure out which column the selected slot sits in
const col = Number(slot.getAttribute('col'));
//drop chip in the chosen column
dropChip(col);
}
/** {
outline: 1px solid red;
}*/
*,
*:before,
*:after {
box-sizing: inherit;
}
html {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
background-color: #e5e6e8;
}
body {
display: flex;
justify-content: center;
min-height: 100vh;
}
.board-wrapper {
padding-top: 100px;
display: flex;
justify-content: center;
margin: auto auto 0 auto;
/*ask why this is needed*/
position: relative;
}
.board {
display: flex;
flex-wrap: wrap;
max-width: 706px;
background-color: #00c;
padding: 3px;
}
.board div {
width: 100px;
height: 100px;
background-color: blue;
border: 3px solid #00c;
position: relative;
}
.board div:after {
content: "";
display: inline-block;
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #00c;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
box-shadow: inset 0px 0px 13px #0606aa;
}
.board .chip {
display: block;
position: absolute;
background-color: transparent;
top: 0;
left: 0;
right: 0;
height: 100px;
}
.board .chip:after {
content: "";
width: 80px;
height: 80px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 3px;
top: 0;
opacity: 0;
transition: all .5s ease;
}
.board .chip:before {
content: "";
width: 50px;
height: 50px;
border-radius: 50%;
background-color: red;
position: absolute;
left: 18px;
top: 15px;
z-index: 1;
box-shadow: inset 0px 0px 20px #cc0000;
opacity: 0;
transition: all .5s ease;
}
.board div:nth-of-type(7n+1):hover~.chip:after {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+1):hover~.chip:before {
transform: translateX(10px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:after {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+2):hover~.chip:before {
transform: translateX(110px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:after {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+3):hover~.chip:before {
transform: translateX(210px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:after {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+4):hover~.chip:before {
transform: translateX(310px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:after {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+5):hover~.chip:before {
transform: translateX(410px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:after {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+6):hover~.chip:before {
transform: translateX(510px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:after {
transform: translateX(610px);
opacity: 1;
}
.board div:nth-of-type(7n+7):hover~.chip:before {
transform: translateX(610px);
opacity: 1;
}
.board span {
border-radius: 50%;
display: inline-block;
height: 80px;
left: 10px;
position: relative;
top: 10px;
width: 80px;
z-index: 999;
}
.board .p1 span {
background-color: red;
}
.board .p2 span {
background-color: black;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Connect Four</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="board-wrapper">
<div class="board">
</div>
</div>
<script src="script.js"></script>
</body>
</html>
此版本的代码将您的电路板转换为二维数组,仅需要一个事件处理程序即可正常工作。
关于javascript - 不能将 child 附加到数组中的每个 DOM 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56081927/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!