Как я могу проверить существование элемента в jQuery?
Текущий код, который у меня есть, это:
if ($(selector).length > 0) {
// Do something
}
Есть ли более элегантный способ подойти к этому? Возможно, плагин или функция?
Как я могу проверить существование элемента в jQuery?
Текущий код, который у меня есть, это:
if ($(selector).length > 0) {
// Do something
}
Есть ли более элегантный способ подойти к этому? Возможно, плагин или функция?
Вам не нужно проверять, больше ли оно 0
, например $(selector).length > 0
, $(selector).length
, этого достаточно и это элегантный способ проверить наличие элементов. Я не думаю, что стоит написать функцию только для этого, если вы хотите сделать больше лишних вещей, да.
if($(selector).length){
// true if length is not 0
} else {
// false if length is 0
}
Используйте querySelectorAll
с forEach
, нет необходимости в if
и дополнительное назначение:
document.querySelectorAll('.my-element').forEach((element) => {
element.classList.add('new-class');
});
как противоположность:
const myElement = document.querySelector('.my-element');
if (myElement) {
element.classList.add('new-class');
}
Этот плагин можно использовать в операторе if
, например, if ($(ele).exist()) { /* DO WORK */ }
, или с помощью обратного вызова.
;;(function($) {
if (!$.exist) {
$.extend({
exist: function() {
var ele, cbmExist, cbmNotExist;
if (arguments.length) {
for (x in arguments) {
switch (typeof arguments[x]) {
case 'function':
if (typeof cbmExist == "undefined") cbmExist = arguments[x];
else cbmNotExist = arguments[x];
break;
case 'object':
if (arguments[x] instanceof jQuery) ele = arguments[x];
else {
var obj = arguments[x];
for (y in obj) {
if (typeof obj[y] == 'function') {
if (typeof cbmExist == "undefined") cbmExist = obj[y];
else cbmNotExist = obj[y];
}
if (typeof obj[y] == 'object' && obj[y] instanceof jQuery) ele = obj[y];
if (typeof obj[y] == 'string') ele = $(obj[y]);
}
}
break;
case 'string':
ele = $(arguments[x]);
break;
}
}
}
if (typeof cbmExist == 'function') {
var exist = ele.length > 0 ? true : false;
if (exist) {
return ele.each(function(i) { cbmExist.apply(this, [exist, ele, i]); });
}
else if (typeof cbmNotExist == 'function') {
cbmNotExist.apply(ele, [exist, ele]);
return ele;
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
return false;
}
});
$.fn.extend({
exist: function() {
var args = [$(this)];
if (arguments.length) for (x in arguments) args.push(arguments[x]);
return $.exist.apply($, args);
}
});
}
})(jQuery);
Вы можете указать один или два обратных вызова. Первый сработает, если элемент существует, второй сработает, если элемент не существует, а существует. Однако, если вы решите передать только одну функцию, она сработает только тогда, когда элемент существует. Таким образом, цепь умрет, если выбранный элемент не существует . Конечно, если она существует, первая функция сработает и цепочка продолжится.
Имейте в виду, что использование варианта обратного вызова помогает поддерживать цепочечность - элемент возвращается, и вы можете продолжить цепочку команд, как с любым другим методом jQuery!
if ($.exist('#eleID')) { /* DO WORK */ } // param as STRING
if ($.exist($('#eleID'))) { /* DO WORK */ } // param as jQuery OBJECT
if ($('#eleID').exist()) { /* DO WORK */ } // enduced on jQuery OBJECT
$.exist('#eleID', function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}, function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element DOES NOT EXIST */
})
$('#eleID').exist(function() { // enduced on jQuery OBJECT with CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
})
$.exist({ // param is OBJECT containing 2 key|value pairs: element = STRING, callback = METHOD
element: '#eleID',
callback: function() {
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}
})
Вы можете проверить наличие элемента или не использовать длину в сценарии Java. Если длина больше нуля, то элемент присутствует, если длина равна нулю, то элемента нет
// These by Id
if( $('#elementid').length > 0){
// Element is Present
}else{
// Element is not Present
}
// These by Class
if( $('.elementClass').length > 0){
// Element is Present
}else{
// Element is not Present
}
Вдохновленный ответом hiway Я придумал следующее:
$.fn.exists = function() {
return $.contains( document.documentElement, this[0] );
}
jQuery. Содержит , принимает два элемента DOM и проверяет, содержит ли первый элемент второй.
Использование document.documentElement
в качестве первого аргумента соответствует семантике метода exists
, когда мы хотим применить его исключительно для проверки существования элемента в текущем документе.
Ниже я собрал фрагмент, который сравнивает jQuery.exists()
с подходами $(sel)[0]
и $(sel).length
, которые оба возвращают значения truthy
для $(4)
, в то время как $(4).exists()
возвращает false
. В контексте проверки на наличие элемента в DOM это, кажется, желаемый результат .
$.fn.exists = function() {
return $.contains(document.documentElement, this[0]);
}
var testFuncs = [
function(jq) { return !!jq[0]; },
function(jq) { return !!jq.length; },
function(jq) { return jq.exists(); },
];
var inputs = [
["$()",$()],
["$(4)",$(4)],
["$('#idoexist')",$('#idoexist')],
["$('#idontexist')",$('#idontexist')]
];
for( var i = 0, l = inputs.length, tr, input; i < l; i++ ) {
input = inputs[i][1];
tr = "
"; $("table").append(tr); }
td { border: 1px solid black }
" + inputs[i][0] + " | " + testFuncs[0](input) + " | " + testFuncs[1](input) + " | " + testFuncs[2](input) + " |
Input | !!$(sel)[0] | !!$(sel).length | $(sel).exists() |
Самый быстрый и наиболее семантически понятный способ проверки существования на самом деле - использование простого JavaScript:
if (document.getElementById('element_id')) {
// Do something
}
Запись немного длиннее, чем альтернатива длины jQuery, но выполняется быстрее, поскольку это собственный метод JS.
И это лучше, чем альтернатива написания собственной функции jQuery. Эта альтернатива медленнее, по причинам, указанным @snover. Но это также создало бы у других программистов впечатление, что функция exist () является чем-то присущим jQuery. JavaScript будут / должны быть поняты другими, редактирующими ваш код, без увеличения долга знаний.
NB: обратите внимание на отсутствие символа # перед element_id (так как это обычный JS, а не jQuery).
Как насчет:
function exists(selector) {
return $(selector).length;
}
if (exists(selector)) {
// do something
}
Это очень минимально и избавляет вас от необходимости каждый раз заключать селектор в $()
.
Вот мой любимый метод exist
в jQuery
$.fn.exist = function(callback) {
return $(this).each(function () {
var target = $(this);
if (this.length > 0 && typeof callback === 'function') {
callback.call(target);
}
});
};
и другая версия, которая поддерживает обратный вызов, когда селектор не существует
$.fn.exist = function(onExist, onNotExist) {
return $(this).each(function() {
var target = $(this);
if (this.length > 0) {
if (typeof onExist === 'function') {
onExist.call(target);
}
} else {
if (typeof onNotExist === 'function') {
onNotExist.call(target);
}
}
});
};
Пример:
$('#foo .bar').exist(
function () {
// Stuff when '#foo .bar' exists
},
function () {
// Stuff when '#foo .bar' does not exist
}
);
$(selector).length && //Do something
Попробуйте проверить элемент DOM
на элемент
if (!!$(selector)[0]) // do stuff
это очень похоже на все ответы, но почему бы не использовать оператор !
дважды, чтобы вы могли получить логическое значение:
jQuery.fn.exists = function(){return !!this.length};
if ($(selector).exists()) {
// the element exists, now what?...
}
Вы можете использовать это:
jQuery.fn.extend({
exists: function() { return this.length }
});
if($(selector).exists()){/*do something*/}
Нет необходимости в jQuery. С простым JavaScript проще и семантически правильно проверить:
if(document.getElementById("myElement")) {
//Do something...
}
Если по какой-либо причине вы не хотите добавлять идентификатор к элементу, вы все равно можете использовать любой другой метод JavaScript, предназначенный для доступа к DOM.
jQuery действительно крутой, но не позволяйте чистому JavaScript падать в забвение. , ,
Да!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
Это в ответ на: подкаст Herding Code с Джеффом Этвудом
Вы можете использовать:
if ($(selector).is('*')) {
// Do something
}
маленький более элегантный, возможно.
Я обнаружил, что if ($(selector).length) {}
недостаточно. Это будет молча сломать ваше приложение, когда selector
является пустым объектом {}
.
var $target = $({});
console.log($target, $target.length);
// Console output:
// -------------------------------------
// [▼ Object ] 1
// ► __proto__: Object
Мое единственное предложение - выполнить дополнительную проверку для {}
.
if ($.isEmptyObject(selector) || !$(selector).length) {
throw new Error('Unable to work with the given selector.');
}
Я все еще ищу лучшее решение, хотя это немного тяжелый.
Редактировать: ВНИМАНИЕ! Это не работает в IE, когда selector
является строкой.
$.isEmptyObject('hello') // FALSE in Chrome and TRUE in IE
Нет необходимости в jQuery
if(document.querySelector('.a-class')) {
// do something
}
if ( $('#myDiv').size() > 0 ) { //do something }
size()
подсчитывает количество элементов, возвращаемых селектором
Я наткнулся на этот вопрос и хотел бы поделиться фрагментом кода, который я сейчас использую:
$.fn.exists = function(callback) {
var self = this;
var wrapper = (function(){
function notExists () {}
notExists.prototype.otherwise = function(fallback){
if (!self.length) {
fallback.call();
}
};
return new notExists;
})();
if(self.length) {
callback.call();
}
return wrapper;
}
А теперь я могу написать такой код -
$("#elem").exists(function(){
alert ("it exists");
}).otherwise(function(){
alert ("it doesn't exist");
});
Может показаться, что кода много, но при написании на CoffeeScript он довольно мал:
$.fn.exists = (callback) ->
exists = @length
callback.call() if exists
new class
otherwise: (fallback) ->
fallback.call() if not exists
Используйте следующий синтаксис, чтобы проверить, существует ли элемент на самом деле, используя jQuery.
let oElement = $(".myElementClass");
if(oElement[0]) {
// Do some jQuery operation here using oElement
}
else {
// Unable to fetch the object
}
Все ответы - , а не , работающий , пуленепробиваемый , чтобы проверить наличие элемента в jQuery. После многих лет кодирования только это решение не выдает никаких предупреждений о существовании или нет:
if($(selector).get(0)) { // Do stuff }
Или поручить вместо этого в начале вашей функции:
if(!$(selector).get(0)) return;
Объяснено
В этом случае вам не нужно иметь дело с нулем | проблемы нулевой длины. Это заставляет выбирать элемент, а не считать их.
Я использую это:
$.fn.ifExists = function(fn) {
if (this.length) {
$(fn(this));
}
};
$("#element").ifExists(
function($this){
$this.addClass('someClass').animate({marginTop:20},function(){alert('ok')});
}
);
Выполнять цепочку, только если существует элемент jQuery - http: // jsfiddle. net / andres_314 / vbNM3 / 2/
$("selector"
) дать объект, который имеет length
данных. Если в селекторе есть элементы, которые вы определили, вы получите их от объекта. Поэтому, если вы проверите его длину, вы уже можете найти, существует ли какой-либо элемент. В javascript 0 == false
также null == false
. Если вы не получите 0
, ваши коды будут работать.
if($("selector").length){
//code in the case
}
Вот полный пример различных ситуаций и способа проверить, существует ли элемент, используя direct, если на jQuery селектор может или не может работать, потому что он возвращает массив или элементы.
var a = null;
var b = []
var c = undefined ;
if(a) { console.log(" a exist")} else { console.log("a doesn't exit")}
// output: a doesn't exit
if(b) { console.log(" b exist")} else { console.log("b doesn't exit")}
// output: b exist
if(c) { console.log(" c exist")} else { console.log("c doesn't exit")}
// output: c doesn't exit
ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ
if($("#xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist
if($(".xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist
Попробуйте это.
, простые и , короткие и , используемые во всем проекте :
jQuery.fn.isExists=function(){return !!this[0];}; //jQuery Plugin
Использование:
console.log( $("element-selector").isExists() );
В JavaScript все «правдиво» или «ложно», а для чисел 0
(и NaN) означает false
, все остальное true
. Таким образом, вы могли бы написать:
if ($(selector).length)
Вам не нужна эта >0
часть.
Я вижу, что большинство ответов здесь не точны , как они должны быть, они проверяют длину элемента, это может быть хорошо во многих случаях, но не 100%, представьте, что вместо функции передается число, поэтому я создаю прототип функции которые проверяют все условия и возвращают ответ так, как должно быть:
$.fn.exists = $.fn.exists || function() {
return !!(this.length && (this[0] instanceof HTMLDocument || this[0] instanceof HTMLElement));
}
Это проверит длину и тип, теперь вы можете проверить это следующим образом:
$(1980).exists(); //return false
$([1,2,3]).exists(); //return false
$({name: 'stackoverflow', url: 'http://www.stackoverflow.com'}).exists(); //return false
$([{nodeName: 'foo'}]).exists() // returns false
$('div').exists(); //return true
$('.header').exists(); //return true
$(document).exists(); //return true
$('body').exists(); //return true
Проверка наличия элемента тщательно документирована на самом официальном сайте jQuery!
Используйте . length свойство коллекции jQuery, возвращенной вашим селектор:
if ($("#myDiv").length) { $("#myDiv").show(); }
Обратите внимание, что не всегда необходимо проверять, существует ли элемент. Следующий код покажет элемент, если он существует, и ничего не сделает (без ошибок), если нет:
$("#myDiv").show();
Простая служебная функция для идентификатора и селектора класса.
function exist(IdOrClassName, IsId) {
var elementExit = false;
if (IsId) {
elementExit= $("#" + "" + IdOrClassName + "").length ? true : false;
}
else {
elementExit = $("." + "" + IdOrClassName + "").length ? true : false;
}
return elementExit;
}
вызывая эту функцию, как показано ниже
$(document).ready(function () {
$("#btnCheck").click(function () {
//address is the id so IsId is true. if address is class then need to set IsId false
if (exist("address", true)) {
alert("exist");
}
else {
alert("not exist");
}
});
});
составляет $. содержит () что вы хотите?
jQuery. содержит (контейнер, содержится)
$. Метод contains () возвращает true, если элемент DOM, предоставленный вторым аргументом, является потомком элемента DOM, предоставленного первым аргументом, является ли он прямым потомком или вложенным более глубоко. В противном случае возвращается false. Поддерживаются только узлы элементов; если второй аргумент является узлом текста или комментария, $. Содержит () вернет ложь.
Примечание : Первый аргумент должен быть элементом DOM, а не объектом jQuery или обычным объектом JavaScript.
Вы можете использовать это:
// if element exists
if($('selector').length){ /* do something */ }
// if element does not exist
if(!$('selector').length){ /* do something */ }
Мне просто нравится использовать простой ванильный JavaScript для этого.
function isExists(selector){
return document.querySelectorAll(selector).length>0;
}
Да Лучший способ сделать это:
JQuery
:
if($("selector").length){
//code in the case
}
selector
может быть Element
ID
ИЛИ Element
Class
ИЛИ
Если вы не хотите использовать библиотеку jQuery
, вы можете добиться этого с помощью Core JavaScript
:
By JavaScript
:
if(document.getElementById("ElementID")) {
//Do something...
}
Вы можете сохранить несколько байтов, написав:
if ($(selector)[0]) { ... }
Это работает, потому что каждый объект jQuery также маскируется под массив, поэтому мы можем использовать оператор разыменования массива, чтобы получить первый элемент из массива . Возвращает undefined
, если в указанном индексе нет элемента.
Ввод не будет иметь значения, если он не существует. Попробуй это. , ,
if($(selector).val())
Причина, по которой все предыдущие ответы требуют параметра .length
, заключается в том, что они в основном используют селектор $()
jquery, который имеет querySelectorAll за занавесом (или они используют его напрямую). Этот метод довольно медленный, потому что ему нужно проанализировать все дерево DOM, отыскивая всех совпадений с этим селектором и заполняя ими массив.
Параметр ['length'] не нужен или не полезен, и код будет намного быстрее, если вместо этого вы напрямую используете document.querySelector(selector)
, поскольку он возвращает первый соответствующий элемент или ноль, если не найден.
function elementIfExists(selector){ //named this way on purpose, see below
return document.querySelector(selector);
}
/* usage: */
var myelement = elementIfExists("#myid") || myfallbackelement;
Однако этот метод оставляет нас с фактическим возвращаемым объектом; что хорошо, если он не будет сохраняться как переменная и использоваться повторно (таким образом, сохраняя ссылку, если мы забудем).
var myel=elementIfExists("#myid");
// now we are using a reference to the element which will linger after removal
myel.getParentNode.removeChild(myel);
console.log(elementIfExists("#myid")); /* null */
console.log(myel); /* giant table lingering around detached from document */
myel=null; /* now it can be garbage collected */
В некоторых случаях это может быть желательно. Может использоваться в цикле for следующим образом:
/* locally scoped myel gets garbage collected even with the break; */
for (var myel; myel = elementIfExist(sel); myel.getParentNode.removeChild(myel))
if (myel == myblacklistedel) break;
Если вам на самом деле не нужен элемент и вы хотите получить / сохранить только значение true / false, просто удвойте его! ! Это работает для обуви, которая развязана, так почему узел здесь?
function elementExists(selector){
return !!document.querySelector(selector);
}
/* usage: */
var hastables = elementExists("table"); /* will be true or false */
if (hastables){
/* insert css style sheet for our pretty tables */
}
setTimeOut(function (){if (hastables && !elementExists("#mytablecss"))
alert("bad table layouts");},3000);
Если вы использовали
jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }
Вы бы подразумевали, что сцепление было возможно, когда это не так.
Это было бы лучше:
jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
Кроме того, из часто задаваемых вопросов :
if ( $('#myDiv').length ) { /* Do something */ }
Вы также можете использовать следующее. Если в массиве объектов jQuery нет значений, то получение первого элемента в массиве вернет неопределенное значение.
if ( $('#myDiv')[0] ) { /* Do something */ }
У меня был случай, когда я хотел посмотреть, существует ли объект внутри другого, поэтому я добавил что-то в первый ответ, чтобы проверить селектор внутри селектора. ,
// Checks if an object exists.
// Usage:
//
// $(selector).exists()
//
// Or:
//
// $(selector).exists(anotherSelector);
jQuery.fn.exists = function(selector) {
return selector ? this.find(selector).length : this.length;
};