我有两个脚本加载到我的头部区域:
<script type="text/javascript">
var myDate = new Date();
var myStamp = ""+myDate.getDate()+myDate.getMonth()+myDate.getFullYear()+myDate.getHours()+myDate.getMinutes();
document.write('<script type="text/javascript" src="https://scriptlocation.com/js/script.js?' + myStamp + '"><\/script>');
</script>
<script type="text/javascript">
document.write('<script type="text/javascript" src=""https://scriptlocation.com/js/script2.js?'+SVNInfo.revision+'"><\/script>');
</script>
我理想的情况是将这两个合并为1个javascript文件,所以我尝试创建一个包含以下内容的新文件:
var myDate = new Date();
var myStamp = ""+myDate.getDate()+myDate.getMonth()+myDate.getFullYear()+myDate.getHours()+myDate.getMinutes();
document.write('<script type="text/javascript" src="https://scriptlocation.com/js/script.js?' + myStamp + '"><\/script>');
document.write('<script type="text/javascript" src=""https://scriptlocation.com/js/script2.js?'+SVNInfo.revision+'"><\/script>');
然而,这似乎不起作用,因为脚本没有正确加载。我是否需要重写/更改某些内容以使其正常工作?
非常感谢一些建议。
答案 0 :(得分:2)
这应该可以解决问题。
<script type="text/javascript">
var myStamp = (new Date()).getTime(), //easier way to get a relatively unique timestamp
script1 = document.createElement('script'),
script2 = document.createElement('script'),
body = document.getElementsByTagName('body')[0];
script1.setAttribute('type', 'text/javascript');
script1.setAttribute('src', 'https://scriptlocation.com/js/script.js?' + myStamp);
script2.setAttribute('type', 'text/javascript');
script2.setAttribute('src', 'https://scriptlocation.com/js/script2.js?' + SVNInfo.revision); //is SVNInfo.revision defined?
body.appendChild(script1);
body.appendChild(script2);
</script>
对于记录,document.write
是一种非常原始的(而不是友好的方式)向页面添加脚本。只需将它们创建为元素,然后将它们添加到DOM中。
答案 1 :(得分:2)
SVNInfo
由第一个脚本定义。因此,在执行第一个脚本之前,不能包含第二个脚本(其源路径包含值SVNInfo
)。
当您从document.write
块中<script>
内容时,它会在当前块的</script>
结束标记之后的位置为HTML解析器添加新内容。如果该内容本身包含<script>
元素,则其中的脚本在当前脚本完成之前无法开始执行。因此</script><script>
标记会分解当前脚本执行,从而允许document.write
插入的脚本运行。如果不打破这一点,您将无法将两个写入放在同一个脚本中。
你可以像pete建议的那样,将脚本元素直接插入到DOM中,完全避免使用解析器。因为不涉及解析器,所以插入的脚本可以立即执行,而无需等待当前脚本块完成。
但是,您需要确保在尝试设置第二个脚本元素的src
之前将第一个脚本元素添加到文档并运行,因为您需要SVNInfo
准备好。此外,您应该将脚本附加到<head>
元素而不是<body>
,因为写入尚未完全解析的元素可能会导致页面加载在IE中中止。
如果第二个脚本中有某些内容需要从document.write
调用的脚本运行,那么这可能仍然无效。由于脚本不可读,所以无法真正看到这一点。
鉴于集成文档告诉你它想要你做什么,我会坚持这一点;即使你有更好的方法,他们也可能会在某种程度上以依赖于两个document.write
脚本的方式更改脚本。