пятница, 15 июля 2011 г.

jQuery. Проверить существование элемента на странице

Для того, чтобы проверить существует или нет заданный элемент, можно использовать 2 способа. В основе всего, лежит тот факт, что jQuery селекторы возвращают массив и мы можем искать его длину. Даже если найден только 1 элемент (когда мы конкретный элемент ищем) то размер ответа будет равен 1.

Способ первый - стандартный:
if($("#findID").length>0) {
  // exists
}
//еще проще:
if($("#findID").length) {
  // exists
}
// Еще вариант:
if($('#findID')[0]) {
 // exists
}

Способ второй - удобный (создадим пользовательскую функцию exists() ):
// Один раз объявляем функцию, потом используем так, как в примере
jQuery.fn.exists = function() {
   return $(this).length;
}
// Пример использования:
if($("#findID").exists()) {
   // exists
}

Можно и так:
jQuery.exists = function(selector) {
   return ($(selector).length > 0);
}

// Пример использования:
if ($.exists(selector)) {
  // exists
}

20 комментариев:

  1. if ($("input").is("#id_question"))
    .is() вроде специально для такой проверки и создан

    ОтветитьУдалить
    Ответы
    1. is() проверяет много чего, он как ругулярка проходит по атрибутам узла, но мне кажется, что .length сработает быстрее, так как это уже есть установленное свойство, которое достаточно только вычитать, а is() будет выполнять поиск по заданному условию в рамках атрибута узла - что будет явно медленнее.

      Реализация метода is() в jQuery 1.7:
      is: function( selector ) {
      return !!selector && (
      typeof selector === "string" ?
      POS.test( selector ) ?
      jQuery( selector, this.context ).index( this[0] ) >= 0 :
      jQuery.filter( selector, this ).length > 0 :
      this.filter( selector ).length > 0 );
      }

      Где POS.test(selector) - регулярное выражение, которое ВСЕГДА выполняется если задан селектор.

      Само регулярное выражение:
      POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/

      я думаю что $("#id").length сработает быстрее ;)

      Удалить
  2. Спасибо, очень помогли функции! :)

    ОтветитьУдалить
  3. вы только плодите сущности добавляя ненужные методы, что мешает просто писать:
    if($(...).size()){
    ...
    }else{
    ...
    }

    ОтветитьУдалить
    Ответы
    1. ничего не мешает, реализация метода size() в jquery 1.8.2:
      size: function() { return this.length; }

      Уж лучше:
      if($("#findID").length) { .... }

      Удалить
  4. А как проверить существование элемента с двумя классами? Например, если существует блок, у которого class="myClass1 current" тогда что-либо делать.

    ОтветитьУдалить
  5. if($('.myClass1').hasClass('current)) {
    // существует ..
    }

    ОтветитьУдалить
    Ответы
    1. если есть возможность добавить класс то да, а если там id то нет

      Удалить
  6. Думаю что следующая инструкция более быстрее и надежнее будет.

    if($("#findID").length) {
    // exists
    }

    ОтветитьУдалить
  7. спасибо бро. ты настоящий бро!

    ОтветитьУдалить
  8. Спасибо! Долго искал как проверить элемент на существование

    ОтветитьУдалить
  9. Спасибо. Ваши советы помогли решить мою задачу.

    ОтветитьУдалить
  10. А как проверить существование элемента на странице, которого не было до её загрузки, который был добавлен на страницу средствами JQuery или JavaScript?

    ОтветитьУдалить
    Ответы
    1. точно также, главное функция проверки должна быть вызвана после вставки. Если есть большой кусок чужого когда который это делает синхронно, то можно проверку выполнить в нулевом setTimeout(()=>{ if($("#findID").length) {
      ...
      }
      },0);

      Удалить