2012-03-01 7 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], поэтому, когда this.items [sElmtId] обновляется позже с помощью .bind(), obj затем укажет на тот же элемент DOM, что this.items [sElmtId ] делает. –

+0

А теперь я получил это ... –

+0

Причина необходимости этого кода немного сложна. В более крупной версии моего кода у меня есть объекты, которые создают экземпляры элементов DOM. Я хочу, чтобы эти объекты имели свойство (например, this.dom_elmt), которое указывает на элемент DOM, который они отвечали за рендеринг. Причина, по которой я пытаюсь создать ссылку DOM после факта, заключается в том, что я пишу для совместимости с IE6. Построение фрагментов DOM в памяти слишком медленное для больших страниц в IE6. Я должен создать HTML по строке, вставить в DOM после выхода функции и создать ссылку обратно на элемент DOM. –

ответ

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), onDomRead, либо onLoad.

+0

Отлично, спасибо :) –

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/

Смежные вопросы