Answers:
在JavaScript中,一切都是“真实的”或“虚假的”,对于数字0
(和NaN)意味着false
其他一切true
。所以你可以这样写:
if ($(selector).length)
您不需要那>0
部分。
NaN != false
。
[] + []
= ""
...啊,我爱JavaScript
[].toString() === [].join(',') === ""
和"" === ""
。
typeof NaN == 'number'
是!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
这是为了响应:与Jeff Atwood一起进行的“ 牧群代码”播客
$.fn.exists
示例用两个函数调用替换了一个属性查找(便宜!),这两个函数调用要昂贵得多,而其中一个函数调用会重新创建您已经拥有的jQuery对象,这很愚蠢。
.exists
内容.length
也会清晰地读取,而在语义上却是不同的。
如果你用过
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对象数组中没有值,则获取数组中的第一项将返回未定义。
if ( $('#myDiv')[0] ) { /* Do something */ }
$(".missing").css("color", "red")
已经做了正确的事……(即什么也没做)
$.fn
方法返回的不是新的jQuery对象,因此不链接。
您可以使用此:
// 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
)。
$('#foo a.special')
。它可以返回多个元素。getElementById
无法开始解决这个问题。
if(document.querySelector("#foo a.special"))
会工作。无需jQuery。
您可以通过写一些字节来节省:
if ($(selector)[0]) { ... }
之所以可行,是因为每个jQuery对象也都伪装成一个数组,因此我们可以使用数组解引用运算符从array中获取第一项。undefined
如果指定索引处没有任何项目,则返回。
jQuery.first()
或者jQuery.eq(0)
两者都返回对象,即使它们是空的,它们也是真实的。此示例应说明为什么不能按原样使用这些功能:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
仅返回截断长度为1或0的另一个jQuery对象。这.first()
只是的便捷方法.eq(0)
。但是.get(0)
返回第一个DOM元素或undefined
和与相同[0]
。jQuery对象中的第一个DOM元素以名称存储在常规对象属性中'0'
。这是一个简单的属性访问。唯一的类型转换源于数字0
到字符串的隐式转换'0'
。因此,如果类型转换存在问题,则可以$.find(selector)['0']
改用。
您可以使用:
if ($(selector).is('*')) {
// Do something
}
一个小更优雅,也许。
666
的原因可能还有很多其他原因,导致代码损坏。虽然它是无效的选择器,但$(666).length 是有效的javascript:它的计算结果为真实,因此应满足条件。
$.find(666).length
。
可以在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 */
}
})
Has Items
回调实际上不应该将对象作为参数传递吗?
我看到大部分的答案在这里是不准确的,因为他们应该是,他们检查元素长度,也可以是确定在许多情况下,但不是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被遗忘...
:has()
怎么办?
前面所有答案都需要该.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;
如果您实际上并不需要该元素,并且只想获取/存储一个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);
是$.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脚本中的长度来检查元素是否存在。如果长度大于零,则元素存在;如果长度为零,则元素不存在
// 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.fn.exists = function(){return !!this.length};
if ($(selector).exists()) {
// the element exists, now what?...
}
$.fn.exists = function() {
return $.contains( document.documentElement, this[0] );
}
jQuery.contains接受两个DOM元素,并检查第一个元素是否包含第二个DOM元素。
当我们只想将其document.documentElement
用作exists
检查当前文档中某个元素的存在时,使用作为第一个参数满足该方法的语义。
下面,我已经放在一起进行比较的一个片段jQuery.exists()
反对$(sel)[0]
和$(sel).length
接近,两者均返回truthy
的值$(4)
,而$(4).exists()
回报false
。在检查 DOM中元素是否存在的情况下,这似乎是期望的结果。
不需要jQuery(基本解决方案)
if(document.querySelector('.a-class')) {
// do something
}
下面有更多性能选项(请注意,A级之前没有点号)。
if(document.getElementsByClassName('a-class')[0]) {
// do something
}
querySelector在jQuery中使用适当的匹配引擎,例如$()(嘶嘶声),并使用更多的计算能力,但在99%的情况下就可以了。第二个选项更明确,并告诉代码确切的操作。根据jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25的描述,它要快得多
我只是喜欢用普通的javascript来做到这一点。
function isExists(selector){
return document.querySelectorAll(selector).length>0;
}
我偶然发现了这个问题,我想分享一下我当前使用的代码片段:
$.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
}
这非常少,省去了$()
每次都要封装选择器的麻烦。
if($("#thing").exists(){}
。而且,这不是jQuery的方式。
我正在使用这个:
$.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
}
这是不同情况的完整示例,以及在jQuery选择器上使用直接if来检查元素是否存在的方法,因为它可以返回数组或元素,因此可能会或可能不会起作用。
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
like $(selector).length > 0
,$(selector).length
这足够了并且是一种优雅的方法来检查元素的存在。我不认为仅为此编写函数是不值得的,如果您想做更多的事情,是的。
if($(selector).length){
// true if length is not 0
} else {
// false if length is 0
}