jQuery 多个选择器按 "this" 排序

jQuery multiple selectors order with "this"

'i' 和 'this' 的顺序很重要。第一个,图标被添加到按钮后面。第二个,图标添加在按钮之前。这是为什么?

示例 1:

$('.btn').click(function(){
    $('i', this).removeClass().addClass("icon-down");
})

示例 2:

$('.btn').click(function(){
    $(this, 'i').removeClass().addClass("icon-down");
})

很明显,您使用的这两种形式会产生不同的结果。

$('i', this)

此表单将查找作为 this 指向的元素的子元素的所有 <i> 元素。它在结构上等同于 $(this).find('i'),这是我首选的编写方式,因为我认为它更具可读性。

在 jQuery 文档中,此表单记录为 jQuery( selector [, context ] )


你的其他形式:

$(this, 'i')

并不是 jQuery 函数直接支持的选项,因为没有记录的选项采用 (element, string)。我将检查 jQuery 代码,但这很可能只是被解释为 $(element) 形式,因此将只是 $(this) 而第二个参数被忽略。此选项记录为 jQuery( element )。如果第一个参数是 DOM 元素,则第二个参数将被忽略。

因此,第一个选项找到子 <i> 元素。第二个选项只对按钮本身起作用。

编辑: 在查看 jQuery 源代码时,我已验证 $(this, 'i')$(this) 的处理方式相同。事实上,这是 jQuery 函数的操作部分:

init: function( selector, context, rootjQuery ) {
    if ( typeof selector === "string" ) {
        // handle selector string here    
        // ...

    // HANDLE: $(DOMElement)
    } else if ( selector.nodeType ) {
        this.context = this[0] = selector;
        this.length = 1;
        return this;
    }