I have created a simple web component using vanilla js just onclick to open URL on a new window unfortunately I get the following error
my-component.js:24 Uncaught TypeError: window.open is not a function
Here is my web component:
export class MyComponent extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this._render();
this._attachEventHandlers();
}
_render() {
const container = document.createElement("div");
container.innerHTML = `
<div class='app'>
<button id="open-me">Open</button>
</div>`;
const shadowRoot = this.attachShadow({ mode: "open" });
shadowRoot.appendChild(container);
}
_attachEventHandlers() {
this.shadowRoot.getElementById('open-me').addEventListener('click', () => {
window.open('www.google.com', "_blank");
})
}
}
window.customElements.define("my-component", MyComponent);
usage of this component, just import in your HTML and add it like this
<my-component></my-component>
What is wrong here?
I would shorten it to:
customElements.define("my-component", class extends HTMLElement {
constructor() {
let button = document.createElement("button");
button.innerText = "open";
button.onclick = (evt) => {
alert("You clicked! " + evt.target.nodeName);
open('www.google.com', "_blank");
};
super().attachShadow({mode:"open"})
.append(button);
}
});
<my-component></my-component>
export
, the Web Component is created in the Global registrydiv
soup, unless they actually have a purpose.addEventListener
only required when you want muliple events on the same elementwindow.
for customElements
, alert
and open
not required;window
super
sets AND returns the 'this' scope; so can be chainedattachShadow
sets AND returns this.shadowRoot
; so can be chainedappend
over appendChild
Your open
issue can not be related to Web Components; check that statement raw, in the console.
Here in StackOverflow it says:
OP was responsible for overriding window.open
himself.