Проверка javascript, если существует элемент DOM

Как лучше проверить, существует ли элемент DOM в javascript?

Следует ли проверять, существует ли элемент до его использования, например?

if ($("#" + machineId + packageId.removeSpecialChars().toUpperCase() + "").size() != 0) {
  var row = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + "");
}

не будет ли это выполнять packageId.removeSpecialChars().toUpperCase() дважды?

ИЛИ это будет лучшим вариантом?

var row = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + ""); 
if (row)
{
  // do something
}

Однако, не выбрасывал бы исключение, если не нашел?

Ответ 1

Когда вы на самом деле работаете с элементами DOM, тогда да, вы должны убедиться, что он существует, прежде чем пытаться работать с ним, чтобы избежать ошибок JavaScript. Однако вы работаете не с элементами DOM, вы работаете с объектом jQuery, который (потенциально) содержит элементы DOM.

Функции jQuery уже обрабатывают случаи, когда в наборе элементов нет совпадений, поэтому вам не нужно явно проверять, есть ли элементы, прежде чем пытаться работать с ними. Вам нужно будет сделать это только в том случае, если вы пытаетесь напрямую ссылаться на элементы DOM внутри этого набора, используя функцию .get() или обозначение квадратной скобки [index].

В стороне, функция .size() jQuery устарела в версии 1.8, вы должны напрямую использовать свойство jQuery object length, чтобы проверить, есть ли элементы, поэтому:

var $object = $('a-selector');
if($object.length) {
    // there at least one matching element
}

Ответ 2

Общие правила программирования говорят, что не повторяйте себя. Итак, в этом случае вы могли бы, по крайней мере, сделать вывод об этом только один раз и сохранить переменную ссылку:

var thing = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + "");

Затем поиск выбора не происходит дважды, удаленные вызовы метода удаляются и т.д. Это также позволяет вам писать более понятный код, если вы можете назвать переменную чем-то значимым, кроме thing, или eeek!, a (хотя не обязательно, чтобы код был более значимым, люди все еще используют такие имена, как a!)

if (thing != null) { }
if (thing.size() != 0) {

} 
etc.

Что касается вызовов методов несколько раз, что часто неизбежно.

Ответ 3

Лучше кэшировать его:

var machId = $("#" + machineId + packageId.removeSpecialChars().toUpperCase());
if (machId.size() != 0) {
   var row = machId;
}

Ответ 4

Он делает, что вам нужно:

var a = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + "");
if (a.size()) {
    var row = a;
}

Ответ 5

Вам в основном нужно выяснить, существует ли элемент DOM в вашем HTML, но пиво в виду, что jQuery не бросает фатальную ошибку, если элемент не существует в вашей DOM, но будет хорошей проверкой, он добавляет еще один защищенный слой на вашем коде, было что-то названное .size(), которое устарело от версии 1.8, поэтому не рекомендуется использовать даже вы используете старую версию jQuery, поэтому лучшим решением на данный момент будет что-то вроде кода ниже:/p >

if($('.class').length) { // check if any element with this class exist, if not exist, it return 0 and can not pass the if estatement
    // do something
}