2013-11-04 33 views
7

我试图将外部JavaScript文件动态加载到HTML元素中以预览广告标记。该脚本加载并执行,但脚本中包含“document.write”,它有一个问题正确执行但没有错误。document.write加载外部Javascript源时不起作用

<html> 
    <head> 
     <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
     <script type="text/javascript"> 
     $(function() { 
      source = 'http://ib.adnxs.com/ttj?id=555281'; 

      // DOM Insert Approach 
      // ----------------------------------- 
      var script = document.createElement('script'); 
       script.setAttribute('type', 'text/javascript'); 
       script.setAttribute('src', source); 

      document.body.appendChild(script); 
     }); 
     </script> 
    </head> 

<body> 
</body> 
</html> 

我可以得到它,如果

  1. 如果我移动源相同的域进行测试
  2. 如果脚本修改为使用使用document.createElement和使用appendChild工作,而不是的document.write像上面的代码。

我没有能力修改脚本,因为它是由第三方生成和托管的。

有谁知道为什么document.write将无法正常工作?有没有办法解决这个问题?

感谢您的帮助!

+0

为什么不只是将脚本标记放入要显示广告的元素内?这很可能就是广告脚本的设计方式。 – David

+0

因为我将通过ajax调用接收脚本源的URL。这不能从后端脚本 – jadent

+0

呈现,所以......您如何期待广告脚本知道在哪里放置广告? – David

回答

0

你做希望在$(function()document.write(当DOM就绪)

取出document .ready包装。

移动您到 - </body>之前。 (或到容器的位置 - 在您想要的小部件出现)

这样:

<html> 
    <head> 
     <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
    </head> 

<body> 

//bla bla... 

<script type="text/javascript"> 

    (function(){ 

      var source = 'http://ib.adnxs.com/ttj?id=555281'; 

      // DOM Insert Approach 
      // ----------------------------------- 
      var script = document.createElement('script'); 
       script.setAttribute('type', 'text/javascript'); 
       script.setAttribute('src', source); 
       document.body.appendChild(script); 
    })(); 

</script> 
</body> 
</html> 

重要:

enter image description here

+2

[当然可以](http://jsbin.com/OhUDIJE/1/edit)。但我不会这样做...... – David

+0

@大卫是的。改变了这个词。 :-) - 我的意思是一样的。 (如果他希望用户看到他的网站 - 他不能这样做/不应该这样做)。 –

+0

是的,但是,如果带有'document.write'的脚本加载异步,它可能会清理DOM,因为请求需要一些时间来执行。看到这个演示:http://jsbin.com/OhUDIJE/2/edit – David

1

这将是潜在的危险来加载外部脚本标记异步如果它也包含document.write。所以我建议无论是在你的最终使用document.write还有:

document.write('\x3Cscript src="http://ib.adnxs.com/ttj?id=555281">\x3C/script>'); 

或者只是一个脚本标记(杜):

<script src="http://ib.adnxs.com/ttj?id=555281"></script> 
+0

恕我直言,对于结束标记,'\ x3Cscript'中不需要最初的'\ x3c'。 –

+0

@RoyiNamir可能是真的,我只是复制/粘贴它从一些旧的片段... :) – David

+0

不能只使用脚本标记,因为url是通过来自Web服务的ajax调用动态加载的。 Document.write在这种情况下 – jadent

6

另一种解决方案是创建一个iframe,然后加载内部脚本IFRAME当Ajax调用准备:

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
var doc = iframe.contentWindow.document; 

// do this whenever you want (f.ex after ajax is made): 
doc.open(); 
doc.write('<script src="http://ib.adnxs.com/ttj?id=555281">\x3C/script>'); 
doc.close(); 

这样一来,到底脚本document.write不会影响您的网站,就在iframe。您需要设置iframe的样式以适应广告。

+0

这可能是唯一的答案。由于我们不知道大小,我们必须在加载后获取内部框架内的内容宽度和高度。哈克,但可能会工作。 – jadent

0

我有同样的问题,想出了一个解决方案。我觉得我的想法有点复杂,因为我的布局是在dom-ready之后在客户端生成的,这意味着我无法以这种方式呈现脚本。这为我添加了一个额外的步骤,但如果您的布局是在服务器端生成的,那么对您而言,这可能不是一个额外的步骤。

  1. 生成您的URL。你的情况,它从一个Ajax请求,于我而言,它从用户交互
  2. 刷新这个网址的页面(也许文章的网址与新创建的表格服务器)

如果”能够渲染脚本包括在服务器上,正确的位置,做到这一点,你就完成了。否则:

  1. 在隐藏的服务器端创建一个div,并且具有特定的ID。这将加载脚本准备好的脚本并正确地触发document.write。
  2. 刮掉包含脚本的div的内容,你现在已经在一个变量中的HTML,你可以把它放在你的页面上的任何地方!