jQuery - equivalent to each(), but for a single el

2019-01-23 11:16发布

问题:

What's the jQuery equivalent for each():

$(".element").each(function(){  
  // do stuff
});

when attaching a function to a single element, like #element ?

回答1:

You can always reference the jQuery object in a variable:

var $el = $('#element');

...then manipulate it.

$el.doSomething();          // call some jQuery methods from the cached object
$el.doSomethingElse();

If the reason you wanted .each() was to reference the DOM element as this, you don't really need the this keyword to do it, you can simply grab the DOM element out of the jQuery object.

var element = $('#element')[0];       // both of these give you the DOM element
var element = $('#element').get(0);   //        at index 0

The two of these are equivalent, and will retrieve the DOM element that would be referenced as this in the .each().

alert( element.tagName );  // alert the tagName property of the DOM element
alert( element.id );       // alert the ID property of the DOM element

I'd note that it isn't necessarily bad to use each to iterate over a single element.

The benefits are that you have easy access to the DOM element, and you can do so in a new scope so you don't clutter the surrounding namespace with variables.

There are other ways to accomplish this as well. Take this example:

(function( $ ) {

    // Inside here, "this" will refer to the DOM element,
    //    and the "$" parameter, will reference the jQuery library.

    alert( this.tagName );

    // Any variables you create inside will not pollute the surrounding 
    //     namespace.

    var someVariable = 'somevalue'; // is local to this function

}).call( $('#element')[0], jQuery );


回答2:

To directly answer your question, .each() operates normally on element sets of any size including 1.

You can also omit the .each() call completely and just call jQuery methods on $('#element'). Remember that you can chain most if not all jQuery method calls as they return the jQuery object. This even works on multiple elements for the matter, depending on what the methods do.

$('#element').doSomething().doSomethingElse();

If you need to reference the object multiple times, make a variable:

var $elm = $('#element');
$elm.doSomething();
doSomethingElse($elm);


回答3:

Use first().

each() matches all elements, while first() matches only the first.

There are other selectors too. When you use the id in the selector, you will only get one element. This is the main difference between .element and #element. The first is a class that can be assigned to many elements, while the second is an id that belongs to only (at most) one element.

You can still use each if only one (or 0) element is returned. Also, you can skip each altogether if you want to link an event. You use each when you want to execute a specific function for each element in the list of elements.



回答4:

If there is only 1 element, you can access it normally using the selector.

$('#your_element').your_event(function() {

});


回答5:

Behind the scenes, each is just a for loop that iterates through each element in the map returned by jQuery.

It is essentially the same as:

var i, map = $('...selector...');
for (i = 0; i < map.length; i++)
{
  someFunction(i, map[i]);
}

† There's more to it than this, involving calling the function in the context of the map element etc.

It's implementation is to provide a convenient way to call a function on each element in the selection.



回答6:

Do you mean like $('#element').children().each() supposing you have something like a ul with an id and you want the li each inside it?



回答7:

If the intention is to call a (non-jQuery) function in a new scope I think using "each" still is a valid (and probably the most elegant) way and it stays true to the jQuery syntax although I agree to Alex, it feels wrong since it might have some overhead. If you can change the syntax use $('#element')[0] as replacement for this (as already mentioned in the accepted answer).

Btw could someone with enough reputation please correct the comment of "zzzzBov" about the accepted answer? $('#element')[0] and $('#element').get(0) ARE! the same, if you want the jQuery object use $('#element').first() or $('#element').eq(0)