Iterating over jQuery $(this).attr('class').split(" ") gives odd results
I've got a page where I'm trying to fetch arrays of classes for lots of divs which share a common class. For example:
<div class="common lorem ipsum"></div>
<div class="common dolor sit"></div>
<div class="common hello world"></div>
I want to fetch each common
class div and get an Array of it's classes. At the moment, I'm doing it by using this bit of jQuery:
$('.common').each(function(index) {
var classes = $(this).attr('class').split(" ");
for(var i in classes) {
alert(classes[i]);
}
});
Looking at the first resulting classes
variable gives this:
classes: Array (3)
0: "common"
1: "lorem"
2: "i开发者_JAVA技巧psum"
length: 3
__proto__: Array
The problem is that the for(var i in classes)
seems to be iterating over the __proto__
Array and delving down into that as well - has anybody ever come across this before? I'm using the latest version of Chrome (6.0.453.1).
for ( var i = 0, l = classes.length; i<l; ++i ) {
alert( classes[i] );
}
Iterate through an array with a regular for loop, not a for...in
otherwise it enumerates through the array's properties ( since its still an object and has other properties in addition to the elements inside ).
To add to the other valid answers, since you're already using jQuery, you can take advantage of jQuery.each
:
$.each(classes, function (i, cls) {
alert(cls);
});
@meder answered your question just right, i've just wanted to add, that if the order of the enumeration is not important, you can always use this simplified form:
for ( var i = classes.length; i--; ) {
alert( classes[i] );
}
It is shorter, and faster.
Adding to meder's answer...
There is a way of iterating over objects safely without being annoyed by the inherited properties of an object. hasOwnProperty() to the rescue:
for(var i in classes) {
if (classes.hasOwnProperty(i)) {
var safeValue = classes[i];
}
}
I've seen this used here.
I'm not sure what the (i in this)
double-check against 0-n
weeds out.
var thisp = arguments[1];
for (var i = 0, len = this.length; i < len; i++){
if (i in this){
fun.call(thisp, this[i], i, this); // fun(element,index,array)
}
}
精彩评论