Bug Tracker

Ticket #2771 (closed bug: fixed)

Opened 4 months ago

Last modified 4 months ago

jQuery.index cannot index the jQuery object

Reported by: ericsk Assigned to: flesler
Type: bug Priority: minor
Milestone: 1.2.4 Component: core
Version: 1.2.3 Keywords: index
Cc: Needs: Commit

Description

While using jQuery.index like this:

  ...
  var target = $(e.target);
  var target_index = $('.item').index(target);
  ...

it always returns -1 (i.e. NOT FOUND).

I suggest to apply the patch in the attachment to core.js (revision 5375).

Attachments

core.js.patch (395 bytes) - added by ericsk 4 months ago.
the patch file of core.js
index.diff (441 bytes) - added by flesler 4 months ago.
Passes all the tests, on all browsers.

Change History

Changed 4 months ago by ericsk

the patch file of core.js

Changed 4 months ago by scott.gonzalez

If this concept is approved, this would probably be better:

elem = elem[0] || elem;

Changed 4 months ago by flesler

Disagree...

If you accept collections then they can have more than one element, that means that you get the index of the first item found from the collection.

If this is just a shortcut for $().index( target[0] ); then just do that in your code, not internally.

Changed 4 months ago by joern

The shortcut would indeed be helpful as it would improve API consistancy quite a bit. Most other jQuery methods that accept an selector work with a string (css etc. selector) and a single or an array of dom elements. I don't know how many times I tried to use index() expecting that it would use just the first element of my jQuery object, but it happended often. Instead it just returns not-found...

Changed 4 months ago by flesler

  • need changed from Review to Commit
  • owner set to flesler
  • status changed from new to assigned

I crafted a modified version of .index() that supports collections, even with many elements. While doing this, I discovered that on IE, window == document, so this could yield some unexpected results when both are in a collection. I also added a return false, so that when the first index is found, it stops looping.

Here I attach the diff, if you want to discuss/test/benchmark it, be my guest. Let me know when I can commit this.

Changed 4 months ago by flesler

Passes all the tests, on all browsers.

Changed 4 months ago by flesler

  • status changed from assigned to closed
  • resolution set to fixed

Applied at [5500], changed the diff a bit, the === is applied to $.inArray, and this function is used in $.fn.index. If a jQuery object is received, only the first element is used.

Changed 4 months ago by flesler

Added 2 tests at [5505].

Note: See TracTickets for help on using tickets.