$('#some-form').find('input').addClass('error')
Obviously you can do this in vanilla JS, but it's more cumbersome so you'll probably end up rewriting your own less complete version of jquery. There is some value to using a well worn library with public documentation that other developers can find/extend instead of a home grown solution.With that said, I wouldn't use it for a green field project. For sites that require lots of interactivity I would pick a modern front end framework that doesn't require this kind of manual dom traversal (probably phoenix/liveview).
document.querySelectorAll("#some-form input").forEach(e => e.classList.add("error")); document.getElementById('some-form').getElementsByTagName('input').forEach(i => i.classList.add('error'))
It is a little more verbose but it isn't that much more cumbersome today.That's also doing things "the right way" and not do-all selectors, but that option exists now, too:
document.querySelectorAll('#some-form > input').forEach(i => i.classList.add('error'))
If you want to make it a little less verbose: const $ = document.querySelectorAll
const addClass = (className) => (item) => item.classList.add(className)
$('#some-form > input').forEach(addClass('error'))Of course now we have additional defensive programming tools like `?.` and `??` operators.
Point is that the DOM API version of the initial jQuery snippet are not equivalent. $() statement does a bit more than that.
This becomes obvious if the requirement are a bit more complex than the example, perhaps we want to chain more expression on at the end, then the DOM API version becomes more convoluted.
Same thing of course applies to people who throw around the optional chaining operator without thinking to please TS.
Or would apply if one used a single selector here and document.querySelectorAll
The needless chaining here is a typical example of misleading jQuery code though. Looks as if it was there to prevent this issue.
for (const input of document.querySelectorAll('#some-form input') {
input.classList.add('error');
}
?In fact, this has an even earlier baseline browser compatibility than
NodeList.prototype.forEach