Reputation: 133
document.addEventListener('DOMContentLoaded',()=>{
document.querySelector("#submit").onclick = (event)=>{
const li = document.createElement('li');
};
document.querySelector("#add-message li,#add-message2 li").addEventListener('click', function() {
console.log('You have clicked: ',this.textContent);
});
li.innerHTML = document.querySelector('#message').value;
document.querySelector('#add-message').append(li);
event.preventDefault();
});
<ul id="add-message">
</ul>
<ul id="add-message2">
<li>ab</li>
<li>ss</li>
<li>sss</li>
</ul>
<ul id="add-message3">
<li>abc</li>
<li>ssw</li>
<li>ssst</li>
</ul>
<form>
<input type="text" id="message">
<input type="submit" id="submit">
</form>
I want make add-message
and add-message2
li
element to be only clickable.
But it give null error.
I try to select element using selector like in CSS, descendant combinator
but it failed to select li
Right now I am selecting li
from #add-message
and #add-message2
Upvotes: 0
Views: 266
Reputation: 786
You can't select just one <li>
item and hope that all of them will follow.
That's the code that works.
document.addEventListener('DOMContentLoaded', () => {
document.querySelector("#submit").onclick = (event) => {
const li = document.createElement('li');
li.innerHTML = document.querySelector('#message').value;
document.querySelector('#add-message').append(li);
event.preventDefault();
// note the lines added here ↓↓↓
li.addEventListener('click', function() {
console.log('You have clicked', this.textContent);
});
// add an item into the second list
const li2 = document.createElement('li');
li2.innerHTML = document.querySelector('#message').value;
document.querySelector('#add-message2').append(li2);
event.preventDefault();
li2.addEventListener('click', function() {
console.log('You have clicked', this.textContent);
});
};
// and don't forget the loop here ↓↓↓
for (let li of document.querySelectorAll("#add-message li, #add-message2 li")) {
// here ↓↓↓ you should add event listeners to list items one by one
li.addEventListener('click', function() {
console.log('You have clicked', this.textContent);
});
}
});
<form>
<input type="text" id="message">
<input type="submit" id="submit">
</form>
<ul id="add-message">
</ul>
<ul id="add-message2">
<li>ab</li>
<li>ss</li>
<li>sss</li>
</ul>
<ul id="add-message3">
<li>abc</li>
<li>ssw</li>
<li>ssst</li>
</ul>
Upvotes: 1
Reputation: 1326
You can try code below. all levels are clear. pay attention to correct place of li
var Which leads to the error that you receive it. also look at the second event listener
:
document.addEventListener('DOMContentLoaded',()=>{
document.querySelector("#submit").onclick = (event)=>{
const li = document.createElement('li');
li.innerHTML = document.querySelector('#message').value;
document.querySelector('#add-message').append(li);
event.preventDefault();
};
document.querySelector("body").addEventListener('click', function(ev){
var tN = ev.target.tagName.toLowerCase();
if(tN!="li") return;
var ul = ev.target.parentNode,
uid = ul.id;
if(uid.indexOf("add-message")!=0) return;
var li=ev.target;
console.log('You have clicked: ',li.textContent);
});
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form>
<input type="text" id="message">
<input type="submit" id="submit">
</form>
<ul id="add-message">
</ul>
<ul id="add-message2">
<li>ab</li>
<li>ss</li>
<li>sss</li>
</ul>
<ul id="add-message3">
<li>abc</li>
<li>ssw</li>
<li>ssst</li>
</ul>
</body>
</html>
Another benefit of this method is that if you dynamically create new ul
s (that their Id starts with add-message
), this program will still work!
Upvotes: 1