将2个脚本合并为1个文件

时间:2012-11-11 02:49:22

标签: javascript

我有两个脚本加载到我的头部区域:

    <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>');

然而,这似乎不起作用,因为脚本没有正确加载。我是否需要重写/更改某些内容以使其正常工作?

非常感谢一些建议。

2 个答案:

答案 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脚本的方式更改脚本。