9

注意:我用更多关于我从第三方获得的信息进行了编辑。

简而言之,我的任务是包含一个 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>

该调用最终引入了一些如下所示的代码:正如您所见,没有封闭的脚本标签。

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

现在,“_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">

没有骰子。

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

<script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server">

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

4

1 回答 1

6

由于您没有发布足够的详细信息来为您的问题写下完整的答案(您写道:“我正在头脑中写下这个,所以我不记得到底脚本标签是如何分解的”)所以在这里是一些帮助您入门的一般技巧,而不是直接的解决方案。您说您确信问题在于document.write呼叫过多,因此我将尽可能集中精力尽量减少他们的数量。希望它能让你最终解决你的问题。

额外分号

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

document.write(' ... ';);

删除多余的分号将是:

document.write(' ... ');

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

首先是一些基础知识:

脚本类型和语言

<script language="JavaScript" type="text/javascript">

“语言”属性已被弃用,所以不要使用它。“type”属性的问题在于 text/javascript MIME 类型已过时(请参阅RFC4329)并且 application/javascript(正确的类型)并未得到普遍支持。在实践中,每个浏览器都知道没有“类型”它只是 JavaScript,这就是为什么我建议在它是可选的每个标记版本(如 HTML5)中将其排除在外。(除了 MIME 类型之外,还应由服务器指定。)有关更多信息,请参阅此问题。话虽如此,我将仅<script>在下面的示例中使用。

最小化文档写入

在你的 HTML 中有这个:

<script>
    document.write('\x3Cscript src="file.js">\x3C/script>');
</script>

完全等同于:

<script src="file.js"></script>

在这种情况下使用它非常有意义document.write,除非您在 JavaScript 或类似的东西中动态构建脚本名称,但即使那样,您也可以在没有document.write.

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

<script>
    document.write('\x3Cscript src="' + path + '">\x3C/script>');
</script>

但是您可以使用类似于 Google 用于分析的东西来获得几乎相同的结果:

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

或更短,使用appendChild

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
document.body.appendChild(newScript);

或者更容易使用 jQuery:

$('<script />', {src: path}).appendTo('body');

path您的脚本的 URL在哪里。或者部分使用 jQuery 来插入 DOM:

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

你也可以使用 jQuery.getScript:

$.getScript(path);

更多创意

有关其他想法,请参阅:

这些是您可以做的一些基本操作,以尽量减少document.write. 希望这会让你开始。

于 2012-09-23T01:57:01.270 回答