jQuery是否存在“存在”功能?

javascript jquery

696741 观看

30回复

33102 作者的声誉

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

我当前的代码是这样的:

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

有更优雅的方式来解决这个问题吗?也许是插件或功能?

作者: Jake McGraw 的来源 发布者: 2008 年 8 月 27 日

回应 (30)


1298

33102 作者的声誉

是!

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

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

这是对Jeff Atwood的Herding Code播客的回应

作者: Jake McGraw 发布者: 27.08.2008 07:50

56

4444 作者的声誉

您可以使用:

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

一个更优雅,也许。

作者: Devon 发布者: 17.09.2008 05:53

349

76561 作者的声誉

如果你用过

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

你会暗示链接是可能的,但事实并非如此。

这会更好:

jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }

或者,从FAQ

if ( $('#myDiv').length ) { /* Do something */ }

您还可以使用以下内容。如果jQuery对象数组中没有值,那么获取数组中的第一个项将返回undefined。

if ( $('#myDiv')[0] ) { /* Do something */ }
作者: Jon Erickson 发布者: 14.01.2009 07:46

2240

48051 作者的声誉

决定

在JavaScript中,一切都是'真实'或'虚假',而数字0(和NaN)意味着false,其他一切true。所以你可以写:

if ($(selector).length)

你不需要那个>0部分。

作者: Tim Büthe 发布者: 25.02.2009 07:16

121

2167 作者的声誉

你可以用这个:

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

// if element does not exist
if(!$('selector').length){ /* do something */ }
作者: Yanni 发布者: 03.04.2011 12:17

50

919 作者的声誉

真的不需要jQuery。使用纯JavaScript,检查以下内容更容易,语义更正确:

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

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

jQuery非常酷,但不要让纯粹的JavaScript被遗忘......

作者: amypellegrini 发布者: 14.11.2011 02:20

86

10848 作者的声誉

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

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

写入比jQuery长度替换要长一些,但执行速度更快,因为它是本机JS方法。

它比编写自己的jQuery函数更好。由于@snover说的原因,这种替代方案较慢。但它也会给其他程序员一种印象,即exists()函数是jQuery固有的东西。JavaScript编辑代码的其他人应该/应该理解,而不会增加知识债务。

注意:注意之前缺少'#' element_id(因为这是普通的JS,不是jQuery)。

作者: Magne 发布者: 11.01.2012 12:27

34

7524 作者的声誉

我发现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.');
}

我仍在寻找更好的解决方案,因为这个有点重。

编辑:警告!selector字符串时,这在IE中不起作用。

$.isEmptyObject('hello') // FALSE in Chrome and TRUE in IE
作者: Oleg 发布者: 06.02.2012 08:37

18

6458 作者的声誉

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

// 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;
};
作者: jcreamer898 发布者: 05.04.2012 09:02

26

1623 作者的声誉

$(selector).length && //Do something
作者: SJG 发布者: 28.05.2012 12:58

14

329 作者的声誉

我正在使用这个:

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

作者: andy_314 发布者: 01.08.2012 09:56

56

19276 作者的声誉

此插件可以在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);

的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    */
    }
})
作者: SpYk3HH 发布者: 09.11.2012 05:47

46

1690 作者的声誉

你可以用这个:

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

if($(selector).exists()){/*do something*/}
作者: Amitābha 发布者: 01.06.2013 07:20

33

2022 作者的声誉

$.contains()你想要的是什么?

jQuery.contains( container, contained )

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

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

作者: hiway 发布者: 23.10.2013 05:46

62

182534 作者的声誉

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

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

这工作,因为每一个jQuery对象也伪装成一个数组,所以我们可以使用数组语法运营商从一开始的第一个项目阵列undefined如果指定索引处没有项目,则返回。

作者: Salman A 发布者: 18.01.2014 09:04

17

1623 作者的声誉

怎么样:

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

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

它非常小,可以节省您$()每次都必须包含选择器。

作者: GSTAR 发布者: 04.03.2014 09:15

19

4006 作者的声誉

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

$.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
作者: Eternal1 发布者: 28.07.2014 10:50

40

6030 作者的声誉

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

['length']参数不是必需的或有用的,如果直接使用代码将会快得多document.querySelector(selector),因为它返回匹配的第一个元素,如果没有找到则返回null。

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);
作者: technosaurus 发布者: 11.08.2014 11:42

26

3086 作者的声誉

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

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

if ($(selector).exists()) {
    // the element exists, now what?...
}
作者: Santiago Hernández 发布者: 04.05.2015 03:31

32

676 作者的声誉

您可以使用java脚本中的长度来检查元素是否存在。如果length大于零,则如果length为零则存在元素,则元素不存在

// 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
}
作者: Anurag Deokar 发布者: 09.07.2015 12:39

24

1 作者的声誉

尝试测试DOM元素

if (!!$(selector)[0]) // do stuff
作者: guest271314 发布者: 09.08.2015 02:55

23

6738 作者的声誉

受到hiway回答的启发,我提出了以下建议:

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

jQuery.contains接受两个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 = "<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>

作者: Oliver 发布者: 13.10.2015 08:01

12

1686 作者的声誉

这是我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
    }
);
作者: ducdhm 发布者: 08.03.2016 05:06

13

1895 作者的声誉

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

if($("selector").length){
   //code in the case
} 
作者: Kamuran Sönecek 发布者: 25.03.2016 11:05

22

676 作者的声誉

我只想使用普通的香草javascript来做到这一点。

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}
作者: Sanu Uthaiah Bollera 发布者: 18.06.2016 10:37

9

2222 作者的声誉

下面是不同情况的完整示例以及检查元素是否存在的方法如果使用direct 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
作者: abhirathore2006 发布者: 31.07.2016 06:42

21

5864 作者的声誉

不需要jQuery

if(document.querySelector('.a-class')) {
  // do something
}
作者: Pawel 发布者: 28.11.2016 10:43

29

1503 作者的声誉

在官方jQuery网站上整齐地记录检查元素是否存在

使用选择器返回的jQuery集合的.length属性:

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

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

$("#myDiv").show();
作者: Tilak Maddy 发布者: 22.03.2017 02:32

52

49996 作者的声誉

我看到大部分的答案在这里是不准确的,因为他们应该是,他们检查元素长度,也可以是确定在许多情况下,但不是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
作者: Alireza 发布者: 20.05.2017 09:21

10

2149 作者的声誉

您不必检查它是否大于0喜欢$(selector).length > 0$(selector).length这是不够的和优雅的方式来检查元素的存在。如果你想做更多额外的事情,我认为仅仅为此编写一个函数是值得的,是的。

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
作者: Andrei Todorut 发布者: 20.06.2017 09:43
32x32