jQuery 是否有“存在”功能?

问:

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

我目前的代码是这样的:

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

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

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

在 JavaScript 中,一切都是“真”或“假”,对于数字 0 意味着 false,其他一切都是 true。所以你可以写:

if ($(selector).length)

您不需要那个 >0 部分。

@abhirathore2006 如果您使用 id 选择器并且该元素不存在,则长度为 0 并且不会引发异常。

有趣的是NaN != false。

@James 那是因为 [].toString() === [].join(',') === "" 和 "" === ""。

@Robert,那是因为 NaN != a 当 a 字面上 是任何值。

NaN 可能是 != false,但 NaN 肯定是 falsy,这是一个稍微不同的东西

答2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

是的!

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

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

这是为了回应:Herding Code podcast with Jeff Atwood

我只是写: if( $(selector).length ){ ... } 没有'> 0'

$.fn.exists 示例用两个函数调用替换属性查找(便宜!),这要昂贵得多,其中一个函数调用重新创建了一个您已经拥有的 jQuery 对象。

@redsquare:代码可读性是在 jQuery 上添加此类功能的最佳理由。有一个叫做 .exists 的东西读起来很干净,而 .length 读起来是语义上不同的东西,即使语义与相同的结果一致。

@quixoto,对不起,但是 .length 是许多不需要包装的语言的标准。你怎么解释.length?

在我看来,从“大于零的列表长度”的概念到“我为存在的选择器编写的元素”的概念至少是一种逻辑间接。是的,它们在技术上是相同的,但概念抽象处于不同的层次。这导致一些人更喜欢更明确的指标,即使有一些性能成本。

答3:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如果你用过

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

你会暗示链接是可能的,而不是。

这会更好:

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

或者,from the FAQ:

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

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

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

已经有一些不可链接的方法,例如 attr 和 data 函数。不过,我确实明白你的观点,而且,不管怎样,我只是测试长度 > 0。

为什么你需要把它锁起来? $(".missing").css("color", "red") 已经做了正确的事……(即什么都没有)

答4:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

你可以使用这个:

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

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

您没有看到 Tim Büthe 在您之前 2 年就已经给出了这个 answer 吗?

Pfft,Tim 从未展示过如何测试元素是否不存在。

答5:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

它比 jQuery 长度替代方法要长一些,但由于它是原生 JS 方法,所以执行速度更快。

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

注意:请注意 element_id 之前缺少一个“#”(因为这是纯 JS,而不是 jQuery)。

完全不是一回事。 JQuery 选择器可用于任何 CSS 规则 - 例如 $('#foo a.special')。它可以返回多个元素。 getElementById 无法解决这个问题。

@Noz if(document.querySelector("#foo a.special")) 会工作。不需要 jQuery。

JS 引擎中关于速度的论点只在没有 jQuery 就无法运行的人的脑海中消失,因为这是他们无法取胜的论点。

还记得 document.getElementById 是我们仅有的美好时光吗?我总是忘记文件。并且无法弄清楚为什么它不起作用。而且我总是拼写错误并且字符大小写错误。

答6:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

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

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

不,jQuery.first() 或 jQuery.eq(0) 都返回对象,对象是真实的,即使它们是空的。此示例应说明为什么不能按原样使用这些函数:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")

答7:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

您可以使用:

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

也许更优雅一点。

对于这么简单的事情,这太过分了。见 Tim Büthe 答案

这是正确的答案。 'length' 方法的问题是它对任何数字都给出误报,例如: $(666).length // 返回 1,但它不是有效的选择器

这对于非常简单的任务来说是非常昂贵的。只需查看 jquery 实现 if .is() ,您就会看到它需要处理多少代码才能回答您这个简单的问题。此外,您想要做什么并不明显,因此它与所讨论的解决方案相同或可能不太优雅。

答8:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

此插件可用于 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    */
    }
})

在回调版本中,Has Items 回调实际上不应该将对象作为参数传递吗?

答9:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

我看到这里的大多数答案都不准确,他们检查元素长度,在很多情况下都可以,但不是 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

答10:

huntsbot.com – 高效赚钱,自由工作

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

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

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

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

我知道:它不会直接回答原始问题(它要求使用 jquery 函数),但在这种情况下,答案将是“否”或“不是语义正确的解决方案”。

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

你可以使用这个:

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

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

原文链接:https://www.huntsbot.com/qa/8KkX/is-there-an-exists-function-for-jquery?lang=zh_CN&from=csdn

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值