A problem with jQuery UI's drag-and-drop
Joseph Scheuhammer
clown at utoronto.ca
Fri Oct 19 17:28:40 UTC 2007
At today's standup, I mentioned that Anastasia and I were investigating
a problem with jQuery UI drag-and-drop ("jQuiDnD") with respect to
Shaw-Han's uportal tabbed-navigation mockup.
The mockup is located here:
https://source.fluidproject.org/svn/fluid/components/trunk/src/webapp/component-templates/test/markupExamples/reorderer/concrete/uportal-unordered-list-tabs/
As it stands, we have not committed the changes needed to run the
Reorderer using jQuiDnD with this mockup. I'll try to describe the
issue, below.
The Reorderer's keyboard drag-and-drop works as expected (of course it
does... :-)). Dragging and dropping a tab with the mouse does not. The
item dragged correctly disappears from its original location among the
tabs, and its avatar moves around as the mouse moves, but:
- no spot "opens up" to indicate a drop region, and ...
- the tab returns to its original location when the mouse button is
released.
I've traced the problem to a style in "spring_standard.css":
https://source.fluidproject.org/svn/fluid/components/trunk/src/webapp/component-templates/test/markupExamples/reorderer/concrete/uportal-unordered-list-tabs/render.userLayoutRootNode.uP_files/spring_standard.css
There are three relevant identifiers that define a "float: left;" style
rule, namely:
#tabs
#tabs a
#tab a span
If I remove the "float: left;" from the "#tabs a"' selector, jQuiDnD
works (however, the display of the tabs is dreadful).
Anastasia found some documentation (I don't have the url) that noted
that jQuiDnD has some problems with floating elements. The suggestion
is to:
1. define a css class that has the same float rule.
2. add that class to the html class attribute of the objects to be dragged,
3. add the name of the class as the value of the 'helperclass' option in
the JavaScript invocation of jQuiDnD.
That last point needs some unpacking. The Reorderer enables dnd via:
jQuery (containerElement).sortable (items, {options});
where {options} is a set of name/value pairs. One of the options is
'helperclass', where one can pass in the name of a css class, for example:
...
helperclass: 'extrafloatclass',
...
We've tried this and it works. The problem is that it requires clients
to create this extra css class, and place it in their markup; and only
if they are using a float rule. But, the idea is that clients can give
the Reorderer arbitrary html/css, and it will reorder elements
appropriately.
Anastasia and I started to work on a way that would automatically do
steps 1-3 in the Reorderer's dnd enabling code. The idea is to examine
the styles of the reorderable items, looking for any "float" rules. If
there are any, create the requisite css helper class on-the-fly, add it
to the elements' class attribute, and pass it as the 'helperclass'
optional parameter to jQuery.sortable().
I'm not thrilled with this solution, but I'm going to give it a try just
to see if it can be done. Maybe it's okay for a 0.1 release, but I'm
not certain of that. If anyone knows of a better approach, I'm all ears.
--
;;;;joseph
'Oozy rat in a sanitary zoo'
- "Bob", W. A. Yankovic -
More information about the fluid-work
mailing list