Должен ли я проверить класс перед добавлением или удалением его в прототипе? - PullRequest
0 голосов
/ 02 октября 2010

У меня есть строка кода в JavaScript с использованием прототипа, которая запускается несколько раз в секунду.Эта строка кода, в зависимости от состояния некоторых переменных, будет гарантировать, что определенный элемент имеет или не имеет класс.

Мой вопрос заключается в том, должен ли я добавлять или удалять класс вслепую или сначала проверять его?Должен ли я иметь этот код:

if (!element.hasClassName("overtime")) {
  element.addClassName("overtime");
}
if (element2.hasClassName("overtime")) {
  element2.removeClassName("overtime");
}

или это просто иметь:

element.addClassName("overtime");
element2.removeClassName("overtime");

Я считаю, что добавление и удаление могут быть более дорогими методами, даже если изменение происходиточень быстрый, может изменить DOM, что приведет к ошибкам или усугублению утечки памяти или чего-то в этом роде.

1 Ответ

2 голосов
/ 02 октября 2010

Используйте второй.

Проверяя код прототипа, вы можете увидеть, что:

  • addClassName уже проверяет существование
  • и hasClassName, и removeClassName используют один RegExp для поиска или замены, поэтомуТам нет никакой пользы

Код:

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!Element.hasClassName(element, className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },
...