2012-11-11 75 views
0

我有兩個腳本,在我的腦海區的負載分別是:合併2個腳本到1個文件

<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

什麼是錯誤? –

+0

SVNInfo.revision來了嗎? –

+2

可能不起作用,因爲'document.write'是** evil **。 –

回答

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

我以爲用'script1.type =「text/javascript」'和'script1.src =「blah.js」'就夠了? –

+0

你是對的。 'script.type ='text/javascript''可能就夠了。我正在演示DOM操作方法。 – pete

+0

非常感謝@pete - 我會看看你的解決方案! –

2

SVNInfo由第一個腳本定義。因此,在執行第一個腳本之前,您不能包含第二個腳本(其源代碼路徑包含值爲SVNInfo)。

當您從<script>塊中獲取document.write內容時,它會在當前塊的</script>末尾標記後面的位置爲HTML解析器添加新內容。如果該內容本身包含<script>元素,則其內部的腳本無法開始執行,直到當前腳本完成。所以</script><script>標籤分解了當前的腳本執行,允許document.write插入的腳本運行。您將無法將這兩個寫入同一個腳本而不會破壞這個。

您可以按照pete建議的方式將腳本元素直接插入到DOM中,避免完全避免解析器。由於不涉及解析器,插入的腳本可以立即執行,無需等待當前腳本塊完成。

但是,您需要確保在嘗試設置第二個腳本元素的src之前將第一個腳本元素添加到文檔並運行,因爲您需要SVNInfo準備就緒。另外,您應該將腳本附加到<head>元素,而不是<body>,因爲寫入尚未完全解析的元素可能會導致頁面加載在IE中中止。

如果第二個腳本中有某些東西需要從document.write引入的腳本運行,那麼這可能仍然不起作用。由於腳本壓縮不可讀,因此無法從這裏看到。

鑑於整合文檔告訴你它想要你做什麼,我會堅持,即使你有更好的方法,他們也可能在將來某個時候改變腳本,而這種方式依賴於兩個document.write腳本。

+0

非常感謝你對徹底的細節@bobince - 非常感謝。 –