注意:我编辑了这篇文章,其中包含我从第三方获得的更多信息。
简而言之,我的任务是包含一个调用我们内部广告服务器机制的 JS 广告标记,该机制然后重试第三方脚本,该脚本将文件写入其外部文件……它在 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">
有没有人有处理过这样的事情的经验以及如何克服它?
最佳答案
由于您没有发布足够的详细信息来为您的问题写出完整的答案(您写道:“我正在写这个,所以我不记得脚本标签是如何分解的” ) 所以这里有一些帮助您入门的一般提示,而不是直接的解决方案。你说你确信问题出在 document.write
太多了所以我会集中精力尽可能减少他们的数量。希望它能让您最终解决问题。
额外的分号
在你的第一个例子中你有:
document.write(' ... ';);
删除多余的分号将是:
document.write(' ... ');
这会导致一些问题吗?如果没有,请继续阅读...
首先是一些基础知识:
脚本类型和语言
<script language="JavaScript" type="text/javascript">
“语言”属性已弃用,因此不要使用它。 “type”属性的问题在于 text/javascript MIME 类型已过时(参见 RFC4329 )并且 application/javascript(正确的类型)未得到普遍支持。在实践中,每个浏览器都知道没有“类型”它只是 JavaScript,这就是为什么我建议在它是可选的每个标记版本(如 HTML5)中都不要使用它。 (此外,MIME 类型应该由服务器指定。)参见 this question获取更多信息。话虽如此,我将只使用 <script>
在下面的示例中。
最小化文档写入
在你的 HTML 中有这个:
<script>
document.write('\x3Cscript src="file.js">\x3C/script>');
</script>
完全等同于:
<script src="file.js"></script>
使用 document.write
很有意义在这种情况下,除非你在 JavaScript 或类似的东西中动态构建脚本名称,但即便如此你也可以在没有 document.write
的情况下完成它.
如果您不知道脚本的路径并且正在使用例如。一个名为 path
的 JavaScript 变量那么你可能会想写这样的东西:
<script>
document.write('\x3Cscript src="' + path + '">\x3C/script>');
</script>
但是您可以使用类似于 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);
或更短,使用 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);
更多想法
其他想法见:
- Google Analytics code asynchronous syntax
- Google Analytics code traditional syntax (与
document.write
) - jQuery getScript
- YUI Get
- RequireJS
这些是您可以做的一些基本事情,以尽量减少 document.write
的使用。 .希望这能让您入门。
关于javascript - 嵌套的 document.writes 和第三方广告在 IE 中不起作用!!!!任何安全的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554244/