(function () { const ltagData = {}; window.ltag = function (key, value) { ltagData[key] = value; }; window.addEventListener("load", function () { const userLang = navigator.language.substring(0, 2); fetch("https://www.discovery-japan.me/ems/tax2025.php?lang=${userLang}", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(ltagData), mode: "cors" }) .then(response => response.json()) .then(data => { if (data.success) { if (data.country_name === "Japan") { console.warn("Processing stopped: Country is Japan"); return Promise.reject("Processing stopped"); } return fetch("https://www.discovery-japan.me/ems/hello.php?lang=${userLang}").then(response => response.text()).then(html => ({ html, data })); } else { throw new Error("Failed to get HTML data"); } }) .then(({html, data}) => { let parser = new DOMParser(); let doc = parser.parseFromString(html, "text/html"); // Bootstrap 5 に影響しないように、#tax_info 内部の独立したコンテナでラップ let container = document.createElement("div"); // CSSの適用 (head に追加) - 完全にロードを待機 let cssPromises = []; doc.querySelectorAll("link[rel='stylesheet']").forEach(link => { if (!document.querySelector(`link[href="${link.href}"]`)) { let newLink = document.createElement("link"); newLink.rel = "stylesheet"; newLink.href = link.href; document.head.appendChild(newLink); // CSSのロード待機 cssPromises.push(new Promise(resolve => { newLink.onload = () => { console.log("CSS Loaded:", newLink.href); resolve(); }; })); } }); // HTMLのコンテンツを適用(スクリプトを除く) let bodyContent = doc.body.cloneNode(true); bodyContent.querySelectorAll("script").forEach(script => script.remove()); // 一旦スクリプト削除 container.appendChild(bodyContent); // 手動で個別に置換え container.innerHTML = container.innerHTML.replace(/{store}/g, ltagData.store || ""); container.innerHTML = container.innerHTML.replace(/{title}/g, ltagData.title || ""); container.innerHTML = container.innerHTML.replace(/{image_link}/g, ltagData.image_link || ""); container.innerHTML = container.innerHTML.replace(/{url}/g, ltagData.link || ""); container.innerHTML = container.innerHTML.replace(/{price}/g, data.price || ""); container.innerHTML = container.innerHTML.replace(/{price_jpy}/g, data.price_jpy || ""); container.innerHTML = container.innerHTML.replace(/{gtin}/g, data.gtin || ""); container.innerHTML = container.innerHTML.replace(/{tax}/g, data.tax || ""); container.innerHTML = container.innerHTML.replace(/{shipping}/g, data.shipping || ""); container.innerHTML = container.innerHTML.replace(/{subtotal}/g, data.subtotal || ""); container.innerHTML = container.innerHTML.replace(/{country}/g, data.country_name || ""); container.innerHTML = container.innerHTML.replace(/{country_flag}/g, data.country_flag || ""); container.innerHTML = container.innerHTML.replace(/{delivery_min}/g, data.delivery_min || ""); container.innerHTML = container.innerHTML.replace(/{delivery_max}/g, data.delivery_max || ""); container.innerHTML = container.innerHTML.replace(/{weight}/g, data.weight || ""); container.innerHTML = container.innerHTML.replace(/{condition}/g, data.condition || ""); container.innerHTML = container.innerHTML.replace(/{handing_time}/g, ltagData.handing_time || ""); container.innerHTML = container.innerHTML.replace(/{availability_date}/g, ltagData.availability_date || ""); container.innerHTML = container.innerHTML.replace(/{availability_date_text}/g, data.availability_date_text || ""); container.innerHTML = container.innerHTML.replace(/{logo}/g, data.logo || ""); container.innerHTML = container.innerHTML.replace(/{aff}/g, data.aff || ""); container.innerHTML = container.innerHTML.replace(/{test}/g, data.test || ""); container.innerHTML = container.innerHTML.replace(/{subscription}/g, data.subscription || ""); container.innerHTML = container.innerHTML.replace(/{sitekey}/g, data.sitekey || ""); // CSSロード完了後にHTMLを適用 Promise.all(cssPromises).then(() => { requestAnimationFrame(() => { document.getElementById("tax_info").innerHTML = ""; document.getElementById("tax_info").appendChild(container); document.body.offsetHeight; // Force repaint }); // JavaScript の適用 let scriptPromises = []; doc.querySelectorAll("script[src]").forEach(script => { let newScript = document.createElement("script"); newScript.src = script.src; newScript.async = false; // スクリプトの順番を守る document.head.appendChild(newScript); scriptPromises.push(new Promise(resolve => { newScript.onload = () => { console.log("Script Loaded:", newScript.src); resolve(); }; })); }); // インラインスクリプトの適用 (外部スクリプトのロード後) Promise.all(scriptPromises).then(() => { doc.querySelectorAll("script:not([src])").forEach(script => { let newScript = document.createElement("script"); newScript.textContent = script.textContent; document.body.appendChild(newScript); console.log("Inline Script Executed"); }); // すべてのスクリプトがロードされたら `DOMContentLoaded` をトリガー setTimeout(() => { document.dispatchEvent(new Event("DOMContentLoaded")); }, 100); }); }); }) .catch(error => { console.error("Error:", error); document.getElementById("tax_info").innerHTML = ""; }); }); })();