С parentElement
Чтобы вызвать метод log()
пользовательского элемента, у вас должна быть ссылка на него.
В вашемНапример, пользовательский элемент является родительским элементом элемента <button>
, поэтому вам следует вызвать свойство parentElement
кнопки, как уже указано @Smankusors:
<button onclick="this.parentElement.log()>Do it</button>
С getRootNode ()
Альтернативно, в более сложном дереве DOM, и если используется Shadow DOM, вы можете использовать getRootNode()
в сочетании с host
, чтобы получить ссылку на пользовательский элемент.
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>
С уникальным идентификатором
Пользовательский элемент также можно вызывать с помощью его свойства id
(если он есть):
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>
С handleEvent ()
По соображениям безопасности вы можете избежать встроенного сценария и реализовать handleEvent()
метод, затем вызовите внутри него определенный метод в зависимости от некоторых критериев:
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>