jQuery是否有“存在”功能?

Is there an "exists" function for jQuery?

提问人:Jake McGraw 提问时间:8/28/2008 最后编辑:RenéJake McGraw 更新时间:8/25/2023 访问量:862273

问:

如何检查jQuery中元素的存在?

我拥有的当前代码是这样的:

if ($(selector).length > 0) {
    // Do something
}

有没有更优雅的方法来解决这个问题?也许是一个插件或一个函数?

JavaScript jQuery

评论


答:

1430赞 Jake McGraw 8/28/2008 #1

是的!

jQuery.fn.exists = function(){ return this.length > 0; }

if ($(selector).exists()) {
    // Do something
}

这是对以下方面的回应:Jeff Atwood 的 Herding Code 播客

评论

261赞 vsync 11/24/2009
我只是写: if( $(selector).length ){ ... } 没有 '> 0'
377赞 C Snover 5/30/2010
该示例将属性查找(便宜!)替换为两个函数调用,这两个函数调用的成本要高得多,其中一个函数调用会重新创建您已经拥有的 jQuery 对象。$.fn.exists
222赞 Ben Zotto 8/3/2010
@redsquare:代码可读性是在jQuery上添加这种函数的最佳理由。有东西叫读起来很干净,而读起来是语义上不同的东西,即使语义与相同的结果一致。.exists.length
54赞 redsquare 8/3/2010
@quixoto,对不起,.length 是许多语言的标准,不需要包装。你还如何解释 .length?
158赞 Ben Zotto 8/3/2010
在我看来,从“大于零的列表长度”的概念到“我为其编写选择器的元素存在”的概念,这至少是一种逻辑上的间接。是的,它们在技术上是一回事,但概念抽象处于不同的层次。这导致一些人更喜欢更明确的指标,即使以一定的性能成本为代价。
74赞 Devon 9/18/2008 #2

您可以使用:

if ($(selector).is('*')) {
  // Do something
}

也许更优雅一点

评论

41赞 vsync 11/24/2009
对于这么简单的事情来说,这太过分了。参见 Tim Büthe 的答案
1赞 earnaz 9/17/2015
这是正确答案。'length' 方法存在一个问题,即它对任何数字都会给出误报,例如: $(666).length // 返回 1,但它不是一个有效的选择器
3赞 micropro.cz 2/23/2016
对于非常简单的任务来说,这是非常昂贵的。只要看看jquery实现,如果.is(),你就会看到它需要处理多少代码来回答这个简单的问题。此外,您到底想做什么并不明显,因此它与所讨论的解决方案相同或可能不那么优雅。
397赞 Jon Erickson 1/15/2009 #3

如果您使用

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 对象数组中没有值,则获取数组中的第一项将返回 undefined。

if ( $('#myDiv')[0] ) { /* Do something */ }

评论

