2012-03-01 62 views
0

這裏一提的是代碼:返回在JavaScript

http://jsfiddle.net/GKBfL/

我試圖讓collection.prototype.add返回一個引用,使得最終的警報將顯示testing, testing, 123, testing。有沒有辦法完成我在這裏要做的事情?

HTML:

<span id="spantest">testing, testing, 123, testing</span>​ 

的JavaScript:

var collection = function() { 
    this.items = {}; 
} 

collection.prototype.add = function(sElmtId) { 
    this.items[sElmtId] = {}; 
    return this.items[sElmtId]; 
} 

collection.prototype.bind = function() { 
    for (var sElmtId in this.items) { 
     this.items[sElmtId] = document.getElementById(sElmtId); 
    } 
} 
var col = new collection(); 
var obj = {}; 
obj = col.add('spantest'); 
col.bind(); 
alert(obj.innerHTML);​ 
+0

我希望obj是對this.items [sElmtId]的引用,因此當稍後使用.bind()更新this.items [sElmtId]時,obj將指向與this.items [sElmtId相同的DOM元素]的確如此。 – 2012-03-01 23:33:25

+0

啊現在我明白了...... – 2012-03-01 23:34:27

+0

需要此代碼的原因有點複雜。在我的代碼的更大版本中,我有實例化DOM元素的對象。我希望這些對象具有指向它們負責渲染的DOM元素的屬性(例如,this.dom_elmt)。之所以我試圖在事實之後創建DOM引用的原因是因爲我正在編寫IE6兼容性。在內存中構建DOM片段對於IE6中的大頁面來說太慢了。我必須通過字符串創建HTML,在函數退出後插入到DOM中,然後創建鏈接返回到DOM元素。 – 2012-03-01 23:36:24

回答

2

您的問題是這一行:

this.items[sElmtId] = document.getElementById(sElmtId); 

這將覆蓋當前分配給this.items[sElmtId]與DOM節點的對象。相反,你應該節點分配給對象的屬性:

this.items[sElmtId].node = document.getElementById(sElmtId); 

這樣,obj.node總是引用當前節點:

alert(obj.node.innerHTML); 

DEMO


旁註:你的小提琴的問題還在於,當DOM尚未建成時(no wrap (head)),你執行代碼,所以它找不到#spantest。 DOM準備就緒後,您必須運行代碼,即no wrap (body)onDomReadonLoad

+0

完美,謝謝:) – 2012-03-01 23:42:42

1

創建一個基準像你需要在JavaScript中是不可能的。你可以得到的最接近的事或者是一個嵌套或封閉的對象或者直接複製過來,像這樣:

var collection = function() { 
    this.items = {}; 
}; 

collection.prototype.add = function(sElmtId) { 
    return this.items[sElmtId] = {}; 
}; 

collection.prototype.bind = function() { 
    for(var sElmtId in this.items) { 
     var element = document.getElementById(sElmtId); 

     for(var x in element) { 
      this.items[sElmtId][x] = element[x]; 
     } 
    } 
}; 

var col = new collection(); 

var obj = {}; 

obj = col.add('spantest'); 
col.bind(); 

alert(obj.innerHTML); 

但它不會是真正的「綁定」。如果你需要這種功能,你將不得不使用嵌套對象,它可能會打敗你的語法糖。

http://jsfiddle.net/GKBfL/7/