Opened 13 years ago
Closed 12 years ago
#8104 closed bug (wontfix)
Problem with objects that have a .length property
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | high | Milestone: | 1.next |
Component: | core | Version: | 1.5 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
If you create a class with a .length property and try to bind events to it, jQuery throws an Exception.
http://www.jsfiddle.net/Cg8tf/
The problem exists as a result of the makeArray function, which assumes that if the object has a length property, it is an array.
Change History (18)
comment:1 Changed 13 years ago by
Component: | unfiled → core |
---|---|
Priority: | undecided → low |
Resolution: | → worksforme |
Status: | new → closed |
comment:2 Changed 13 years ago by
Yes, you missed it. Uncomment the declaration of the "this.length = 0" and it stops working, as per the comment directly above the commented out "this.length = 0".
I can even post the lines of code that cause this problem to exist at all, if you like.
comment:3 Changed 13 years ago by
Milestone: | 1.next → 1.5.1 |
---|---|
Priority: | low → high |
Resolution: | worksforme |
Status: | closed → reopened |
Less convoluted test case
As noted by the reporter, the problem lies in the .makeArray
function.
comment:4 Changed 13 years ago by
Status: | reopened → open |
---|
comment:5 follow-up: 6 Changed 13 years ago by
I fiddled around with potential solutions. typeof gives "object" on arrays, so that won't work, but using the .constructor property seems to.
Now, I haven't tested this in either Safari or IE, but it works in both Firefox and Chrome (which leads me to suspect it will work in Safari considering they both use Webkit, so it should also work in Konqueror).
comment:6 follow-ups: 7 8 Changed 13 years ago by
Owner: | set to eamonn.kearns@… |
---|---|
Status: | open → pending |
Why not use jQuery.type()?
Replying to eamonn.kearns@…:
I fiddled around with potential solutions. typeof gives "object" on arrays, so that won't work, but using the .constructor property seems to.
Now, I haven't tested this in either Safari or IE, but it works in both Firefox and Chrome (which leads me to suspect it will work in Safari considering they both use Webkit, so it should also work in Konqueror).
Also...
alert-less:
comment:7 Changed 13 years ago by
Replying to rwaldron:
Also...
alert-less:
:-/ ummm.. ok, sorry to have bothered you with my nasty alerts from 1999
comment:8 Changed 13 years ago by
Replying to rwaldron:
Why not use jQuery.type()?
Because I am not 100% familiar with the API and was offering any potential solution, knowing that if there was a jQuery specific one that you guys would know how to do it.
comment:9 Changed 13 years ago by
Status: | pending → open |
---|
comment:10 follow-up: 11 Changed 13 years ago by
@jitter,
I'm looking forward to seeing how this is handled.
comment:11 Changed 13 years ago by
comment:12 Changed 13 years ago by
Milestone: | 1.5.1 → 1.next |
---|
comment:13 Changed 12 years ago by
I think this may be the culprit: https://github.com/jquery/jquery/commit/715d1c5a30cc4986018bbf063713f14c34c3e258
comment:14 Changed 12 years ago by
A possible solution would be to limit which types are considered array-like in .merge(). These would be: arrays, jQuery objects, nodelists, and arguments.
http://forum.jquery.com/topic/jquery-isarraylike-for-consistency#14737000002236285
comment:15 Changed 12 years ago by
https://github.com/rkatic/jquery/compare/rkatic:master...%238104
I thing dropping support for array-like plain objects is not a big deal. It is not used internally. Not sure for the rest of the world.
Personally, I am not in favor of fixing this at all. But if needed...
comment:16 Changed 12 years ago by
After more testing, I realized that my patch fails with arguments objects. So ignore it.
comment:17 Changed 12 years ago by
I made some fixes to the patch. It's again available if wanted: https://github.com/rkatic/jquery/compare/rkatic:master...%238104
comment:18 Changed 12 years ago by
Resolution: | → wontfix |
---|---|
Status: | open → closed |
Alright, we're not going to pursue this then.
Tested in IE6-7-8, Firefox 3.6.12 - 4b10, Opera 9.x 10.x, Chrome latest and Safari 5
Did I miss the one you're getting errors in?
http://www.jsfiddle.net/rwaldron/Cg8tf/4/