Ticket #3552 (closed bug: fixed)
.wrapInner() won't work on empty elements
| Reported by: | dtetto | Owned by: | flesler |
|---|---|---|---|
| Priority: | minor | Milestone: | 1.4 |
| Component: | core | Version: | 1.4a2 |
| Keywords: | wrapInner | Cc: | |
| Blocking: | Blocked by: |
Description
$(elem).wrapInner('<div/>') does nothing if the original element is empty.
There is some logical elbow-room here -- one could argue that the wrap shouldn't be performed if there's nothing to wrap -- but the current behavior feels like a bug to me.
Based on the syntax, the transformation is being performed on the original element, not on its children: $(elem).wrapInner('<div/>'); // wrap the inside of this element with a div vs. $(elem).contents().wrapAll('<div/>'); // wrap this elements contents (if any) with a div
It's easy to get around this:
$.fn._wrapInner = $.fn.wrapInner;
$.fn.wrapInner = function(wrapper){
if(this.contents().length) return this._wrapInner(wrapper);
else return this.append(wrapper);
}
But I'd argue it ought to be changed in the library itself unless there's reason to believe a lot of folks are relying on the current behavior.
Attachments
Change History
Changed 4 years ago by Marc Diethelm
-
attachment
wrapInner.testcase.html
added
comment:1 Changed 4 years ago by Marc Diethelm
IMO wrapInner should behave consistently whether there are actual nodes to enclose or not.
I'm attaching a simple testcase (uses http://code.jquery.com/nightlies/jquery-nightly.js).
comment:2 Changed 4 years ago by Marc Diethelm
And here's a "patch" (a diff actually) that fixes the problem. I hope it's ok style wise...
Changed 4 years ago by Marc Diethelm
-
attachment
core.js.r6267.diff
added
diff: fixes bug against r6267 (core.js)
Changed 4 years ago by ricardobeat
-
attachment
wrapInner.diff
added
alternative patch (core.js r6270)
comment:3 Changed 4 years ago by ricardobeat
Added an alternative patch with a simpler/faster check for .firstChild and append instead of html (faster). Hope it's useful.
Please follow the bug reporting guidlines and use jsFiddle when providing test cases and demonstrations instead of pasting the code in the ticket.

Testcase