JavaScript apply classList.toggle to only onclick element





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I have a function in my todo list app that generates my HTML:



function updateResults() {
listItems = todos.reduce((result, item) => {
result += `<li class="todo">${item}<div class="controls">
<span class="check" onclick="checkItem()"></span><span class="delete">&#x1F5D1</span></div></li>`;
return result;
}, '');
resultElement = document.getElementById('result');
// Set inner HTML
resultElement.innerHTML = listItems;
}


When the 'check' span is clicked on one of the generated items, I want only that item to be checked, but I'm only able to toggle ALL list items at a time.



function checkItem() {
[...document.getElementsByClassName('check')].forEach(function (item) {
item.classList.toggle('checked');
});
}


I want to be using the 'this' keyword here right? I've tried a bunch of different syntax but have not been able to to target just the element that was clicked with my 'checked' class.



Thanks kindly.










share|improve this question























  • Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

    – charlietfl
    Nov 16 '18 at 18:10




















0















I have a function in my todo list app that generates my HTML:



function updateResults() {
listItems = todos.reduce((result, item) => {
result += `<li class="todo">${item}<div class="controls">
<span class="check" onclick="checkItem()"></span><span class="delete">&#x1F5D1</span></div></li>`;
return result;
}, '');
resultElement = document.getElementById('result');
// Set inner HTML
resultElement.innerHTML = listItems;
}


When the 'check' span is clicked on one of the generated items, I want only that item to be checked, but I'm only able to toggle ALL list items at a time.



function checkItem() {
[...document.getElementsByClassName('check')].forEach(function (item) {
item.classList.toggle('checked');
});
}


I want to be using the 'this' keyword here right? I've tried a bunch of different syntax but have not been able to to target just the element that was clicked with my 'checked' class.



Thanks kindly.










share|improve this question























  • Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

    – charlietfl
    Nov 16 '18 at 18:10
















0












0








0








I have a function in my todo list app that generates my HTML:



function updateResults() {
listItems = todos.reduce((result, item) => {
result += `<li class="todo">${item}<div class="controls">
<span class="check" onclick="checkItem()"></span><span class="delete">&#x1F5D1</span></div></li>`;
return result;
}, '');
resultElement = document.getElementById('result');
// Set inner HTML
resultElement.innerHTML = listItems;
}


When the 'check' span is clicked on one of the generated items, I want only that item to be checked, but I'm only able to toggle ALL list items at a time.



function checkItem() {
[...document.getElementsByClassName('check')].forEach(function (item) {
item.classList.toggle('checked');
});
}


I want to be using the 'this' keyword here right? I've tried a bunch of different syntax but have not been able to to target just the element that was clicked with my 'checked' class.



Thanks kindly.










share|improve this question














I have a function in my todo list app that generates my HTML:



function updateResults() {
listItems = todos.reduce((result, item) => {
result += `<li class="todo">${item}<div class="controls">
<span class="check" onclick="checkItem()"></span><span class="delete">&#x1F5D1</span></div></li>`;
return result;
}, '');
resultElement = document.getElementById('result');
// Set inner HTML
resultElement.innerHTML = listItems;
}


When the 'check' span is clicked on one of the generated items, I want only that item to be checked, but I'm only able to toggle ALL list items at a time.



function checkItem() {
[...document.getElementsByClassName('check')].forEach(function (item) {
item.classList.toggle('checked');
});
}


I want to be using the 'this' keyword here right? I've tried a bunch of different syntax but have not been able to to target just the element that was clicked with my 'checked' class.



Thanks kindly.







javascript dom this






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 16 '18 at 18:06









CosmosCosmos

318




318













  • Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

    – charlietfl
    Nov 16 '18 at 18:10





















  • Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

    – charlietfl
    Nov 16 '18 at 18:10



















Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

– charlietfl
Nov 16 '18 at 18:10







Best suggestion is stop using inline onclick and use unobtrusive event listeners. You are using very modern ES6 spread operator in your code (circa 2016) and 1990's event methods

– charlietfl
Nov 16 '18 at 18:10














1 Answer
1






active

oldest

votes


















1














I suggest removing the inline onclick (and your checkItem function) and creating an event listenter like this



// listen to all clicks on your page
window.addEventListener('click', (event) => {
// if the clicked element has a class named check
if (event.target.classList.contains('check')) {
// remove or add the class checked only from this element
event.target.classList.toggle('checked')
}
})


This way only the clicked element with check class gets checked class applied.



You can read more about the addEventListener here at MDN.






share|improve this answer
























  • Thank you, a working solution and cleaner way to write this.

    – Cosmos
    Nov 18 '18 at 7:18












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343199%2fjavascript-apply-classlist-toggle-to-only-onclick-element%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














I suggest removing the inline onclick (and your checkItem function) and creating an event listenter like this



// listen to all clicks on your page
window.addEventListener('click', (event) => {
// if the clicked element has a class named check
if (event.target.classList.contains('check')) {
// remove or add the class checked only from this element
event.target.classList.toggle('checked')
}
})


This way only the clicked element with check class gets checked class applied.



You can read more about the addEventListener here at MDN.






share|improve this answer
























  • Thank you, a working solution and cleaner way to write this.

    – Cosmos
    Nov 18 '18 at 7:18
















1














I suggest removing the inline onclick (and your checkItem function) and creating an event listenter like this



// listen to all clicks on your page
window.addEventListener('click', (event) => {
// if the clicked element has a class named check
if (event.target.classList.contains('check')) {
// remove or add the class checked only from this element
event.target.classList.toggle('checked')
}
})


This way only the clicked element with check class gets checked class applied.



You can read more about the addEventListener here at MDN.






share|improve this answer
























  • Thank you, a working solution and cleaner way to write this.

    – Cosmos
    Nov 18 '18 at 7:18














1












1








1







I suggest removing the inline onclick (and your checkItem function) and creating an event listenter like this



// listen to all clicks on your page
window.addEventListener('click', (event) => {
// if the clicked element has a class named check
if (event.target.classList.contains('check')) {
// remove or add the class checked only from this element
event.target.classList.toggle('checked')
}
})


This way only the clicked element with check class gets checked class applied.



You can read more about the addEventListener here at MDN.






share|improve this answer













I suggest removing the inline onclick (and your checkItem function) and creating an event listenter like this



// listen to all clicks on your page
window.addEventListener('click', (event) => {
// if the clicked element has a class named check
if (event.target.classList.contains('check')) {
// remove or add the class checked only from this element
event.target.classList.toggle('checked')
}
})


This way only the clicked element with check class gets checked class applied.



You can read more about the addEventListener here at MDN.







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 16 '18 at 18:35









estevanestevan

3371414




3371414













  • Thank you, a working solution and cleaner way to write this.

    – Cosmos
    Nov 18 '18 at 7:18



















  • Thank you, a working solution and cleaner way to write this.

    – Cosmos
    Nov 18 '18 at 7:18

















Thank you, a working solution and cleaner way to write this.

– Cosmos
Nov 18 '18 at 7:18





Thank you, a working solution and cleaner way to write this.

– Cosmos
Nov 18 '18 at 7:18




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343199%2fjavascript-apply-classlist-toggle-to-only-onclick-element%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Florida Star v. B. J. F.

Danny Elfman

Retrieve a Users Dashboard in Tumblr with R and TumblR. Oauth Issues