97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
|
|
|
||
|
|
class ZjsComponent extends HTMLElement {
|
||
|
|
|
||
|
|
static _instanceCount = 0;
|
||
|
|
static _instances = new Map();
|
||
|
|
|
||
|
|
static send(objOrId, method, ...args) {
|
||
|
|
const instance = (objOrId instanceof Number)
|
||
|
|
? ZjsComponent._instances.get(objOrId)
|
||
|
|
: (objOrId instanceof String)
|
||
|
|
? document.querySelector(objOrId)
|
||
|
|
: objOrId.closest("zjs-component");
|
||
|
|
return instance[method](...args);
|
||
|
|
}
|
||
|
|
|
||
|
|
constructor() {
|
||
|
|
super();
|
||
|
|
this.instanceCount = ZjsComponent._instanceCount++;
|
||
|
|
ZjsComponent._instances.set(this.instanceCount, this);
|
||
|
|
}
|
||
|
|
|
||
|
|
disconnectedCallback() {
|
||
|
|
if (typeof this["onDisconnected"] === "function") {
|
||
|
|
this["onDisconnected"]();
|
||
|
|
}
|
||
|
|
ZjsComponent._instances.delete(this.instanceCount);
|
||
|
|
}
|
||
|
|
|
||
|
|
async connectedCallback() {
|
||
|
|
let remoteSrc = this.getAttribute("remote-src");
|
||
|
|
if (!remoteSrc) return;
|
||
|
|
|
||
|
|
if (this.hasAttribute("display")) {
|
||
|
|
this.style.display = this.getAttribute("display");
|
||
|
|
}
|
||
|
|
|
||
|
|
let response = await fetch(remoteSrc);
|
||
|
|
let htmlText = await response.text();
|
||
|
|
|
||
|
|
let tempDiv = document.createElement("div");
|
||
|
|
tempDiv.innerHTML = htmlText;
|
||
|
|
|
||
|
|
this.extractAndExecuteScripts(tempDiv);
|
||
|
|
|
||
|
|
Array.from(tempDiv.children).forEach(child => this.appendChild(child));
|
||
|
|
}
|
||
|
|
|
||
|
|
extractAndExecuteScripts(fragment) {
|
||
|
|
let scripts = fragment.querySelectorAll("script");
|
||
|
|
let scriptContent = "";
|
||
|
|
|
||
|
|
scripts.forEach(script => {
|
||
|
|
scriptContent += script.textContent + "\n";
|
||
|
|
script.remove();
|
||
|
|
});
|
||
|
|
|
||
|
|
const myClosure = this.executeInClosure(scriptContent);
|
||
|
|
for (let key in myClosure) {
|
||
|
|
this[key] = myClosure[key];
|
||
|
|
}
|
||
|
|
if (typeof this["onConnected"] === "function") {
|
||
|
|
this["onConnected"]();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
executeInClosure(scriptContent) {
|
||
|
|
try {
|
||
|
|
let closureFunction = new Function("exports", `
|
||
|
|
(function () {
|
||
|
|
try {
|
||
|
|
${scriptContent}
|
||
|
|
} catch (error) {
|
||
|
|
console.error("Runtime error in ZjsComponent.executeInClosure:", error);
|
||
|
|
}
|
||
|
|
})();
|
||
|
|
return exports;
|
||
|
|
//# sourceURL=zjs-component-${this.getAttribute("remote-src")}
|
||
|
|
`);
|
||
|
|
|
||
|
|
let closure = closureFunction({});
|
||
|
|
|
||
|
|
if (this.hasAttribute("debug")) {
|
||
|
|
window.__zjsDebugClosure = closure;
|
||
|
|
console.log("Debug mode: myClosure available at window.__zjsDebugClosure");
|
||
|
|
}
|
||
|
|
|
||
|
|
return closure;
|
||
|
|
} catch (error) {
|
||
|
|
console.error("Syntax error in fragment script:", error);
|
||
|
|
return {};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
customElements.define("zjs-component", ZjsComponent);
|