嵌套的document.writes和第三方广告在IE中无效!!!! 任何安全的解决方法?

jam*_*non 9 javascript jquery

注意:我对此进行了编辑,其中包含了我从第三方获得的更多信息.

简而言之,我有一个任务是包含一个JS广告代码,该代码调用我们的内部广告服务器机制,然后重新编写第三方脚本,将document.writes写入其外部文件......它将无法在IE中运行.有人向我提到嵌套的document.writes在IE中不起作用.我尝试了各种各样的东西.. appendTo/writeln /分解脚本标签/解码脚本标签等.似乎没什么用.因为这对我来说有点新鲜,也许我忽视了显而易见的事实.

这就是它的样子:

my html:
<script language="JavaScript" type="text/javascript">
   document.write('\x3Cscript type="text/javascript" src="_some_Path_to_internal_ad_server">\x3C/script>';);
</script>
Run Code Online (Sandbox Code Playgroud)

该调用最终会引入一些看起来像这样的代码:正如您所看到的,没有封闭的脚本标记.

   tl1 = '989';
   tl2 = 'xnlll';
   document.write('<script type=\"text/javascript\" src=\"_some_Path_to_third_party.js\"><\/script>');
Run Code Online (Sandbox Code Playgroud)

现在,"_some_Path_to_third_party.js"带来了一些具有document.writes和document.writeln的js代码

我正在写这篇文章,所以我不记得脚本标签是如何分解的,但我不相信这是问题所在.我相信它是IE中嵌套的document.writes.

我尝试了各种各样的东西,甚至在我的页面中布置了我的第一个脚本调用.没有document.writes - 只是

<script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server">
Run Code Online (Sandbox Code Playgroud)

没有骰子.

但是直接调用外部js确实有效(取消我对内部广告服务器的调用,随后调用第三方调用),ala:

<script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server">
Run Code Online (Sandbox Code Playgroud)

任何人都有处理这样的事情以及如何克服它的经验?

rsp*_*rsp 6

由于你没有发布足够的细节来为你的问题写一个完整的答案(你写道:"我写的是我的头脑,所以我不记得脚本标签是如何分解的")所以这里是一些一般提示,让你开始而不是直接的解决方案.你说你确信这个问题涉及太多的document.write电话,所以我会集中精力尽可能减少他们的号码.希望它能让你最终解决你的问题.

额外的分号

在您的第一个示例中,您有:

document.write(' ... ';);
Run Code Online (Sandbox Code Playgroud)

删除额外的分号将是:

document.write(' ... ');
Run Code Online (Sandbox Code Playgroud)

这可能会导致一些问题吗?如果没有,请继续阅读......

首先是一些基础知识:

脚本类型和语言

<script language="JavaScript" type="text/javascript">
Run Code Online (Sandbox Code Playgroud)

不推荐使用"language"属性,因此请勿使用它."type"属性的问题是text/javascript MIME类型已过时(请参阅RFC4329),而application/javascript(正确类型)并未得到普遍支持.在实践中,每个浏览器总是知道没有"类型"它只是JavaScript,这就是为什么我建议将它留给每个标记版本,它是可选的,如HTML5.(除了MIME类型之外,还应该由服务器指定.)有关详细信息,请参阅此问题.话虽如此,我将<script>在下面的例子中使用.

最小化文档写入

在您的HTML中有这个:

<script>
    document.write('\x3Cscript src="file.js">\x3C/script>');
</script>
Run Code Online (Sandbox Code Playgroud)

完全等同于:

<script src="file.js"></script>
Run Code Online (Sandbox Code Playgroud)

document.write在这种情况下使用它是很有意义的,除非你在JavaScript或类似的东西中动态构建脚本名称,但即便如此,你也可以不用它document.write.

如果您不知道脚本的路径,并且您正在使用例如.一个名为的JavaScript变量,path你可能会想写这样的东西:

<script>
    document.write('\x3Cscript src="' + path + '">\x3C/script>');
</script>
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用类似于Google用于Google Analytics的内容获得几乎相同的结果:

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(newScript, firstScript);
Run Code Online (Sandbox Code Playgroud)

或更短,使用appendChild:

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
document.body.appendChild(newScript);
Run Code Online (Sandbox Code Playgroud)

或者更容易使用jQuery:

$('<script />', {src: path}).appendTo('body');
Run Code Online (Sandbox Code Playgroud)

path您的脚本的URL 在哪里.或部分使用jQuery只是为了插入DOM:

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
$('body').append(newScript);
Run Code Online (Sandbox Code Playgroud)

您也可以使用jQuery.getScript:

$.getScript(path);
Run Code Online (Sandbox Code Playgroud)

更多想法

其他想法见:

这些是你可以做的一些基本的事情,以尽量减少使用document.write.希望这会让你开始.