如何在jQuery中检查元素的存在?
我当前的代码是这样的:
if ($(selector).length > 0) { // Do something }
有更优雅的方式来解决这个问题吗?也许是插件或功能?
在JavaScript中,一切都是'真实'或'虚假',而数字0
(和NaN)意味着false
,其他一切true
.所以你可以写:
if ($(selector).length)
你不需要那个>0
部分.
是!
jQuery.fn.exists = function(){ return this.length > 0; } if ($(selector).exists()) { // Do something }
这是对Jeff Atwood的Herding Code播客的回应
如果你用过
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 */ }
你可以用这个:
// if element exists if($('selector').length){ /* do something */ }
// if element does not exist if(!$('selector').length){ /* do something */ }
检查存在的最快和最语义的自我解释方法实际上是使用plain JavaScript
:
if (document.getElementById('element_id')) { // Do something }
写入比jQuery长度替换要长一些,但执行速度更快,因为它是本机JS方法.
它比编写自己的jQuery
函数更好.由于@snover的原因,这种替代方案较慢.但它也会给其他程序员一种印象,即exists()
函数是jQuery固有的东西.JavaScript
编辑代码的其他人应该/应该理解,而不会增加知识债务.
注意:注意之前缺少'#' element_id
(因为这是普通的JS,不是jQuery
).
您可以通过编写来节省几个字节:
if ($(selector)[0]) { ... }
这工作,因为每一个jQuery对象也伪装成一个数组,所以我们可以使用数组语法运营商从一开始的第一个项目阵列.undefined
如果指定索引处没有项目,则返回.
您可以使用:
if ($(selector).is('*')) { // Do something }
一个小更优雅,也许.
此插件可以在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 */ } })
我看到大部分的答案在这里是不准确的,因为他们应该是,他们检查元素长度,也可以是确定在许多情况下,但不是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.使用纯JavaScript,检查以下内容更容易,语义更正确:
if(document.getElementById("myElement")) { //Do something... }
如果由于任何原因您不想将id放入元素,您仍然可以使用任何其他用于访问DOM的JavaScript方法.
jQuery非常酷,但不要让纯粹的JavaScript被遗忘......
你可以用这个:
jQuery.fn.extend({ exists: function() { return this.length } }); if($(selector).exists()){/*do something*/}
所有以前的答案都需要.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);
$.contains()
你想要的是什么?
jQuery.contains( container, contained )
$.contains()
如果第二个参数提供的DOM元素是第一个参数提供的DOM元素的后代,则该方法返回true,无论它是直接子节点还是嵌套更深.否则,它返回false.仅支持元素节点; 如果第二个参数是文本或注释节点,$.contains()
则返回false.注意:第一个参数必须是DOM元素,而不是jQuery对象或纯JavaScript对象.
我发现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
您可以使用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 }
在官方jQuery网站上整齐地记录检查元素是否存在!
使用选择器返回的jQuery集合的.length属性:
if ($("#myDiv").length) { $("#myDiv").show(); }请注意,并不总是需要测试元素是否存在.以下代码将显示该元素是否存在,如果不存在则不执行任何操作(没有错误):
$("#myDiv").show();
这与所有答案非常相似,但为什么不使用!
运算符两次,这样你就可以得到一个布尔值:
jQuery.fn.exists = function(){return !!this.length}; if ($(selector).exists()) { // the element exists, now what?... }
$(selector).length && //Do something
尝试测试DOM
元素
if (!!$(selector)[0]) // do stuff
受到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 = "" + inputs[i][0] + " "
+ testFuncs[0](input) + " "
+ testFuncs[1](input) + " "
+ testFuncs[2](input) + " ";
$("table").append(tr);
}
td { border: 1px solid black }
#idoexist
Input !!$(sel)[0] !!$(sel).length $(sel).exists()
我只想使用普通的香草javascript来做到这一点.
function isExists(selector){ return document.querySelectorAll(selector).length>0; }
不需要jQuery
if(document.querySelector('.a-class')) { // do something }
我偶然发现了这个问题,我想分享一下我目前使用的代码片段:
$.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
我有一个案例,我想看看一个对象是否存在于另一个内部,所以我在第一个答案中添加了一些内容来检查选择器内的选择器.
// 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; };
怎么样:
function exists(selector) { return $(selector).length; } if (exists(selector)) { // do something }
它非常小,可以节省您$()
每次都必须包含选择器.
我正在使用这个:
$.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/
这是我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
属性的对象.如果选择器找到任何元素,它们将包含在对象中.因此,如果检查其长度,您可以查看是否存在任何元素.在JavaScript中0 == false
,所以如果你没有得到0
你的代码就会运行.
if($("selector").length){ //code in the case }
下面是不同情况的完整示例以及检查元素是否存在的方法如果使用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
您不必检查它是否大于0
喜欢$(selector).length > 0
,$(selector).length
这是不够的和优雅的方式来检查元素的存在.如果你想做更多额外的事情,我认为仅仅为此编写一个函数是值得的,是的.
if($(selector).length){ // true if length is not 0 } else { // false if length is 0 }
if ( $('#myDiv').size() > 0 ) { //do something }
size()
计算选择器返回的元素数
是这样做的最佳方法:
通过JQuery
:
if($("selector").length){ //code in the case }
selector
可以是Element
ID
ORElement
Class
要么
如果您不想使用jQuery
Library,则可以使用Core实现此目的JavaScript
:
通过JavaScript
:
if(document.getElementById("ElementID")) { //Do something... }
试试这个.
简单,简洁,可在整个项目中使用:
jQuery.fn.exists=function(){return !!this[0];}; //jQuery Plugin
用法:
console.log($("element-selector").exists());
_________________________________
或者甚至是SHORTER :( 当你不想定义一个jQuery插件时):
if(!!$("elem-selector")[0]) ...;
甚至
if($("elem-selector")[0]) ...;
一个简单的实用程序函数,用于id和class选择器。
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"); } }); });