Ticket #10671 (closed bug: duplicate)
attr('attribute', undefined) doesn't return jQuery
| Reported by: | pilif | Owned by: | |
|---|---|---|---|
| Priority: | low | Milestone: | None |
| Component: | attributes | Version: | 1.7 |
| Keywords: | Cc: | ||
| Blocking: | Blocked by: |
Description
Calling .attr() or anything else deferring to access() with a second argument of undefined returns undefined instead of jQuery.
typeof($('div').attr('id', undefined)) === 'undefined';
See here: http://jsfiddle.net/tkjXt/
I know that you probably shouldn't set an attribute (or anything else) to undefined, but this is handy when copying attributes from another element:
$('<div>')
.attr('id', otherdiv.attr('id')) // if otherdiv doesn't have an id, we blow up here.
.attr('class', otherdiv.attr('class'));
This worked correctly before jQuery 1.6 but broke when attr('doesnotexist') began returning undefined.
I would have sent a patch, but attr() then immediately defers to access() which has no way to find out whether attr() was called with one or two parameters, so fixing this would be a huge refactoring effort I definitely don't feel comfortable with.
Change History
comment:1 Changed 19 months ago by timmywil
- Priority changed from undecided to low
- Resolution set to duplicate
- Status changed from new to closed
- Component changed from unfiled to attributes
comment:3 Changed 19 months ago by dmethvin
To your specific case, I think this would work:
$('<div>')
.prop('id', otherdiv.prop('id'))
.prop('class', otherdiv.prop('class'));
Those two corresponding properties are always defined (but can be empty strings, which is fine). You could also .clone() the original div and modify it, which could be faster and shorter.
Please follow the bug reporting guidlines and use jsFiddle when providing test cases and demonstrations instead of pasting the code in the ticket.

This is intentional for all jQuery setters.