我曾經讀到以下編碼技術被認爲是不好:的JavaScript與活動 - 最佳實踐
<a HREF="page.htm" onClick="alert('Hello World')">text link</a>
基本上,HTML標記中有這些事件處理程序(如的onClick)是使用錯誤的做法。這是什麼原因?這種叫做「壞」的技術是什麼?什麼是「正確」的方式來做到這一點?
我曾經讀到以下編碼技術被認爲是不好:的JavaScript與活動 - 最佳實踐
<a HREF="page.htm" onClick="alert('Hello World')">text link</a>
基本上,HTML標記中有這些事件處理程序(如的onClick)是使用錯誤的做法。這是什麼原因?這種叫做「壞」的技術是什麼?什麼是「正確」的方式來做到這一點?
這是一個內聯事件處理程序屬性。 (+1選擇答案)。它通常被認爲是「壞」的幾個原因:
你混合小塊JavaScript語法內聯與HTML語法:
當你有很多的這些,尤其是當你有很多元素都包含基本相同的代碼位,讀取和維護代碼更加困難;
你嵌套逃脫恐怖,當你需要在你的代碼中使用特殊到HTML字符:
例如:
<a href="x.html" onclick="this.innerHTML= '<em>I like "fish &amp; chips"</em>';">
性質的目標元素和所有祖先節點成爲變量,可能隱藏你自己的v同名的可變詞。請參閱this question瞭解這種令人驚訝且幾乎總是不需要的行爲的背景;
這引入了幽靈般的不兼容性,因爲瀏覽器具有不同的DOM屬性;
和未來的瀏覽器引入新的特性將有可能破壞你的代碼。
對官方術語不確定,但這不是好的做法,因爲HTML應該是純粹的標記,而不需要將客戶端腳本直接混入其中。
最好的做法是附接事件以這樣的方式:
window.onload = function() {
document.getElementById("MyLink").onclick = function() {
alert('Hello World');
return false;
}
}
賦予路段ID MyLink
例如後。
謝謝!我可以發誓,這是一個適當的名詞。我記得最好的是「舊式JavaScript」(但看起來不太合適)。 – StackOverflowNewbie
沒問題..看起來像馬塞爾找到了我們這個詞。 :) –
最好的方法被稱爲unobtrusive JavaScript,它基本上意味着行爲(JS)與結構(HTML)的分離,類似於CSS如何將結構與結構分開,也是出於同樣的原因。
幾個原因。它實質上是element.onclick
的DOM Level 1接口的別名,它只允許一個事件偵聽器。
另一個原因是它在哲學上是錯誤的。它導致組織不良的代碼:你將一種聲明性語言與一種功能性語言混合在一起,這種語言在其執行過程中包含了大量的邏輯。
的正確方法應該是:
element.addEventListener('click', function() {
console.log('hello world');
}, false); // required for old gecko
或者在IE中:
element.attachEvent('onclick', function() {
console.log('hello world');
});
或在非常至少,使用DOM 1級型號:
element.onclick = function() {
console.log('hello world');
};
(另外請注意,alert
是不好的做法,它會阻止en的執行輪胎頁。)
另一個原因是,您無法訪問任何通常會作爲偵聽器回調的第一個參數獲取的事件對象。 (當你設置[event]屬性時,你基本上在回調中,所以我不確定你是否可以做參數[0]或者不同的渲染引擎如何實現它。這非常尷尬,這就是爲什麼最好綁定事件在JS的土地上。)
我能想到的最終原因是跨瀏覽器的兼容性。如果您在HTML中綁定事件,則無法爲自己規範事件接口。
+1提的是「只允許一個事件偵聽器」 –
@chjj重新事件參數:在內嵌事件處理程序的屬性,你將會比僅編寫'event'得到事件實例。在IE中,這是有效的,因爲你得到全局'window.event';在其他瀏覽器中,它的工作原理是因爲在內聯代碼中創建了一個名稱爲「event」的局部變量,就好像您已經在其周圍寫入了「function(event){...}」一樣。這是不良的記錄,並最好避免(我相信在這裏IE行爲的差異是因爲MS本來不明白髮生了什麼應該被任何事情,只是引用'event'應該工作...) – bobince
@巴比恩,是的,我隱約記得那樣的事情。它絕對看起來像各種瀏覽器將實施不同(或根本不)的類型。幾乎不可靠。 – chjj
quirksmode.org稱他們爲*在線*事件處理程序。看看這些文章,爲事件處理程序提供一個非常全面的介紹:http://www.quirksmode.org/js/introevents.html。 –