Custom Elements without ShadowDOM
A better way to manage lifecycle
Alex Riviere
Senior Vue Developer at Nexcor Technologies
@fimion@notacult.social
A Brief History
- Started Web Development in early 2000s
- Leaned into XHTML, CSS, and PHP
- Hated JavaScript with a fiery burning passion
JavaScript 1.2
- Regular Expressions
- the
switch
statement - the
delete
operator
A Brief History
- Took an 11 year detour as a Theatre Technician
- First professional web dev job was in 2016
- Had a year long crash course in Javascript and jQuery
Discovered Vue and never looked back
var thing = document.getElementById('thing');
thing.onclick = function(event){
// do stuff on click
}
<html>
<body>
<script>
var thing = document.getElementById('thing');
thing.onclick = function(event){
window.alert("Hello World!");
}
</script>
<input id="thing" type="button" value="Click Me!">
</body>
</html>
Uncaught TypeError: Cannot set properties of null (setting 'onclick')
<html>
<body>
<input id="thing" type="button" value="Click Me!">
<script>
var thing = document.getElementById('thing');
thing.onclick = function(event){
window.alert("Hello World!");
}
</script>
</body>
</html>
<html>
<body>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(document).ready(function(){
$("#thing").on('click',function(e){
window.alert('Hello World!')
})
});
</script>
<input id="thing" type="button" value="Click Me!">
</body>
</html>
👍
<html>
<body>
<div id="app">
<input @click="handleClick" type="button" value="Click Me!">
</div>
<script src="https://unpkg.com/vue@2.7.16/dist/vue.js"></script>
<script>
new Vue({
methods:{
handleClick(){
window.alert("Hello World")
}
}
}).$mount("#app");
</script>
</body>
</html>
Pros
- Native browser feature
- Encapsulates styles and custom DOM with ShadowDOM
- Gives you lifecycle hooks
Cons
- Encapsulates styles and custom DOM with ShadowDOM
- Doesn't give you a way to manage state
- Doesn't give you ENOUGH lifecycle hooks
Custom Elements
Many people are Frustrated
$(document).ready(function(){});
<html>
<body>
<script>
customElements.define("hello-world", class extends HTMLElement {
connectedCallback(){
this.querySelectorAll("button").forEach((el)=>{
el.addEventListener("click", ()=>{
window.alert("Hello World!");
})
})
}
})
</script>
<hello-world>
<button>
Click Me!
</button>
</hello-world>
</body>
</html>
Light DOM
ShadowDOM
Light DOM Examples
<ul>
<li>
<a href="https://example.com/really-big-image">
<img src="https://example.com/thumbnail-image">
</a>
</li>
<li>
<a href="https://example.com/really-big-image-2">
<img src="https://example.com/thumbnail-image-2">
</a>
</li>
</ul>
<light-box>
<ul>
<li>
<a href="https://example.com/really-big-image">
<img src="https://example.com/thumbnail-image">
</a>
</li>
<li>
<a href="https://example.com/really-big-image-2">
<img src="https://example.com/thumbnail-image-2">
</a>
</li>
</ul>
</light-box>
Use custom elements!
Thank you
- Alex Riviere
- https://alex.party
- https://slides.com/fimion/custom-elements-2024
Custom Elements without ShadowDOM
By Alex Riviere
Custom Elements without ShadowDOM
- 117