2010-08-14 91 views
0

Flattr Javascript API description一些一般性的JavaScript問題

<script type="text/javascript"> 
<!--//--><![CDATA[//><!-- 

    (function() { 
     var s = document.createElement('script'), t = document.getElementsByTagName('script')[0]; 

     s.type = 'text/javascript'; 
     s.async = true; 
     s.src = 'http://api.flattr.com/js/0.5.0/load.js'; 

     t.parentNode.insertBefore(s, t); 
    })(); 

//--><!]]> 
</script> 

我對<!--//--><![CDATA[//><!--//--><!]]>有點好奇。我想這是一些黑客來欺騙不明白<script>標籤的舊瀏覽器。但是不是<!--夠了嗎?什麼是CDATA的東西?如果我不關心舊的瀏覽器,反正這些都已經過時了,對吧? (順便說一句,是否有人知道任何瀏覽器誰會弄糊塗,如果我不會把這個東西呢?)

然後我想知道函數的定義。爲什麼在那裏?爲什麼不直接調用代碼?它是不是垃圾郵件的全球命名空間?如果是這樣,那麼做起來不那麼容易,不太方便只需將代碼放入{}

回答

5

這是黑客攻擊的組合,他們之間:

  • 與瀏覽器應對來自前HTML介紹腳本元素(十年前)
  • 使用JavaScript,包括&,<和應對>在XHTML
  • 補償爲XHTML溶液當XHTML作爲HTML代替XHTML(即幾乎總是)
  • 從彼此
  • 干擾停止其他黑客處理

坦率地說,你可以(也應該)忘記瀏覽器不理解<script>(注意,這不是不支持JS,它意味着根本不識別該元素,因此將其視爲a <span>)。如果你這樣做並使用XHTML,那麼你可以使用前綴爲JS註釋的CDATA標誌(//)。

您通常應該避免使用XHTML。除非你正在處理一個堅持生成XHTML的服務器端系統,並且它更加努力地將其轉換爲HTML,那麼它將處理所有編寫HTML兼容XHTML的問題,然後XHTML幾乎是不值得的。

如果您不使用XHTML或關心瀏覽器甚至不說HTTP 1.1,那麼您只需要腳本標記和腳本,根本不需要任何包裝器。

在這個特殊的例子中,你不需要CDATA標誌 - 腳本不包含任何在XML中有特殊含義的字符,所以你不需要一條指令來把這些字符當作文本來代替標記。

+0

啊,'CDATA'是僅限XML(在這種情況下是XHTML),對不對?感謝你的回答。 – Albert 2010-08-14 19:42:48

+0

大胖子+1。 – 2010-08-14 19:57:07

2

CDATA在今天的HTML5天內沒有用處,並且(function() {...})()包裝代碼以使var聲明局部於該函數。
全局變量可能會導致與頁面上的其他代碼發生不必要的交互。

+0

我進入需要CDATA但不常見的情況。例如,一些CMS不喜歡js代碼,我可以通過將CMS嵌入到CDATA塊中來將JavaScript嵌入到CMS中。 – Chris 2010-08-14 19:40:22

1

被要求對於Netscape 1的評論的東西,因爲那裏在Netscape 2.所以呀......不是真的需要推出了腳本標記;

text="text/javascript" 

不需要或者,也許IE3或4) ,但腳本標籤的默認值總是javascript。

JavaScript範圍在JavaScript中不存在,只有全局和函數範圍,因此需要將代碼封裝在函數中並始終使用「var」聲明來防止全局污染。

(function(){}()); 

不能稱爲黑客了,這是一個完美的合法技術,雖然也許有點可怕,要注意外行。以下可能會被認爲更漂亮...

function init(){ 
    // code 
} 
init(); 

但是,然後你引入一個名爲'init'的全局函數。此外,大多數經驗豐富的JS程序員都熟悉,並認識到自我調用匿名函數模式,這是一個更有用的模式。

(function(global, doc, undefined){ 
    //code 
}(this, document)); 

所述「全局」變量現在是在窗口對象的引用,「文檔」變量現在是一個速記參考文件,和未定義未定義。爲什麼'未定義'參數?因爲有可能某個nitwit爲全局的'undefined'變量賦值......可能是多餘的,但是在編寫libs/frameworks/toolkits時,應該記住;)

+0

我習慣於匿名函數(在過去做了一些函數編程),語法有意義。它只會讓我感到困惑,沒有'{}'的局部變量作用域。 :) – Albert 2010-08-14 19:44:42