这个JQuery代码发生了什么?

Iva*_*van 3 jquery

对不起,这个非常基本的JQuery问题.我创建了'mytest'jquery函数,如下所示:

jQuery.fn.mytest = function () {
    alert($(this).attr('id'))
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样称呼它,一切都很完美:

$("#someid").mytest();
Run Code Online (Sandbox Code Playgroud)

它警告"someid".但如果我做这样的事情:

$("#someid, #anotherid, #moreids").mytest();
Run Code Online (Sandbox Code Playgroud)

此功能仅警告"someid".当然存在"另一个"和"更多".

为什么mytest()不起作用,这个函数的正确代码是什么?

T.J*_*der 5

您的代码正在为jQuery添加一个"插件",使您的函数可用于jQuery实例.您在函数中只看到一个ID的原因是您正在使用attr,它只检索第一个元素的属性.(另外,你真的不需要attr得到一个id值.)

你的功能应该是这样的(实时拷贝):

jQuery.fn.mytest = function () {
    var ids = jQuery.map(this, function(elm) {
        return elm.id;
    });
    alert(ids.join(","));
};
Run Code Online (Sandbox Code Playgroud)

...显示id当前匹配集中每个元素的值(如果有).

或者你可以用一个简单的循环而不是jQuery.map(实时拷贝)来做:

jQuery.fn.mytest = function () {
    var ids, index, elm;

    ids = [];
    for (index = 0; index < this.length; ++index) {
        elm = this[index];
        if (elm.id) {
            ids.push(elm.id);
        }
    }
    alert(ids.join(","));
};
Run Code Online (Sandbox Code Playgroud)

另外,请注意,在jQuery插件函数中,this是当前的jQuery实例,因此您不需要(或希望)传递它$()来创建围绕元素的jQuery包装器(您在事件处理程序中执行此操作,而不是插件-INS).所以当我this.length在上面的第二个例子中,我正在使用length我们当前正在操作的jQuery实例的属性.当我this使用括号表示法(elm = this[index];)索引时,我正在索引到jQuery实例的匹配元素集(如get方法,但更直接).