0

我有两个脚本加载到我的头部区域,它们是:

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

但是,由于脚本未正确加载,这似乎不起作用。我是否需要重写/更改某些内容才能使其正常工作?

一些建议将不胜感激。

4

2 回答 2

2

SVNInfo由第一个脚本定义。因此,在执行第一个脚本之前,您不能包含第二个脚本(其源路径包含 的值SVNInfo)。

当您document.write从块中获取内容时,它会在当前块<script>的结束标记之后的位置为 HTML 解析器添加新内容。</script>如果该内容本身包含一个<script>元素,则其中的脚本在当前脚本完成之前无法开始执行。因此,这些</script><script>标签会破坏当前的脚本执行,从而允许插入的脚本document.write运行。如果不破坏这一点,您将无法将两个写入都放入同一个脚本中。

您可以按照 pete 建议的方式将脚本元素直接插入 DOM,从而完全避免使用解析器。因为不涉及解析器,所以插入的脚本可以立即执行,无需等待当前脚本块完成。

但是,您需要确保第一个脚本元素已添加到文档并在尝试设置src第二个脚本元素之前运行,因为您需要SVNInfo做好准备。此外,您应该将脚本附加到<head>元素,而不是<body>因为写入尚未完全解析的元素可能会导致页面加载在 IE 中中止。

document.write如果第二个脚本中的某些内容期望从-invoked 脚本运行,这也可能仍然无法正常工作。由于脚本压缩后无法读取,因此无法从此处真正看到。

鉴于集成文档告诉您它希望您做什么,我会坚持下去;即使您有更好的方法,他们也可能在未来某个时候以依赖于这两个脚本的方式更改document.write脚本。

于 2012-11-11T03:26:40.167 回答
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。

于 2012-11-11T03:05:32.770 回答