动态添加脚本标签并执行 $(document).ready,无需使用 iframe 或 document.write
Dynamically add script tag and execute $(document).ready, without using iframe or document.write
我有一个来自 api 响应的字符串。现在我想将这个脚本和样式标签集成到我的应用程序中并执行脚本。
const styleScriptText = '<style type="text/css">#checkoutmodal .checkoutmodal-box{background:#FFF !important}</style><script src="https://someurl/lib/jquery.min.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function() { console.log("test")});</script>'
我尝试使用 iframe 加载它,我可以达到预期的结果
const iframe = document.createElement('iframe');
const html = `<body>${styleScriptText}</body>`;
iframe.srcdoc = html;
iframe.style.width = "47%";
iframe.style.left = "25%";
iframe.style.height = "100vh";
iframe.style.position = "relative";
document.getElementById("parentId").appendChild(iframe);
但我不想使用 iframe,因为它有未来的限制,我必须重定向到银行页面,当它返回时,整个应用程序都是 iframed,我不想要
接下来我尝试使用 document.write 如下
const html = `<html>
<head>
</head>
<body>
${styleScriptText}
</body>
</html>`;
document.open("text/html", "replace");
document.write(html);
document.close();
但是上述方法的问题是我遇到了以下错误
通过 document.write
调用了一个阻止解析器的跨站点(即不同的 eTLD+1)脚本 https:externalscript.js
如果我采取任何其他方法 $(document).ready 脚本中的函数不会执行。
尝试了几乎所有的东西,但无法弄清楚如何加载和来自 api 响应的 运行 脚本。
这里的目标是我需要获取一个脚本作为字符串并将其加载到 html 并执行每个脚本文件
这应该有效,使用它需要您自担风险:
const styleScriptText =
'<style type="text/css">body {background: #000}</style><script type="text/javascript">alert("OK")</' + 'script' + '>';
const insertStyleScriptText = () => {
const div = document.createElement('div');
div.innerHTML = styleScriptText;
div.childNodes.forEach(child => {
document.head.appendChild(child.cloneNode(true));
if (child.tagName === 'SCRIPT')
eval(child.textContent);
});
};
<button onclick="insertStyleScriptText()">insert StyleScriptText</button>
我有一个来自 api 响应的字符串。现在我想将这个脚本和样式标签集成到我的应用程序中并执行脚本。
const styleScriptText = '<style type="text/css">#checkoutmodal .checkoutmodal-box{background:#FFF !important}</style><script src="https://someurl/lib/jquery.min.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function() { console.log("test")});</script>'
我尝试使用 iframe 加载它,我可以达到预期的结果
const iframe = document.createElement('iframe');
const html = `<body>${styleScriptText}</body>`;
iframe.srcdoc = html;
iframe.style.width = "47%";
iframe.style.left = "25%";
iframe.style.height = "100vh";
iframe.style.position = "relative";
document.getElementById("parentId").appendChild(iframe);
但我不想使用 iframe,因为它有未来的限制,我必须重定向到银行页面,当它返回时,整个应用程序都是 iframed,我不想要
接下来我尝试使用 document.write 如下
const html = `<html>
<head>
</head>
<body>
${styleScriptText}
</body>
</html>`;
document.open("text/html", "replace");
document.write(html);
document.close();
但是上述方法的问题是我遇到了以下错误 通过 document.write
调用了一个阻止解析器的跨站点(即不同的 eTLD+1)脚本 https:externalscript.js如果我采取任何其他方法 $(document).ready 脚本中的函数不会执行。 尝试了几乎所有的东西,但无法弄清楚如何加载和来自 api 响应的 运行 脚本。 这里的目标是我需要获取一个脚本作为字符串并将其加载到 html 并执行每个脚本文件
这应该有效,使用它需要您自担风险:
const styleScriptText =
'<style type="text/css">body {background: #000}</style><script type="text/javascript">alert("OK")</' + 'script' + '>';
const insertStyleScriptText = () => {
const div = document.createElement('div');
div.innerHTML = styleScriptText;
div.childNodes.forEach(child => {
document.head.appendChild(child.cloneNode(true));
if (child.tagName === 'SCRIPT')
eval(child.textContent);
});
};
<button onclick="insertStyleScriptText()">insert StyleScriptText</button>