2009-04-16 4 views
6

В конкретном скрипте, который я пишу, у меня есть несколько объектов, которые связаны с некоторыми элементами DOM. Учитывая, что каждый элемент имеет уникальный идентификатор, должен ли каждый объект хранить только идентификатор элемента (и каждый раз использовать document.getElementById) или хранить элемент в свойстве?Хранение ссылок на элементы DOM

Вот упрощенный пример того, что я имею в виду:

function myThing(elId) { 
    this.elId = elId; 
} 
myThing.prototype.getElValue = function() { 
    return document.getElementById(this.elId).nodeValue; 
}; 

// -- vs -- // 

function myThing(elId) { 
    this.el = document.getElementById(elId); 
} 
mything.prototype.getElValue = function() { 
    return this.el.nodeValue; 
}; 

ли какая-нибудь разница? Есть ли проблемы с производительностью, о которых я должен знать?

ответ

4

Я бы сохранил элемент; он, как правило, делает код более четким, когда вы не вызываете document.getElementById все время, и хотя в вашем случае вам может не понадобиться изменять идентификаторы или разрешать элементы без идентификаторов, довольно часто это нужно делать.

(В отличие от apphacker я бы не ожидал огромных повышения эффективности от этого, поскольку getElementById имеет тенденцию быть довольно хорошо оптимизирован в браузерах.)

Есть ли какие-либо проблемы с производительностью я должен знать?

Ссылки с объектов JavaScript на объекты DOM прекрасно само по себе, но когда объект DOM имеет ссылку на такой объект JavaScript (обычно через обработчик событий), у вас есть ссылочный цикл. Это заставляет IE6-7 течь память, поскольку она не освобождает циклические объекты. Для небольших простых приложений вам может быть безразлично. Для сложных, долговременных приложений вам, возможно, придется обойти эту проблему, например, путем косвенного использования каждого обработчика событий через карту/массив поиска, поэтому нет прямой ссылки с объекта DOM на обработчик реального события.

3

Сохраните элемент, а не идентификатор, поиск медленный и дорогой и сэкономит вам вызов функции. Я думаю, что простой тест подтвердит это.

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