Я делал обучающие программы по кнопкам и HTML-селектору и просто не могу заставить это работать. Пожалуйста, не просто дайте мне ответ, я хочу осознать свою ошибку.
Вот мой код:
Цель состоит в том, чтобы взять каждый тег <li> и назначить им кнопку, которая выводит их текст в консоль Javascript. Как бы говоря, вы нажали эту кнопку, следовательно, вы выбрали Штаны.
list[x].innerHTML += ('<button onClick = "console.info('+list[x].innerHTML+');">Select Item</button>');
let storedListValue = [];
let y = 0,
x = 0;
function outputTargetValues() {
let list = document.querySelectorAll("li");
console.info(list.length);
while (x < list.length) {
storedListValue.push(list[x].innerHTML);
console.info(storedListValue[x] + " This is storedListValue Data");
//console.info(list[x].innerHTML);
list[x].innerHTML += ('<button onClick = "console.info(' + list[x].innerHTML + ');">Select Item</button>');
//console.info(list[x]);
y++;
x++;
}
}
function output(itemName) {
console.info(itemName);
}
function callMeOutput() {
console.info(y);
return storedListValue[x];
}<h3>Shirts</h3>
<ul id='list'>
<li id='i1'>Biker Jacket</li>
<li id='i2'>Mens Shirt</li>
</ul>
<button onClick = "outputTargetValues();">Test</button>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы хотите распечатать текст элемента списка при нажатии на первую кнопку, вам нужно изменить эту строку:
list[x].innerHTML += ('<button onClick = "console.info(\'' + list[x].innerHTML + '\');">Select Item</button>');
Проблема с вашим кодом заключалась в том, что результат был похож на console.info(Mens Shirt), что является синтаксической ошибкой. С кодом, который я предоставил сейчас, в строке есть кавычки, поэтому ошибки нет.
let storedListValue = [];
let y = 0,
x = 0;
function outputTargetValues() {
let list = document.querySelectorAll("li");
console.info(list.length);
while (x < list.length) {
storedListValue.push(list[x].innerHTML);
console.info(storedListValue[x] + " This is storedListValue Data");
list[x].innerHTML += ('<button onClick = "console.info(\'' + list[x].innerHTML + '\');">Select Item</button>');
y++;
x++;
}
}
function output(itemName) {
console.info(itemName);
}
function callMeOutput() {
console.info(y);
return storedListValue[x];
}<h3>Shirts</h3>
<ul id='list'>
<li id='i1'>Biker Jacket</li>
<li id='i2'>Mens Shirt</li>
</ul>
<button onClick = "outputTargetValues();">Test</button>Я рекомендую вам проверить свой HTML-вывод, когда вы получите такую ошибку, и попытаться увидеть, есть ли синтаксическая ошибка. Это может помочь вам в ваших будущих проектах :)
ОХХХХХХ. Омг ... Я совершенно это пропустил ... Я столько раз читал этот код, и это была простая синтаксическая опечатка ... бххх ..
Это одинарная кавычка, я добавил ее с обратной косой чертой \ , чтобы я мог использовать ее внутри строки. Вы можете получить дополнительную информацию здесь
Я не мог действительно проверить этот код, потому что мой колледж позволял мне запускать код только в их онлайн-идеале или редакторе кода ... как бы они это ни называли ... Большое спасибо ...
Основная проблема - это линия button onClick = "console.info(' + list[x].innerHTML + '). onclick ожидает имя функции, но вы пытаетесь запустить здесь код javascript.
Во-вторых, всегда избегайте написания встроенного javascript.
Вам также необходимо прикрепить eventlistener к buttons, вы можете сделать это только после того, как кнопки будут созданы и добавлены в дом.
В этом фрагменте кода прослушиватель событий для button добавляется после цикла while.
Также т
let storedListValue = [];
let y = 0,
x = 0;
document.getElementById('otTargetVal').addEventListener('click', outputTargetValues)
function outputTargetValues() {
let list = document.querySelectorAll("li");
while (x < list.length) {
storedListValue.push(list[x].innerHTML);
//using template literals and dataset to store the value
console.info(storedListValue[x] + " This is storedListValue Data");
list[x].innerHTML += `<button data-val ='${list[x].innerHTML}'>Select Item</button>`;
y++;
x++;
}
document.querySelectorAll('button').forEach((item) => {
item.addEventListener('click', function() {
console.info(this.dataset.val)
})
})
}
function output(itemName) {
console.info(itemName);
}
function callMeOutput() {
console.info(y);
return storedListValue[x];
}<h3>Shirts</h3>
<ul id='list'>
<li id='i1'>Biker Jacket</li>
<li id='i2'>Mens Shirt</li>
</ul>
<button type = "button" id = "otTargetVal">Test1</button>Вы должны заключить параметр консоли в кавычки. Вы можете использовать Литералы шаблона, который позволяет использовать встроенные выражения, более простой и легкий в использовании. Я также предлагаю вам использовать textContent вместо innerHTML, когда значение - текст, так как это быстрее и надежнее.
Изменять
('<button onClick = "console.info(' + list[x].innerHTML + ');">Select Item</button>');
К
`<button onClick='console.info("${list[x].textContent}")'>Select Item</button>`
let storedListValue = [];
let y = 0, x = 0;
function outputTargetValues(){
let list = document.querySelectorAll("li");
console.info(list.length);
while(x < list.length){
storedListValue.push(list[x].textContent);
console.info(storedListValue[x] + " This is storedListValue Data");
var v = list[x].textContent;
list[x].innerHTML += `<button onClick='console.info("${v}")'>Select Item</button>`;
y++;
x++;
}
}
function output(itemName){
console.info(itemName);
}
function callMeOutput(){
console.info(y);
return storedListValue[x];
}<h3>Shirts</h3>
<ul id='list'>
<li id='i1'>Biker Jacket</li>
<li id='i2'>Mens Shirt</li>
</ul>
<button onClick = "outputTargetValues();">Test</button>
Эхх ... Спасибо .. искал подсказки, но это помогает. Так что это? Я вижу, вы добавили
\''и\'