2012-11-05 116 views
0

我知道,擴展DOM元素是一個不好的做法。但我想知道是否可以將方法注入名稱空間下的特定元素。以下示例顯示了我的意思。DOM注射命名空間

var element = document.getElementById('my-element'); 

var inject = function (element) { 
    var nameSpace = element.nameSpace = {}; 
    nameSpace.method1 = function() { 
     //do something 
    } 
    nameSpace.method2 = function() { 
     //do something 
    } 
} 

inject(element); 

這是可以接受的嗎?

+1

爲什麼需要這個?如果您想要將函數和一些數據與DOM元素關聯起來,那麼您總是可以編寫一個包裝器。 – Halcyon

+2

潛在名稱衝突實際上是不擴展DOM元素的原因之一 - 但不是唯一的原因。這裏有關於這個話題的[更多](http://perfectionkills.com/whats-wrong-with-extending-the-dom/)。 – raina77ow

+0

感謝您的鏈接。不過,我已經閱讀過。我問這是因爲這是添加其他方法和跨瀏覽器實現(如跨瀏覽器getElementByClassName)到單個元素的非常快速的方式。 –

回答

0

我不能肯定,延長元素是你在尋找什麼,但眼光來看待它增加聽衆的這些元素代碼的角度。

,你把這些處理,但是,是命名空間的好地方。

例如:

var myNS = {}; 
myNS.count = 0; 
myNS.method1 = function(){ 
    var out = document.getElementById("out"); 
    out.innerHTML = "Clicked " + myNS.count++ + " times!";   
}; 

window.onload = function(){ 
    var elem = document.getElementById('my-element'); 
    elem.addEventListener('click',myNS.method1, false); 
};​ 

(見本的jsfiddle爲例:http://jsfiddle.net/mori57/3CjEW/

+0

感謝您的回答,但我認爲您有點誤解了我。問題是關於元素中的命名空間,而不是元素外部的。 –

+0

嗯,這個問題我可以用這種方法看到,在上面的代碼概括,就是它只能是基於實例的......換句話說,只有一個元素將攜帶方法......這將是非常脆弱,如果需要隨着時間的推移調整標記結構,容易中斷並導致大量重新編碼。如果該元素被破壞,或被某些不允許非嚴格處理DOM元素的東西解析,那麼您的代碼已經損壞。 –

+0

我的不好。我試圖讓代碼儘可能簡單。我編輯它更像是在我的圖書館。理念是能夠根據需要注入儘可能多的元素,並且這些元素可以爲所有的方法提供所有的方法。 –