异步加载使用document.write向页面添加可视元素的第三方javascript
我维护一些捐赠表格,其中包括GeoTrust SSL“智能图标”。这是通过在要显示印章的文档中包含脚本引用生成的:异步加载使用document.write向页面添加可视元素的第三方javascript,javascript,asynchronous,document.write,Javascript,Asynchronous,Document.write,我维护一些捐赠表格,其中包括GeoTrust SSL“智能图标”。这是通过在要显示印章的文档中包含脚本引用生成的: <script type="text/javascript" src="//smarticon.geotrust.com/si.js"></script> 他们的脚本显然是在执行document.write(),如果/当geotrust运行缓慢时,它会在几秒钟内阻止我的捐赠表单的呈现 由于document.write()的原因,我无法使用'async'
<script type="text/javascript" src="//smarticon.geotrust.com/si.js"></script>
他们的脚本显然是在执行document.write(),如果/当geotrust运行缓慢时,它会在几秒钟内阻止我的捐赠表单的呈现
由于document.write()的原因,我无法使用'async'属性。当然,我不能编辑或重写GeoTrust的javascript。在页脚中加载js或执行“附加到页眉”方法也没有帮助,因为脚本需要在我们希望图标出现的标记中执行。更复杂的是,这些页面也是另一个第三方系统的一部分,该系统充满了自己的javascript等
这是一种似乎有效的方法,但我想知道是否有更好的方法:
<div id="vs_seal"></div>
<script type="text/javascript">
r(function() {
var div = document.getElementById('vs_seal');
writebackup = document.write;
document.write = function(markup) {
div.innerHTML = markup;
document.write = writebackup;
}
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= '//smarticon.geotrust.com/si.js';
document.body.appendChild(script);
});
function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}
</script>
r(函数(){
var div=document.getElementById('vs_seal');
writebackup=document.write;
document.write=函数(标记){
div.innerHTML=标记;
document.write=写回备份;
}
var script=document.createElement('script');
script.type='text/javascript';
script.src='//smarticon.geotrust.com/si.js';
document.body.appendChild(脚本);
});
函数r(f){/in/.test(document.readyState)?setTimeout('r('+f+'),9):f()}
(PS我完全偷了domready的测试)
编辑:如果不清楚,我正在做的是
- 写div
- 等待dom准备就绪(最后一行)
- 将document.write保存为变量
- 重写document.write以将输出插入到div中
- 通过appendChild动态加载脚本
- 当脚本调用被重写的document.write时,重写的最后一行是将document.write重置为原始版本(我将其保存为变量)
<style>#vs_seal iframe{border:0 none;}</style>
<div id="vs_seal"></div>
<script type="text/javascript">
r(function() {
var div = document.getElementById('vs_seal');
var iframe = document.createElement('iframe');
iframe.width = 118;
iframe.height = 55;
iframe.frameborder = 0;
iframe.scrolling = "no";
iframe.seamless = "true";
iframe.src = 'about:blank';
var content = '<!DOCTYPE html>'
+ '<head><title>Dynamic iframe</title>'
+ '<style>body{margin:0;padding:0;border:0;}</style></head>'
+ '<body><script type="text/javascript" src="//smarticon.geotrust.com/si.js">'
+ '<\/script><\/body><\/html>';
div.appendChild(iframe);
iframe.contentWindow.document.open('text/html', 'replace');
iframe.contentWindow.document.write(content);
iframe.contentWindow.document.close();
});
function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}
</script>
#vs#u seal iframe{border:0 none;}
r(函数(){
var div=document.getElementById('vs_seal');
var iframe=document.createElement('iframe');
iframe.width=118;
iframe.height=55;
iframe.frameborder=0;
iframe.scrolling=“否”;
iframe.seamble=“true”;
iframe.src='about:blank';
变量内容=“”
+“动态iframe”
+'正文{margin:0;padding:0;border:0;}'
+ ''
+ '';
子类附件(iframe);
iframe.contentWindow.document.open('text/html','replace');
iframe.contentWindow.document.write(内容);
iframe.contentWindow.document.close();
});
函数r(f){/in/.test(document.readyState)?setTimeout('r('+f+'),9):f()}
我最初尝试将内容拉入一个隐藏的IFRAME,然后将innerHTML从IFRAME复制到我的div中,但是GeoTrust的javascript使其弹出窗口非常漂亮,需要在其被单击的上下文中执行。innerHTML不执行javascript,而且不显示IFRAME似乎没有什么好处
谢谢你的评论和建议 如果它是唯一需要document.write()的脚本,那么在出现更好的脚本之前应该可以。“我当然不能编辑或重写GeoTrust的javascript”当然可以,下载js文件,重写它以使用document.write以外的其他东西,并将新的js文件上载到您的服务器,并链接到该js文件,而不是GeoTrust服务器上的js文件。Patrick,由于GeoTrust脚本的目的是提供SSL验证,因此重写和本地托管将不是一个选项。如果脚本使用
document.write
,则无法异步加载它。指向如果需要加速页面的其余部分,请将脚本包含在iframe中。document.write()
将被覆盖一段不确定的时间,其他脚本可以在该时间内运行。因为您正在异步加载脚本,所以在加载脚本之前可能会运行其他脚本。如果这些脚本中的任何一个试图使用document.write()
,您的黑客将破坏一切。此外,您的黑客还假设GeoTrust脚本只使用一个调用document.write()
,而不是零个调用,也不是多个调用。