Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problem with jQuery index()

There must be something simple I am missing. I'm trying to get the index of the element but keep getting -1.

HTML:

<div id="rating_boxes">
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
<img src="/img/ratingbox.gif" class="ratingbox" alt="Rate this Speech" />
</div>

jQuery:

$("img.ratingbox").hover(function() {
    var index = $(this).parent().index(this);
            // have also tried $("#rating_boxes").index(this);
            // and $("#rating_boxes").index($(this));
            // and $(this).parent().index($(this));
    alert(index);
    $(this).attr('src', '/img/ratingbox-selected.gif');
}, function() {
    $(this).attr('src', '/img/ratingbox.gif');
});
like image 218
Matt McCormick Avatar asked Jan 02 '10 00:01

Matt McCormick


2 Answers

I tend to steer clear of using index() in jQuery 1.3.2 and previous as it feels unintuitive to use. I simply use

$(this).prevAll().length

to get the index. calling size() on prevAll() simply returns the value of the length property, so I prefer to just use length directly and skip the extra function call.

For example,

$("img.ratingbox").hover(function() {
    var index = $(this).prevAll().length;
    alert(index);
    $(this).attr('src', '/img/ratingbox-selected.gif');
}, function() {
    $(this).attr('src', '/img/ratingbox.gif');
});

In jQuery 1.4, you'll simply be able to call index() on a jQuery object to get the index of the first element in the object.

like image 198
Russ Cam Avatar answered Sep 28 '22 03:09

Russ Cam


index() returns the index of the given element with a list of elements, not within a parent element. To find the index of the clicked image, you need to find all the images, not the parent of all the images.

You want something like this:

// Find all the images in our parent, and then find our index with that set of images
var index = $(this).parent().find("img").index(this);

You're also using the id selector instead of the class selector in your 2nd example. Instead of

$("#rating_boxes").index($(this)); // your way - select by ID

You want

$(".rating_boxes").index(this); // select by class
like image 22
meagar Avatar answered Sep 28 '22 05:09

meagar