Reputation: 13
I have the following problem: I want that every time that one of the elements of the list is clicked, the data-link value is printed, if I need to create a function for each of the elements of the list.
<ul id="programs">
<li id="design" data-link="www.monster.inc">Diseño</li>
<li id="fashion" data-link="www.iceage.inc">Moda</li>
<li id="management" data-link="www.transilvania.inc">Management</li>
<li id="arts" data-link="www.ralph.inc">Artes</li>
</ul>
<p id="demo"></p>
<script>
var one = document.getElementById("design");
one.onclick = function() {
var x = one.getAttribute("data-link");
document.getElementById("demo").innerHTML = x;
}
var two = document.getElementById("fashion");
two.onclick = function() {
var y = two.getAttribute("data-link");
document.getElementById("demo").innerHTML = y;
}
var three = document.getElementById("management");
three.onclick = function() {
var z = three.getAttribute("data-link");
document.getElementById("demo").innerHTML = z;
}
var four = document.getElementById("arts");
four.onclick = function() {
var w = four.getAttribute("data-link");
document.getElementById("demo").innerHTML = w;
}
</script>
Upvotes: 0
Views: 42
Reputation: 2755
You can attach the onclick event to the parent ul
element and use the event.target
property to access the child element on which the click happened.
var programs = document.getElementById("programs");
programs.onclick = function(e) {
var link = e.target.getAttribute("data-link");
if (link)
document.getElementById("demo").innerHTML = link;
};
<ul id="programs">
<li id="design" data-link="www.monster.inc">Diseño</li>
<li id="fashion" data-link="www.iceage.inc">Moda</li>
<li id="management" data-link="www.transilvania.inc">Management</li>
<li id="arts" data-link="www.ralph.inc">Artes</li>
</ul>
<p id="demo"></p>
You need not iterate through each li
and attach onclick
events to them individually.
Upvotes: 0
Reputation: 1231
There are a number of solutions for this one, with or without jQuery.
Here's a simple one that only updates your one list and not other broadly selected elements on the page.
var list = document.getElementById("programs").getElementsByTagName("li")
for (var i=0;i<list.length;i++)
{
list[i].onclick = function() {
var x = this.getAttribute("data-link");
document.getElementById("demo").innerHTML = x;
}
}
Upvotes: 0
Reputation: 11297
I can think of two selectors for the above structure.
var links = document.querySelectorAll('[data-link]');
and
var links = document.querySelectorAll('#programs > li');
And then loop over the NodeList and attach the function to onclick
prop. I recommend addEventListener
, however.
var links = document.querySelectorAll('[data-link]'),
demo = document.getElementById("demo");
links.forEach(function(link){
link.onclick = function() {
var x = this.getAttribute("data-link");
demo.innerHTML = x;
}
});
<ul id="programs">
<li id="design" data-link="www.monster.inc">Diseño</li>
<li id="fashion" data-link="www.iceage.inc">Moda</li>
<li id="management" data-link="www.transilvania.inc">Management</li>
<li id="arts" data-link="www.ralph.inc">Artes</li>
</ul>
<p id="demo"></p>
Upvotes: 1