Подтвердить что ты не робот

JQuery - проверка наличия элементов

Хорошо, поэтому в основном мне нужно проверить, есть ли в моем меню #Container какие-либо элементы третьего уровня (h3, если быть точным), и если да, дайте им некоторый атрибут. Если этот атрибут не присвоен второму элементу уровня (h2), который всегда существует. Есть:

if ($('h3')) {
  //some attribute
} else {
 //some attribute
};

правильный метод?

4b9b3361

Ответ 1

Используйте .length для этого, это 0/false, если нет совпадений:

if ($('h3').length) {
 //some attribute
} else {
 //some attribute
};

Краткая версия, менее читаемая:

$($('h3').length ? 'h3' : 'h2').addClass("bob");

Ответ 2

.....

if ($('#Container h3').length) {
  //some attribute
} else {
 //some attribute
};

Ответ 3

Проверьте длину возвращаемого объекта jQuery

if ($('h3').length != 0)) {
    $('h3').attr(...);
}
else {
    $('h2').attr(...);
}

Ответ 4

Чтобы сделать его более читаемым, я предлагаю эту настройку:

var h3ElementsExist = $('h3').length
if (h3ElementsExist) {
  //some attribute
} else {
 //some attribute
};

Ответ 5

Я только что понял ответ, который я отправил на эту функцию, простой способ добавить плагин jQuery для этого был удален давно. Зачем? Я не знаю.

В заключение, ele.length прост, но не очень изящный, если учесть фундаментальные недостатки. Он не поддерживает разметку стиля jQuery, которая может повредить читаемость, а также заставить это в выражении "если", когда это действительно "появляется", как что-то, что jQuery должно обрабатывать "естественно". Так оно и есть. Если все ваши действия направлены на применение "атрибута" к существующему элементу, вы можете просто сделать вызов без инструкции if. Если элемент существует, он получит новый атрибут. Если он не существует, он ничего не повредит и не сделает ничего, кроме продолжения.

Например:

$('#Container h3').css('background', 'red');

Это приведет к тому, что любые существующие теги H3 внутри элемента id'd будут иметь Container фон red, если они существуют. Если они не существуют, этот код, по сути, будет проигнорирован. Однако, если вы хотите сделать больше и поддерживать jQuery "цепочки", а также поддерживать разметку стиля jQuery, я бы предложил плагин, который я написал, который добавляет $.exist() в jQuery.

Он позволяет использовать различные способы вызова с параметром для обратных вызовов. Проще говоря, вы можете использовать его в выражении if, таком как if ($('h3').exist() {, или вы можете создать от 1 до 2 методов обратного вызова. Методы обратного вызова являются чистыми и простыми. Если подано только 1 (или просто первый метод обратного вызова), это метод обратного вызова существует. Другими словами, если элемент существует, он загорается, а затем возвращает элемент (ы), сохраняя при этом jQuery "chainability". Однако, если он не существует, ничего не произойдет, если не будет предоставлен второй метод обратного вызова. Затем он будет запускать ваш второй метод обратного вызова, как и "else" вышеупомянутого оператора if.

Некоторые примеры здесь:

$('#Container h3').exist(function(boolTrue, elements, indexPerEach) { /* DO WORK */ });

с двумя обратными вызовами

$('#Container h3').exist(function(boolTrue, elements, indexPerEach) { /* DO WORK */ },
function(boolFalse, elements) { /* Elements did NOT EXIST - DO WORK */ });

См. еще один пример и получите уменьшенную версию плагина HERE

/*---PULIGIN---*/
;;(function($){$.exist||($.extend({exist:function(){var a,c,d;if(arguments.length)for(x in arguments)switch(typeof arguments[x]){case "function":"undefined"==typeof c?c=arguments[x]:d=arguments[x];break;case "object":if(arguments[x]instanceof jQuery)a=arguments[x];else{var b=arguments[x];for(y in b)"function"==typeof b[y]&&("undefined"==typeof c?c=b[y]:d=b[y]),"object"==typeof b[y]&&b[y]instanceof jQuery&&(a=b[y]),"string"==typeof b[y]&&(a=$(b[y]))}break;case "string":a=$(arguments[x])}if("function"==typeof c){var e=0<a.length?!0:!1;if(e)return a.each(function(b){c.apply(this,[e,a,b])});if("function"==typeof d)return d.apply(a,[e,a]),a}return 1>=a.length?0<a.length?!0:!1:a.length}}),$.fn.extend({exist:function(){var a=[$(this)];if(arguments.length)for(x in arguments)a.push(arguments[x]);return $.exist.apply($,a)}}))})(jQuery);
/*---PULIGIN---*/

Подробнее об этом вы найдете на другом ответе HERE

Ответ 6

Проверьте размер или длину возвращаемого объекта jQuery

if ($('h3').size() != 0)) {
    $('h3').attr(...);
}
else {
    $('h2').attr(...);
}

или

if ($('h3').length != 0)) {
    $('h3').attr(...);
}
else {
    $('h2').attr(...);
}