Вот код:
document.getElementById("btn" + b).onclick =
document.getElementById("div" + b).innerHTML = "HELLO WORLD"
Насколько известно, JavaScript, который выглядит, как это на него:
x = y = "HELLO WORLD"
Вот что происходит, когда вы делаете что:
x =
y = "hello world"
console.log("x is:", x)
console.log("y is:", y)
Так что ваш код заканчивает настройку innerHTML
свойства #div(b)
иonclick
свойства #btn(b)
! Ой, это не то, что ты хочешь.
Что вы действительно хотите для #div(b)
's innerHTML
, которое будет установлено при нажатии на #btn(b)
.
Чтобы сделать это, вам нужно назначить функцию, или обратного вызова, чтобы #btn(b)
«ы onclick
собственности:
function setTheText(b) {
document.getElementById('div' + b).innerHTML = 'HELLO WORLD'
}
for (var b = 1; b < 5; b++) {
document.getElementById('btn' + b).onclick = function() {
setTheText(b)
}
}
<div id='div1'>Div 1</div>
<div id='div2'>Div 2</div>
<div id='div3'>Div 3</div>
<div id='div4'>Div 4</div>
<button id='btn1'>Button 1</button>
<button id='btn2'>Button 2</button>
<button id='btn3'>Button 3</button>
<button id='btn4'>Button 4</button>
Хм .. мы получаем ошибку когда мы нажимаем на кнопки: «Неволи TypeError
: Невозможно установить свойство innerHTML
из null
». Упс!
Исследуем. Вот что происходит, когда мы заменим код в setTheText
функции с чем-то, вошедшим b
:
function setTheText(b) {
console.log(b)
}
for (var b = 1; b < 5; b++) {
document.getElementById('btn' + b).onclick = function() {
setTheText(b)
}
}
<button id='btn1'>Button 1</button>
<button id='btn2'>Button 2</button>
<button id='btn3'>Button 3</button>
<button id='btn4'>Button 4</button>
Он всегда выводит 5! Это не имеет большого смысла.
В основном проблема b
изменяется на 5
на цикл for
до того, как JavaScript называет вашу функцию onclick
.
Так что нам действительно нужно сделать, это использовать функцию для создать функцию обратного вызова, так что функция обратного вызова может вспомнить, что индекс (b
) он был создан с:
function makeSetTheText(b) {
function setTheText() {
document.getElementById('div' + b).innerHTML = 'HELLO WORLD'
}
return setTheText
}
for (var b = 1; b < 5; b++) {
document.getElementById('btn' + b).onclick = makeSetTheText(b)
}
<div id='div1'>Div 1</div>
<div id='div2'>Div 2</div>
<div id='div3'>Div 3</div>
<div id='div4'>Div 4</div>
<button id='btn1'>Button 1</button>
<button id='btn2'>Button 2</button>
<button id='btn3'>Button 3</button>
<button id='btn4'>Button 4</button>
Это все еще немного запутанно, не волнуйтесь, есть куча действительно хороших объяснений о том, как замыкания и функции, которые генерируют функции на StackOverflow here.
Если вы сделали это настолько далеко, мы надеемся:
- Вы узнали немного о отладке.
- Вы выясните решение проблемы.
- Вы узнаете пару причудливых трюков JavaScript.
- У вас будет некоторое сочувствие относительно количества отставания, с которым мне пришлось иметь дело, набрав этот ответ, и все исследования и испытания, которые я сделал.
Надеюсь, это поможет!
'document.getElementById (" btn "+ b) .onclick = document.getElementById (" div "+ b) .innerHTML'? O.o – Andreas
Что вы на самом деле хотите? вы устанавливаете innerhtml каждого div так же, как результат этого, все это выглядит. –
Посмотрите обновленную скрипку; https://jsfiddle.net/tr8wntmL/1/ – Laazo