【问题标题】:Not clear on this jQuery syntax: return !$()不清楚这个 jQuery 语法:return !$()
【发布时间】:2011-11-22 07:49:20
【问题描述】:

我看到了这段代码,但我不清楚 '!' 在这行 jQuery 代码中对 jQuery 对象的返回做了什么:

$('#remove').click(function() {
    return !$('#select2 option:selected').appendTo('#select1');
});

编辑

什么是这样做的好案例?

【问题讨论】:

    标签: boolean-logic logical-operators jquery


    【解决方案1】:

    它将$('#select2 option:selected').appendTo('#select1') 的结果转换为布尔值,并将其取反。

    但是,由于appendTo 的结果总是一个jQuery 对象,并且一个对象(jQuery 与否)总是真实的,!$('#select2 option:selected').appendTo('#select1') 的结果是总是 false。

    所以我们所拥有的是有效的:

    $('#remove').click(function() {
        $('#select2 option:selected').appendTo('#select1');
    
        return false;
    });
    

    在 jQuery 事件处理程序中返回 false 将停止发生的默认事件操作(例如提交表单/导航超链接)并且停止事件在 DOM 树上的任何进一步传播.

    所以我们所拥有的是有效的:

    $('#remove').click(function(e) {
        $('#select2 option:selected').appendTo('#select1');
    
        e.preventDefault();
        e.stopPropagation();
    });
    

    使用return false 代替e.preventDefault(); e.stopPropagation(); 是可以的,但是在第一个示例中使用return !$(..) 作为快捷方式是荒谬的,并且没有 需要去做吧。

    重申一下我的观点,这里最重要的一点是,从来没有一个很好的理由/案例来做这件事。

    链接:

    1. Docs for bind()click() 的别名)
    2. Docs for preventDefault()
    3. Docs for stopPropagation()

    【讨论】:

    • 他们如何转换它,因为它返回一个 jQuery 对象,通常是 DOM 元素的集合? // 感谢编辑
    • @Matt - 谢谢。我应该问后续问题,你为什么要这样做?
    • 他们可能试图否定标准浏览器操作。在 jQuery 中返回 false 是错误的方法;相反,您应该使用preventDefault()。 (编辑:马特用他的编辑打败了我:))。
    • @Mark:我希望我的编辑回答了你的问题。 (该死的 StackOverflow 不允许您在每个评论中“@”多个用户)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多