Bug Tracker

Ticket #2771 (closed bug: fixed)

Opened 7 years ago

Last modified 6 years ago

jQuery.index cannot index the jQuery object

Reported by: ericsk Owned by: flesler
Priority: minor Milestone: 1.2.4
Component: core Version: 1.2.3
Keywords: index Cc:
Blocking: Blocked by:

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 Download (395 bytes) - added by ericsk 7 years ago.
the patch file of core.js
index.diff Download (441 bytes) - added by flesler 7 years ago.
Passes all the tests, on all browsers.

Change History

Changed 7 years ago by ericsk

the patch file of core.js

comment:1 Changed 7 years ago by scott.gonzal

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

elem = elem[0] || elem;

comment:2 Changed 7 years 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.

comment:3 Changed 7 years 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...

comment:4 Changed 7 years 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 7 years ago by flesler

Passes all the tests, on all browsers.

comment:5 Changed 7 years 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.

comment:6 Changed 7 years ago by flesler

Added 2 tests at [5505].

Note: See TracTickets for help on using tickets.