#javascript #html #css
#javascript #HTML #css
Вопрос:
Итак, у меня есть это приложение, в котором я нажимаю кнопку, и вложенные div отображаются с изображением во внутреннем самом div. текстовая область отслеживает, сколько раз нажата кнопка, и при каждом нажатии вложенные divs остаются, но изображение переключается между исходным изображением и вторым изображением.
Мне нужно, чтобы вложенные div появлялись только при первом щелчке, и после каждого щелчка после этого менялось только изображение, используя значение в текстовом поле, чтобы это произошло, как я сделал с функцией addbutterfly .
в этой функции я взял значение из текстовой области и сделал так, чтобы, если значение равно 1, отображалось изображение, и если это не так, будет отображаться другое.
я не уверен, как заставить это работать для функции, применяемой к кнопке, чтобы, если значение равно 0, создавались divs и начальное изображение, и если оно не равно 0, то запускалась только функция addbutterfly, которая меняла бы изображения взад и вперед.
я попытался использовать самый простой способ, который я мог придумать. который должен был извлекать значение из текстовой области так же, как я делал с функцией addbutterfly, и сделать так, чтобы if value == 0 выполнял все функции, else выполнял только функцию addbutterfly, но она не работает.
прежде чем я добавил, что оператор if / else приложение работало нормально, но добавляло все divs при каждом нажатии. это моя ошибка: «сообщение»: «Неперехваченная ошибка типа: не удается прочитать свойство ‘appendChild’ неопределенного», «filename»: «https://stacksnippets.net/js «, «линено»: 102, «кольно»: 45
var i = 0;
function runTogether1() {
const value = parseInt(document.getElementById('id1').value, 10);
if (value == 0) {
addDiv();
addDiv2();
addDiv3();
addbutterfly();
incrementValue();
} else {
addbutterfly();
}
}
function addDiv() {
var div1 = document.createElement('div');
div1.classList.add('div1');
document.body.appendChild(div1);
}
function addDiv2() {
var div2 = document.createElement('div');
div2.classList.add('div2');
document.getElementsByClassName("div1")[i].appendChild(div2);
}
function addDiv3() {
var div3 = document.createElement('div');
div3.classList.add('div3');
document.getElementsByClassName("div2")[i].appendChild(div3);
}
function addbutterfly() {
var img = document.createElement('img');
// Get the value of the "textfield"
const value = parseInt(document.getElementById('id1').value, 10);
// If the value is even, add "bfly2.gif", otherwhise add "bfly1.gif"
img.src = value % 2 === 0 ? "bfly2.gif" : "bfly1.gif";
document.getElementsByClassName("div3")[i].appendChild(img);
i ;
}
function incrementValue() {
var value = parseInt(document.getElementById('id1').value, 10);
value = isNaN(value) ? 0 : value;
value ;
document.getElementById('id1').value = value;
}
.div1 {
background-color: red;
margin: 1em;
height: 500px;
width: 500px;
justify-content: center;
align-items: center;
}
.div2 {
background-color: yellow;
height: 300px;
width: 300px;
}
.div3 {
background-color: limegreen;
height: 150px;
width: 150px;
}
div {
display: flex;
justify-content: center;
align-items: center;
position: relative;
}
<html>
<head>
<meta charset="utf-8">
<script src="bflyjs.js" defer></script>
</head>
<body>
<div class="button">
<button onclick="runTogether1()">
click to get nested divs
</button>
<textarea id="id1">
</textarea>
</div>
</body>
</html>
Комментарии:
1. Текстовая область не содержится
0
в начале.parseInt()
возвращаетсяNaN
.2. итак, могу ли я сделать так, чтобы, если он возвращает NaN, запускалась только первая часть, а если у нее есть значение, запускалась другая часть? я попытался поместить 0 в текстовое поле, как в приведенном ниже решении, но это работает только в первый раз и ничего больше.
3. Да, смотрите Мой ответ.
Ответ №1:
Вам нужно добавить значение textarea
в, чтобы прочитать значение по идентификатору.
var i = 0;
function runTogether1() {
const value = parseInt(document.getElementById('id1').value, 10);
if (value == 0) {
addDiv();
addDiv2();
addDiv3();
addbutterfly();
incrementValue();
} else {
addbutterfly();
}
}
function addDiv() {
var div1 = document.createElement('div');
div1.classList.add('div1');
document.body.appendChild(div1);
}
function addDiv2() {
var div2 = document.createElement('div');
div2.classList.add('div2');
document.getElementsByClassName("div1")[i].appendChild(div2);
}
function addDiv3() {
var div3 = document.createElement('div');
div3.classList.add('div3');
document.getElementsByClassName("div2")[i].appendChild(div3);
}
function addbutterfly() {
var img = document.createElement('img');
// Get the value of the "textfield"
const value = parseInt(document.getElementById('id1').value, 10);
// If the value is even, add "bfly2.gif", otherwhise add "bfly1.gif"
img.src = value % 2 === 0 ? "bfly2.gif" : "bfly1.gif";
document.getElementsByClassName("div3")[i].appendChild(img);
i ;
}
function incrementValue() {
var value = parseInt(document.getElementById('id1').value, 10);
value = isNaN(value) ? 0 : value;
value ;
document.getElementById('id1').value = value;
}
.div1 {
background-color: red;
margin: 1em;
height: 500px;
width: 500px;
justify-content: center;
align-items: center;
}
.div2 {
background-color: yellow;
height: 300px;
width: 300px;
}
.div3 {
background-color: limegreen;
height: 150px;
width: 150px;
}
div {
display: flex;
justify-content: center;
align-items: center;
position: relative;
}
<html>
<head>
<meta charset="utf-8">
<script src="bflyjs.js" defer></script>
</head>
<body>
<div class="button">
<button onclick="runTogether1()">
click to get nested divs
</button>
<textarea id="id1"> 0
</textarea>
</div>
</body>
</html>
Комментарии:
1. Что
document.getElementsByClassName("div3")[i]
должно быть? Вы добавляете только одинdiv3
элемент, поэтому после увеличения происходит сбойi
.2. спасибо, но это не работает для меня, потому что теперь функция работает, когда есть 0, и все. изображения не меняются местами, и счетчик не обновляется в текстовой области. в худшем месте, чем когда я начинал
Ответ №2:
parseInt(document.getElementById('id1').value, 10)
возвращается, NaN
потому что текстовая область пуста при запуске скрипта. Так что используйте isNaN()
, а не сравнивайте с 0
, как вы делаете в incrementValue()
.
var i = 0;
function runTogether1() {
const value = parseInt(document.getElementById('id1').value, 10);
if (isNaN(value)) {
addDiv();
addDiv2();
addDiv3();
addbutterfly();
incrementValue();
} else {
addbutterfly();
}
}
function addDiv() {
var div1 = document.createElement('div');
div1.classList.add('div1');
document.body.appendChild(div1);
}
function addDiv2() {
var div2 = document.createElement('div');
div2.classList.add('div2');
document.getElementsByClassName("div1")[i].appendChild(div2);
}
function addDiv3() {
var div3 = document.createElement('div');
div3.classList.add('div3');
document.getElementsByClassName("div2")[i].appendChild(div3);
}
function addbutterfly() {
var img = document.createElement('img');
// Get the value of the "textfield"
const value = parseInt(document.getElementById('id1').value, 10);
// If the value is even, add "bfly2.gif", otherwhise add "bfly1.gif"
img.src = value % 2 === 0 ? "bfly2.gif" : "bfly1.gif";
document.getElementsByClassName("div3")[i].appendChild(img);
i ;
}
function incrementValue() {
var value = parseInt(document.getElementById('id1').value, 10);
value = isNaN(value) ? 0 : value;
value ;
document.getElementById('id1').value = value;
}
.div1 {
background-color: red;
margin: 1em;
height: 500px;
width: 500px;
justify-content: center;
align-items: center;
}
.div2 {
background-color: yellow;
height: 300px;
width: 300px;
}
.div3 {
background-color: limegreen;
height: 150px;
width: 150px;
}
div {
display: flex;
justify-content: center;
align-items: center;
position: relative;
}
<html>
<head>
<meta charset="utf-8">
<script src="bflyjs.js" defer></script>
</head>
<body>
<div class="button">
<button onclick="runTogether1()">
click to get nested divs
</button>
<textarea id="id1">
</textarea>
</div>
</body>
</html>
Комментарии:
1. благодаря этому я все еще получаю сообщение об ошибке для кликов после первого. изображение никогда не обновляется, ни счетчик. ошибка теперь находится в функции addbutterfly и гласит: Uncaught TypeError: не удается прочитать свойство ‘appendChild’ неопределенного. это была функция, которая ранее работала для обмена изображениями и не путалась со счетчиком.
2. Смотрите мой комментарий выше о
document.getElementsByClassName("div3")[i]
. Это не работает, когдаi
это не0
так. Вы вызываете толькоaddDiv3()
в первый раз, поэтому есть только один из этих DIV. Почему вы индексируете его сi
помощью?3. я вижу ваш другой комментарий и догадываюсь, в чем проблема. idk, как вернуться и исправить эти вещи, чтобы связать и работать вместе. мне просто нужно, чтобы divs создавались один раз, чтобы при каждом щелчке изображение менялось местами, а текстовая область вела подсчет.
4. Используйте
[0]
, чтобы получить DIV, а не[i]
.5. Idk, как я пришел к этому прошлой ночью, но это сработало для обмена изображениями, но это воссоздало бы все вложенные divs с разными изображениями один за другим, и значение textarea все равно будет обновляться. если бы он был четным, были бы созданы вложенные divs и в нем было бы четное изображение, и наоборот, если значение было нечетным.