Search and Top Navigation
#9116 closed bug (fixed)
Opened February 24, 2013 12:43AM UTC
Closed February 26, 2013 02:56PM UTC
Last modified February 26, 2013 02:57PM UTC
Droppable: drop event can cause droppables to remain active if any droppable is created/destroyed in the event handler
Reported by: | voithos | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | 1.10.2 |
Component: | ui.droppable | Version: | 1.10.1 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
I ran across this when I was working with a Backbone view. Each view creates a Droppable element. The issue was that, in the drop
event, the event handler needed to modify the view's model. This caused the view to re-render itself (by destroying and recreating the Droppable) which had a strange side-effect: sometimes one of the Droppables would remain in an active
state even though the dragging was over.
I traced the problem down to the drop
(not _drop
) handler in jQuery UI. The function performs a linear loop ($.each
) over the Droppables in a given Draggable's scope (which it gets from $.ui.ddmanager.droppables
). Unfortunately, when it would fire the event handler for the Droppable, since the Droppable was being destroyed and recreated, the ordering in $.ui.ddmanager.droppables
would get shuffled by one, causing the next Droppable to be skipped in the loop.
Here is a JsFiddle that shows this behavior: http://jsfiddle.net/voithos/uZLrS/2/
I thought that it would be nice for jQuery UI to handle this because there's no easy/clean way for the event handling code to account for this.
I know that this affects versions 1.10.1, 1.9.2, and 1.8.5, but I would assume that all versions behave this way.
I've reproduced this behavior on Chrome 24 and Firefox 19 running on Linux Mint.
I have a simple fix for this (an alteration to drop
to prefetch the UUIDs of the Droppables, and search for each UUID instead of just looping through the current $.ui.ddmanager.droppables
) which I will put on Github and ask for a pull request shortly.
Attachments (0)
Change History (4)
Changed February 24, 2013 06:01AM UTC by comment:1
Changed February 24, 2013 08:46PM UTC by comment:2
status: | new → open |
---|
Changed February 26, 2013 02:56PM UTC by comment:3
resolution: | → fixed |
---|---|
status: | open → closed |
Droppable: Changed drop event to loop over a copied array instead of the droppables directly. Fixed #9116 - Droppable: Drop event can cause droppables to remain active if any droppable is created/destroyed in the event handler.
Changeset: 1c80735acb20a468300a53f85ef49b065d40af3e
Changed February 26, 2013 02:57PM UTC by comment:4
milestone: | none → 1.10.2 |
---|
Pull request sent. https://github.com/jquery/jquery-ui/pull/924