1

我们需要向我们的 Web 应用程序添加一个脚本。它基本上添加了一个公司菜单。

所以我们收到了一个脚本来包含在我们的 Web 应用程序的主体中:

<!-- BEGIN NAVIGATION -->
<script type="text/javascript" src="https://intranet.local/?getCorporateJsMenu"></script>
<!-- END NAVIGATION -->

https://intranet.local/?getCorporateJsMenu的内容基本上是这样的:

document.write('<script type="text/javascript" src="..."></script>');
//....
document.write('<div>');
document.write('<ul>');
//...
document.write('<li><a href="...">...</a></li>');
//...
document.write('</ul>');
document.write('</div>');

<!--NAVIGATION--><script...直接放入 HTML 正文后,我们遇到了严重的页面加载性能问题。

所以我们的想法是使用 JavaScript 添加菜单,当所有内容都已经加载了类似这样的内容时:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://intranet.local/?getCorporateJsMenu';
var domparent = jQuery('#header').get();
domparent[0].appendChild(script);

使用Firebug,我们看到,脚本元素已添加到 HTML 内容中,并且脚本已从网络加载,但不知何故,已加载脚本的 document.write 没有被执行。为什么?


我们无法修改https://intranet.local/?getCorporateJsMenu的内容,因为它来自第三方。

4

3 回答 3

14

发生这种情况是因为脚本执行在第一个找到的文字</script>标记处停止,无论它是否包含在括号中。您需要混淆结束script标记,例如:

document.write('<script type="text/javascript" src="..."><\/script>');

但是,您似乎也使用 jQuery。为什么不使用 jQuery 方法来加载脚本并将内容添加到页面而不是document.write()?

于 2013-07-09T07:41:57.843 回答
4

这是一个劫持 document.write() 以将 21 世纪的加载性能带入遗留脚本的示例:

<script>
    var writes = [];
    document.write = [].push.bind(writes);
</script>

<div id=targ></div>

<script type="text/javascript" src="https://intranet.local/?getCorporateJsMenu"></script>
<script>
    document.getElementById("targ").innerHTML = writes.join(" ");
</script>

我使用这些模式来支持SPA网站上的广告,以及缓存嵌入,并在一种情况下在注入之前修改内容的样式。

于 2013-07-09T15:14:00.150 回答
2

试试这个:

document.write('<scr' + 'ipt type="text/javascript" src="..."></scr' + 'ipt>');
于 2013-07-09T07:42:44.313 回答