Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步加载使用document.write向页面添加可视元素的第三方javascript_Javascript_Asynchronous_Document.write - Fatal编程技术网

异步加载使用document.write向页面添加可视元素的第三方javascript

异步加载使用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'

我维护一些捐赠表格,其中包括GeoTrust SSL“智能图标”。这是通过在要显示印章的文档中包含脚本引用生成的:

<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重置为原始版本(我将其保存为变量)
编辑:在下面的评论之后,我只是把它放在一个IFRAME中

<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()
,而不是零个调用,也不是多个调用。