24赞 Matthew Crumley 1/16/2009
已经有一些不可链接的方法,比如 attr 和 data 函数。不过,我确实明白你的意思,而且,就其价值而言,无论如何,我只是测试长度 > 0。
44赞 Ben Blank 9/8/2010
你到底为什么需要链接这个? 已经做了正确的事情......(即什么都没有)$(".missing").css("color", "red")
11赞 Mad_Hat 2/25/2009 #4
if ( $('#myDiv').size() > 0 ) { //do something }

size()计算选择器返回的元素数

评论

12赞 Ian 6/4/2013
@Furbeenator我不知道你从哪里得到你的信息,但只不过是返回.它被弃用是有原因的.size().length
1赞 Furbeenator 6/6/2013
您是对的,但是调用 ,作为一个属性,比函数调用 需要的开销略少。我的错。.length.size()
2760赞 Tim Büthe 2/26/2009 #5

在 JavaScript 中,一切都是“真实的”或“虚假的”,而对于数字来说,意味着 ,其他一切。所以你可以这样写:0falsetrue

if ($(selector).length)

你不需要那部分。>0

评论

63赞 Robert 6/30/2017
@abhirathore2006 如果使用 id 选择器并且元素不存在,则长度为 0,并且不会引发异常。
21赞 Robert 6/30/2017
有趣。NaN != false
21赞 Ismael Miguel 7/9/2017
@James那是因为和.[].toString() === [].join(',') === """" === ""
1赞 user1280483 11/29/2021
@Robert,那是因为 when 实际上是任何值。NaN != aa
0赞 Parzh from Ukraine 5/11/2022
NaN可能是,但绝对是假的,这是一件略有不同的事情!= falseNaN
148赞 Yanni 4/3/2011 #6

您可以使用以下命令:

// if element exists
if($('selector').length){ /* do something */ }

// if element does not exist
if(!$('selector').length){ /* do something */ }

评论

140赞 Th4t Guy 8/1/2014
难道你没有看到 Tim Büthe 比你早 2 年就已经给出了这个答案吗?
120赞 Jeremy W 8/5/2015
Pfft,Tim 从未展示过如何测试元素是否不存在。
58赞 amypellegrini 11/14/2011 #7

真的不需要jQuery。使用纯 JavaScript 可以更容易且语义正确:

if(document.getElementById("myElement")) {
    //Do something...
}

如果出于任何原因您不想将 id 放入元素,您仍然可以使用任何其他旨在访问 DOM 的 JavaScript 方法。

jQuery真的很酷,但不要让纯JavaScript被遗忘......

评论

5赞 amypellegrini 11/14/2011
我知道:它不会直接回答原始问题(要求 jquery 函数),但在这种情况下,答案将是“否”或“不是语义上正确的解决方案”。
115赞 Magne 1/11/2012 #8

检查存在的最快和最语义上自我解释的方法实际上是使用简单的:JavaScript

if (document.getElementById('element_id')) {
    // Do something
}

它的编写时间比 jQuery 长度替代方案要长一些,但由于它是原生 JS 方法,因此执行速度更快。

它比编写自己的函数要好。由于@snover所述的原因,这种选择速度较慢。但它也会给其他程序员留下这样的印象,即该函数是jQuery固有的。 会/应该被编辑你的代码的其他人理解,而不会增加知识债务。jQueryexists()JavaScript

铌:请注意,在之前缺少“#”(因为这是普通的 JS,而不是 )。element_idjQuery

评论

61赞 kikito 3/8/2012
完全不是一回事。JQuery 选择器可用于任何 CSS 规则 - 例如 .它可以返回多个元素。 无法开始接近这一点。$('#foo a.special')getElementById
35赞 Blue Skies 12/8/2013
@Noz行得通。无需jQuery。if(document.querySelector("#foo a.special"))
38赞 Blue Skies 12/8/2013
JS引擎中速度的论点只存在于那些没有jQuery就无法运行的人的脑海中,因为这是一个他们无法获胜的论点。
27赞 JustJohn 11/19/2014
还记得document.getElementById的美好时光吗?而且我总是忘记文件。并且无法弄清楚为什么它不起作用。而且我总是拼写错误,字符大小写错误。
42赞 Oleg 2/7/2012 #9

我发现是不够的。当是一个空对象时,它会默默地破坏你的应用程序。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

评论

13赞 nnnnnn 12/22/2014
你多久发现自己用一个空对象作为参数来调用?$()
0赞 Oleg 12/22/2014
@nnnnnn 实际上从来没有(我不再使用jQuery了)。但我想 3 年前我有一个案例,即公开一个 API,该 API 将接受一个选择器并返回该选择器的元素数。如果另一个开发人员传入一个空对象,它将错误地响应 1。
4赞 Uyghur Lives Matter 3/26/2015
你到底为什么要把一个空对象传递给?{}$()
9赞 Oleg 3/26/2015
@cpburnz你为什么问我?我只是一个 API 提供者......人们把各种愚蠢的东西传递给 API。
4赞 Joseph Gabriel 4/19/2016
刚刚注意到,@FagnerBrack引用的jquery问题线程在他发表评论后不久就更新了;看起来它毕竟不会消失。
20赞 jcreamer898 4/6/2012 #10

我有一个案例,我想看看一个对象是否存在于另一个对象中,所以我在第一个答案中添加了一些东西来检查选择器中的选择器。

// 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;
};
29赞 SJG 5/28/2012 #11
$(selector).length && //Do something

评论

21赞 Emile Bergeron 10/8/2016
我讨厌这些巧妙的方法来避免使用 where an 会以 2 个字节为代价提高可读性。ifif
0赞 5/23/2017
此外,缩小器将为您完成所有这些工作。&&
0赞 Tilak Madichetti 7/12/2020
哈哈,现在 8 年后,它在 React JS 😄 中很常见
16赞 andy_314 8/2/2012 #12

我正在使用这个:

    $.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/

71赞 22 revs, 6 users 64%SpYk3HH #13

此插件可以在类似 callback 的语句中使用,也可以使用回调。ifif ($(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);

jsFiddle

您可以指定一个或两个回调。如果元素存在,第一个将触发,如果元素不存在,第二个将触发。但是,如果选择仅传递一个函数,则仅当元素存在时才会触发该函数。因此,如果所选元素不存在,链将死亡。当然,如果它确实存在,第一个函数将触发,链将继续。

请记住,使用回调变体有助于保持可链接性 - 返回元素,您可以像使用任何其他 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    */
    }
})

评论

1赞 Chris Marisic 6/17/2016
在回调版本上,回调不应该实际传入对象作为参数吗?Has Items
58赞 王奕然 6/1/2013 #14

您可以使用以下命令:

jQuery.fn.extend({
    exists: function() { return this.length }
});

if($(selector).exists()){/*do something*/}
45赞 hiway 10/23/2013 #15

$.contains() 是你想要的吗?

jQuery.contains( container, contained )

如果第二个参数提供的 DOM 元素是第一个参数提供的 DOM 元素的后代,则该方法返回 true,无论它是直接子元素还是嵌套更深的元素。否则,它将返回 false。仅支持元素节点;如果第二个参数是 text 或 comment 节点,则将返回 false。$.contains()$.contains()

注意:第一个参数必须是 DOM 元素,而不是 jQuery 对象或纯 JavaScript 对象。

评论

4赞 6/4/2016
这不接受选择器,这意味着他必须选择它,这意味着他可以检查他的选择结果。
86赞 Salman A 1/18/2014 #16

您可以通过编写以下命令来节省几个字节:

if ($(selector)[0]) { ... }

这是有效的,因为每个 jQuery 对象也伪装成一个数组,所以我们可以使用数组取消引用运算符从数组中获取第一项。如果指定索引处没有项,则返回。undefined

评论

7赞 Salman A 7/21/2015
否,或两者都返回对象,对象是真实的,即使它们是空的。此示例应说明为什么这些函数不能按原样使用:jQuery.first()jQuery.eq(0)if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
19赞 MAX POWER 3/5/2014 #17

怎么样:

function exists(selector) {
    return $(selector).length;
}

if (exists(selector)) {
    // do something
}

它非常小,省去了您每次都不得不封闭选择器的麻烦。$()

评论

3赞 1j01 6/22/2015
这读作“如果存在的东西”,而不是“如果事物存在”,读作。此外,这不是jQuery的方式。if($("#thing").exists(){}
24赞 Eternal1 7/28/2014 #18

我偶然发现了这个问题,我想分享一段我目前使用的代码:

$.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

评论

9赞 SikoSoft 8/5/2014
我发现OP的原始方法不仅比这更简约,而且更优雅。当 OP 的方法较短并且不涉及回调时,编写这么多代码似乎有点矫枉过正。
0赞 Eternal1 8/5/2014
对于简单的情况 - 你是对的。但是对于在这两种情况下都涉及大量代码的更复杂的情况,我认为我的方法更好。
4赞 Jarvl 6/25/2016
在什么复杂情况下,这种方法会比简单的 if/else 语句更好?
48赞 technosaurus 8/12/2014 #19

前面所有答案都需要该参数的原因是,它们主要使用 jquery 的选择器,该选择器在窗帘后面有 querySelectorAll(或者他们直接使用它)。这种方法相当慢,因为它需要解析整个 DOM 树,查找与该选择器的所有匹配项,并用它们填充数组。.length$()

['length'] 参数不是必需的,也不是有用的,如果你直接使用,代码会快得多,因为它返回它匹配的第一个元素,如果没有找到,则返回 null。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;

如果你实际上不需要这个元素,只想得到/存储一个真/假,那就加倍吧!它适用于解开的鞋子,那么为什么要在这里打结呢?

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);
33赞 Santiago Hernández 5/4/2015 #20

这与所有答案都非常相似,但为什么不使用两次运算符,这样你就可以得到一个布尔值:!

jQuery.fn.exists = function(){return !!this.length};

if ($(selector).exists()) {
    // the element exists, now what?...
}

评论

2赞 5/23/2017
因为有时可以更有效率。Boolean(x)
45赞 Anurag Deokar 7/9/2015 #21

您可以在 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
}

评论

4赞 Pranav Labhe 8/22/2015
您不需要检查天气长度是否大于 0,if( $('#elementid').length ) { } 就足够了。
13赞 A1rPun 3/17/2016
你真的读过这个问题吗?这与OP使用的方法完全相同。
29赞 guest271314 8/9/2015 #22

尝试测试元素DOM

if (!!$(selector)[0]) // do stuff
28赞 Oliver 10/14/2015 #23

受到海威回答的启发,我想出了以下几点:

$.fn.exists = function() {
    return $.contains( document.documentElement, this[0] );
}

jQuery.contains 接受两个 DOM 元素,并检查第一个元素是否包含第二个元素。

当我们只想应用它来检查当前文档中元素的存在时,使用作为第一个参数可以满足方法的语义。document.documentElementexists

下面,我整理了一个片段,将 和 方法进行了比较,这两种方法都返回 while 返回的值。在检查 DOM 中是否存在元素的上下文中,这似乎是期望的结果jQuery.exists()$(sel)[0]$(sel).lengthtruthy$(4)$(4).exists()false

$.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 = "<tr><td>" + inputs[i][0] + "</td><td>"
          + testFuncs[0](input) + "</td><td>"
          + testFuncs[1](input) + "</td><td>"
          + testFuncs[2](input) + "</td></tr>";
    $("table").append(tr);
  }
td { border: 1px solid black }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="idoexist">#idoexist</div>
<table style>
<tr>
  <td>Input</td><td>!!$(sel)[0]</td><td>!!$(sel).length</td><td>$(sel).exists()</td>
</tr>
</table>
<script>
  
  $.fn.exists = function() {
    return $.contains(document.documentElement, this[0]); 
  }
  
</script>

15赞 ducdhm 3/9/2016 #24

这是我在jQuery中最喜欢的方法exist

$.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
    }
);
16赞 Kamuran Sönecek 3/25/2016 #25

$("selector") 返回一个具有该属性的对象。如果选择器找到任何元素,它们将包含在对象中。因此,如果你检查它的长度,你可以看到是否存在任何元素。在 JavaScript 中,所以如果你没有得到你的代码将运行。length0 == false0

if($("selector").length){
   //code in the case
} 

评论

5赞 Quentin 4/27/2016
“给出一个数组”——不,它没有。它给你一个jQuery对象(它与数组共享一些属性)。你的答案与2009年的Tim Büthe的答案基本相同。
26赞 Sanu Uthaiah Bollera 6/19/2016 #26

我只是喜欢使用普通的 javascript 来做到这一点。

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}
11赞 Sunil Kumar 7/26/2016 #27

有 最好的方法:

由:JQuery

if($("selector").length){
   //code in the case
}

selector可以是 ORElementIDElement Class

如果你不想使用库,那么你可以通过使用 Core 来实现这一点:jQueryJavaScript

由:JavaScript

if(document.getElementById("ElementID")) {
    //Do something...
}

评论

0赞 Star 8/10/2017
如果“ElementID”不存在,那么它不会在if条件中抛出错误吗?
13赞 abhirathore2006 7/31/2016 #28

以下是不同情况的完整示例,以及使用直接 if on 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

演示

console.log("existing id", $('#id-1').length)
console.log("non existing id", $('#id-2').length)

console.log("existing class single instance", $('.cls-1').length)
console.log("existing class multiple instance", $('.cls-2').length)
console.log("non existing class", $('.cls-3').length)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="id-1">
  <div class="cls-1 cls-2"></div>
  <div class="cls-2"></div>
</div>

评论

0赞 Béranger 9/9/2016
您可以在调试器中尝试 $(“#xysyxxs”),您会看到 jquery 不会返回 null 或 undefined。所以最终的解决方案是行不通的
-1赞 Jonathan Cardoz 8/23/2016 #29

使用以下语法通过 jQuery 检查元素是否实际存在。

let oElement = $(".myElementClass");
if(oElement[0]) {
    // Do some jQuery operation here using oElement
}
else {
    // Unable to fetch the object
}
33赞 Pawel 11/28/2016 #30

无需jQuery(基本解决方案)

if(document.querySelector('.a-class')) {
  // do something
}

下面性能更高的选项(注意前面缺少一个点)。a-class

if(document.getElementsByClassName('a-class')[0]) {
  // do something
}

querySelector使用适当的匹配引擎,如jQuery中的(嘶嘶声),并使用更多的计算能力,但在99%的情况下会做得很好。第二个选项更明确,并确切地告诉代码要做什么。根据 JSBench 的说法,它要快得多 https://jsbench.me/65l2up3t8i$()

38赞 Tilak Madichetti 3/22/2017 #31

检查元素是否存在被整齐地记录在jQuery官方网站本身中!

使用 jQuery 集合的 .length 属性,该集合由 选择器:

if ($("#myDiv").length) {
    $("#myDiv").show();
}

请注意,并不总是需要测试元素是否存在。 以下代码将显示该元素(如果存在),并且不执行任何操作 (没有错误)如果它没有:

$("#myDiv").show();
70赞 Alireza 5/20/2017 #32

我看到这里的大多数答案都不准确,它们检查元素长度,在许多情况下可以,但不是 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
15赞 Andrei Todorut 6/20/2017 #33

你不必检查它是否大于 like,这就足够了,并且是一种检查元素存在的优雅方式。我不认为只为此写一个函数是值得的,如果你想做更多额外的事情,那么是的。0$(selector).length > 0$(selector).length

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
6赞 sina_Islam 10/16/2017 #34

用于 id 和类选择器的简单实用程序函数。

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");
    }
  });
});

评论

4赞 Roland 11/14/2017
这样你就把它放在全局命名空间中。您可能需要重新考虑。
5赞 Jonas Lundman 3/17/2018 #35

所有答案都无法检查jQuery中元素的存在。经过多年的编码,只有这个解决方案不会抛出任何关于存在与否的警告:

if($(selector).get(0)) { // Do stuff }

或者在函数开始时保释:

if(!$(selector).get(0)) return;

解释

在这种情况下,您不必处理零 |null 长度问题。这强制获取元素,而不是计算它们。

0赞 Manish Vadher 8/16/2018 #36

如果输入不存在,则该输入将没有值。试试这个...

if($(selector).val())
12赞 Hassan Sadeghi 8/18/2018 #37

试试这个。

简单短小可在整个项目中使用

jQuery.fn.exists=function(){return !!this[0];}; //jQuery Plugin

用法:

console.log($("element-selector").exists());

_________________________________

甚至更短: (当您不想定义jQuery插件时):

if(!!$("elem-selector")[0]) ...;

甚至

if($("elem-selector")[0]) ...;
-2赞 Rafal Enden 8/24/2018 #38

与 一起使用,无需额外分配:querySelectorAllforEachif

document.querySelectorAll('.my-element').forEach((element) => {
  element.classList.add('new-class');
});

与以下相反:

const myElement = document.querySelector('.my-element');
if (myElement) {
  element.classList.add('new-class');
}
5赞 Abdul Rahman 12/19/2018 #39

我正在使用这个:

 if($("#element").length > 0){
   //the element exists in the page, you can do the rest....
 }

它非常简单易行,很容易找到一个元素。

评论

3赞 faintsignal 1/12/2019
您的回答不会向已发布的内容添加任何新信息。这只是已接受答案中信息的一个子集。
6赞 Majedur 12/20/2018 #40

只需检查选择器的长度,如果它大于 0,则返回 true,否则返回 false。

对于ID:

 if( $('#selector').length )         // use this if you are using id to check
{
     // it exists
}

对于班级:

 if( $('.selector').length )         // use this if you are using class to check
{
     // it exists
}

对于下拉列表:

if( $('#selector option').size() ) {   // use this if you are using dropdown size to check

   // it exists
}
2赞 chickens 10/18/2019 #41

使用jQuery,您不需要,这就是您所需要的:>0

if ($(selector).length)

使用 vanilla JS,您可以执行相同的操作:

if(document.querySelector(selector))

如果你想把它变成一个返回bool的函数:

const exists = selector => !!document.querySelector(selector);

if(exists(selector)){
  // some code
}
5赞 Amit Sharma 3/11/2020 #42

默认情况下 - 否。

该属性通常用于以下方式获得相同的结果:length

if ($(selector).length)

在这里,“选择器”将被替换为您有兴趣查找的实际选择器,如果它存在与否。如果它确实存在,length 属性将输出一个大于 0 的整数,因此该语句将变为 true,从而执行 if 块。如果没有,它将输出整数“0”,因此 if 块不会被执行。if

评论

1赞 Amit Sharma 3/11/2020
当然,还有其他优雅的方法可以获得相同的结果,但这是最简单和最有效的方法之一
3赞 Greedo 9/23/2020 #43

我发现这是最jQuery的方式,恕我直言。 扩展默认函数很容易,可以在全局扩展文件中完成。

$.fn.exist = function(){
  return !!this.length;
};

console.log($("#yes").exist())

console.log($("#no").exist())
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="yes">id = yes</div>

1赞 Gareth Compton 2/4/2021 #44

有一种奇怪的现象称为短路调节。没有多少人知道这个功能,所以请允许我解释一下!<3

//you can check if it isnt defined or if its falsy by using OR
console.log( $(selector) || 'this value doesnt exist' )

//or run the selector if its true, and ONLY true
console.log( $(selector) && 'this selector is defined, now lemme do somethin!' )

//sometimes I do the following, and see how similar it is to SWITCH
console.log(
({  //return something only if its in the method name
    'string':'THIS is a string',
    'function':'THIS is a function',
    'number':'THIS is a number',
    'boolean':'THIS is a boolean'
})[typeof $(selector)]||
//skips to this value if object above is undefined
'typeof THIS is not defined in your search')

最后一点允许我查看我的 typeof 具有什么样的输入,并在该列表中运行。如果列表之外有值,我会使用运算符跳过和取消。这与 具有相同的性能,并且被认为有些简洁。测试条件的性能和逻辑运算符的用法。OR (||)Switch Case

旁注:对象函数有点必须重写>.<' 但是我构建的这个测试是为了研究简洁和富有表现力的条件反射。

资源:逻辑 AND(带短路评估)

评论

1赞 bfontaine 3/19/2021
使用此功能的人并不多,因为它使代码更难阅读和维护。另外,请注意,最后一部分与开关不同,因为所有表达式都会执行而不仅仅是您关心的表达式。
1赞 Geoff 6/29/2021
您的示例不适用于 JQuery,因为即使选择器应用到的元素不存在,JQuery 仍将创建一个对象,其中包含一个空集合,该对象确实存在。$(selector)[0] 将起作用。
2赞 Haroon Fayyaz 12/5/2021 #45

感谢您分享这个问题。首先,有多种方法可以检查它。 如果要检查 中是否存在元素。为此,您可以尝试以下方法。HTMLDOM

  1. 使用选择器:在 DOM 中选择元素 by ,您应该提供以前缀开头的 id 名称。您必须确保 DOM 中的每个 Html 元素都必须具有唯一的 .Idid(#)id
  2. 使用选择器:您可以使用前缀 选择属于特定类的所有元素。class(.)

现在,如果你想检查元素在 DOM 中是否存在,你可以使用以下代码来检查它。

if($("#myId").length){
   //id selector
} 

if($(".myClass").length){
   //class selector
} 

如果要检查任何变量是否未定义。您可以使用以下代码进行检查。

let x
if(x)
  console.log("X");
else
  console.log("X is not defined");

7赞 Vishwesh Chotaliya 12/6/2021 #46

在 Javascript 中

if (typeof selector !== "undefined") {
   console.log("selector exists");
} else {
   console.log("selector does not exists");
}

在jQuery中

if($('selector').length){
    alert("selector exists");
} else{
    alert("selector does not exists");
}
1赞 Vladislav Ladický 8/27/2022 #47

不,没有这样的方法。但是你可以为自己的jQuery扩展jQuery。目前(2022 年)的做法是:

jQuery.fn.extend({
  exists() { return !!this.length }
});