2012-03-01 6 views
0
다음

에 대한 참조를 반환하는 코드입니다. 내가 여기서하려고하는 것을 성취 할 수있는 방법이 있습니까?자바 스크립트

HTML :

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

자바 스크립트 : 자바 스크립트에서 불가능 필요 같은

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

this.items [sElmtId]에 대한 참조가되도록 obj를 만듭니다. 나중에 this.items [sElmtId]가 .bind()로 업데이트되면 obj는 this.items [sElmtId]와 동일한 DOM 요소를 가리 킵니다. ] 않습니다. –

+0

아, 이제 알겠습니다 ... –

+0

이 코드가 필요한 이유는 약간 복잡합니다. 더 큰 버전의 코드에는 DOM 요소를 인스턴스화하는 객체가 있습니다. 이러한 객체에 렌더링 책임이있는 DOM 요소를 가리키는 속성 (예 : this.dom_elmt)이 있어야합니다. 내가 IE6 호환성을 위해 쓰고 있기 때문에 사실 이후 DOM 참조를 만들려고하는 이유입니다. IE6에서 대형 페이지의 경우 메모리에서 DOM 조각을 구성하는 것이 너무 느립니다. 문자열로 HTML을 만들고, 함수가 종료 된 후 DOM에 삽입하고 나중에 DOM 요소에 대한 링크를 만들어야합니다. –

답변

2

당신의 문제는이 라인입니다.

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

그 방법은, obj.node 항상 현재 노드를 참조합니다 :

alert(obj.node.innerHTML); 

DEMO


사이드 노트 대신, 해당 개체의 속성에 노드를 할당해야 : 당신의 수수께끼 문제는 DOM이 아직 구축되지 않았을 때 (no wrap (head)) 코드를 실행하므로 #spantest을 찾을 수 없다는 것입니다. DOM이 준비되면 코드를 실행해야합니다 (no wrap (body), onDomRead 또는 onLoad).

+0

완벽한, 감사합니다 :) –

1

이 참조를 생성.

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); 

그러나 진정으로 "바운드"되지 않습니다 : 당신이 얻을 수있는 가장 가까운 것은 중첩 또는 닫힌 객체 또는 너무 좋아, 그것을 넘어서 복사하는 중입니다. 그런 종류의 기능이 필요하다면 중첩 된 객체를 사용해야하며, 아마도 구문 설탕의 요점을 무너 뜨릴 것입니다.

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

이 현재 DOM 노드와 this.items[sElmtId]에 할당 된 객체를 덮어 :

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