With parentElement, or closest()
In order to call the log()
method of the custom element, you'll have to get a reference on it.
In your example, the custom element is the parent element of the <button>
element, so you should call the parentElement
property of the button as already stated by @Smankusors:
<button onclick="this.parentElement.log()>Do it</button>
With getRootNode()
Alternately, in a more complex DOM tree, and if a Shadow DOM is used, you can use getRootNode()
combined with host
to get the custom element reference.
customElements.define('first-component', class FirstComponent extends HTMLElement {
log() {
console.log('Well Done!')
}
connectedCallback() {
this.attachShadow({mode: 'open'})
.innerHTML = '<button onclick="this.getRootNode().host.log()">Do it</button>'
}
})
<first-component></first-component>
With a unique identifier
You can also call the custom element by its id
property (if it has one) :
customElements.define('first-component', class FirstComponent extends HTMLElement {
log() {
console.log('Well Done!')
}
connectedCallback() {
if (!this.id)
this.id = "_id"
this.innerHTML = `<button onclick="${this.id}.log()">Do it</button>`
}
})
<first-component></first-component>
With handleEvent()
For security reasons, you can avoid inline script and implement the handleEvent()
method, then call inside it a specific method depending on some criterions :
customElements.define('first-component', class FirstComponent extends HTMLElement {
log() {
console.log('Well Done!')
}
handleEvent(ev) {
if (ev.target.innerText == 'Do it')
this.log()
}
connectedCallback() {
this.innerHTML = '<button>Do it</button>'
this.addEventListener('click', this)
}
})
<first-component></first-component>