2011-12-30 33 views
7

我剛剛遇到了this sample code,它具有包含外部源和身體的腳本標記。我認爲這是一種巧妙的方式將一些信息傳遞給包含的腳本。 它是如何工作的?帶有外部源和身體的腳本標記

<html> 
    <head> 
    <script src="http://unhosted.org/remoteStorage.js">{ 
     onChange: function(key, oldValue, newValue) { 
     if(key=='text') { 
      document.getElementById('textfield').value= newValue; 
     } 
     }, 
     category: 'documents' 
    }</script> 
    </head> 
+0

我不認爲這是如何工作的問題,而不是這是否會影響代碼的執行。 – Purag 2011-12-30 04:16:49

回答

6

標籤中包含的腳本在正常情況下不會被評估。我認爲在你的例子中發生的是remoteStorage.js正在讀取內容本身,因爲它被評估。像這樣

//grab the last script tag in the DOM 
//this will always be the one that is currently evaluating during load 
var tags = document.getElementsByTagName('script'); 
var tag = tags[tags.length -1]; 
//force evaluation of the contents 
eval(tag.innerHTML); 

雖然這看起來整潔的標記,我,我只想用一個單獨的腳本標記,避免這種強迫的評價。

2

它不應該工作。 html specs指出,如果腳本標記上有src屬性,則應忽略<script></script>的內容,只應執行src位置上的代碼。

另一方面,在理解javascript的瀏覽器上,它會優雅地降級,但不夠新以支持外部JS代碼。如果有這樣的瀏覽器存在,誰知道,但一般來說,片段中的onchange代碼不應該由任何像樣的現代瀏覽器執行。

+0

如果你說的是真的,這段代碼根本沒有意義。我以某種方式懷疑這一點。 – Thilo 2011-12-30 05:05:48

+0

他們甚至有明確的指示寫下腳本標籤,如下所示:「在元素內部,指定'onChange'和'category',如下所示」 – Thilo 2011-12-30 05:08:51

+0

根據規範確實如此。不幸的是,有太多糟糕的瀏覽器(* koff * microsoft * koff *)把規格視爲笑話並做自己的事情。 – 2011-12-30 12:44:26

3

儘管瀏覽器在具有src屬性時被認爲忽略script元素的內容,但這只是表示它們不以正常方式處理它(解析並作爲JavaScript代碼運行)。內容仍然存儲在DOM中,並可以通過腳本讀取。內容可以是任何東西然後,不一定是JavaScript代碼,但任何數據。