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

时间:2015-05-21 20:54:06

标签: javascript asynchronous document.write

我保留了一些捐赠表格,其中包括GeoTrust SSL'智能图标'。这是通过在文档中包含脚本引用生成的,您希望在其中显示封条:

    PFQuery *userProfile = [PFQuery queryWithClassName:@"UserSnapshot"];
[userProfile whereKey:@"Code" equalTo:_Code];
[userProfile getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
    if (!object) {
        // Did not find PFObject
        // not executed
    } else {
        // Found PFObject
        // also not executed....huh?
    }
}];

他们的脚本显然是在做一个document.write(),如果/当geotrust很慢的话,它会阻止我捐赠表格的呈现时间长达几秒钟。

我无法使用' async'属性,因为document.write()。我当然无法编辑或重写GeoTrust的javascript。并将js加载到页脚中或者将“js”添加到“head”中。方法没有帮助,因为脚本需要在我们希望图标出现的标记内执行。更复杂的是,这些捐赠页面也是不同的第三方系统的一部分,这些系统充满了自己的javascript等。

这是一种似乎有效的方法,但我想知道是否有更好的方法:

<script type="text/javascript" src="//smarticon.geotrust.com/si.js"></script>

(PS我完全从http://www.dustindiaz.com/smallest-domready-ever偷走了domready测试)

编辑:如果不清楚,我正在做的是

  • 写一个div
  • 等待dom准备好(最后一行)
  • 将document.write保存为变量
  • 覆盖document.write而不是将输出插入div
  • 通过appendChild动态加载脚本
  • 当脚本调用overriden document.write时,覆盖的最后一行是将document.write重置为原始版本(我保存为变量)。

编辑:在下面的评论之后,我只是简单地将它放入IFRAME中。

<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>

我最初尝试将内容添加到隐藏的IFRAME中,然后将innerHTML从IFRAME复制到我的div中,但GeoTrust的javascript使得他们的弹出窗口非常漂亮需要在被点击的上下文中执行上。 innerHTML不会执行javascript,并且不仅仅显示IFRAME似乎没有优势。

感谢您的意见和建议!

0 个答案:

没有答案