Estoy aplicando ingeniería inversa al uiTokenizer de Facebook usando $.special.event.drag y $.special.event.drop y jQuery porque jQuery UI ordenable/arrastrable es pesado y lento.
Creo que mi pregunta está relacionada con las matemáticas de tolerancia para decidir cuándo inyectar el elemento de marcador de posición.
He limpiado mucho de este código desde que lo escribí por primera vez, pero la premisa sigue ahí y debería funcionar para esta pregunta.
Aquí está el código y la lógica: http://jsfiddle.net/JoshuaIRL/kf9Qt/ para probar.
El área que necesito que alguien mire sería el área de "tolerancia" de la función $.drop si la encuentra.
$.drop({ mode:'intersect', tolerance: function( event, proxy, target ){ var testV = event.pageY > ( target.top + target.height / 2 ); $.data(target.elem, "drop+reorder", testV ? "insertAfter" : "insertBefore" ); return this.contains( target, [ event.pageX, event.pageY ] ); } });Facebook parece hacer una "inserción posterior" cuando el cursor real toca otro elemento.
Estoy pensando que esto podría ser el corazón de esto también:
if ( drop && $(drop).is('.uiToken') && ( drop != dd.current || method != dd.method ) ){ $( this )[ method ]( drop ); dd.current = drop; dd.method = method; dd.update(); refreshTokens(clickOffset); placeholder.insertAfter($(this)); } Además, necesito descubrir cómo asegurarme de que no estoy sobrevinculando mis elementos con este estúpido método abierto $.drop() ... :-\
Cualquier ayuda que pueda ofrecer será muy apreciada.
ACTUALIZACIÓN: para responder a sus comentarios... Si va al enlace JSFiddle y arrastra un elemento sobre otro elemento... Debería eliminarlo inmediatamente en todas las direcciones. Para ver una comparación entre la mía y la de Facebook, consulte la de ellos en https://www.facebook.com/ /favorites y luego haga clic en el botón "Editar".
Ya sea que el método de "Tolerancia" sea o no lo que está mal, su lista de intereses es lo que estoy buscando duplicar. Ni siquiera sé si el área de Tolerancia es lo que está mal, quiero lograr lo que están haciendo.
¡Espero que esto ayude!
Parece que solo está determinando si los arrastrables a la derecha se cruzan con los objetivos a la izquierda, y si la parte superior de los arrastrables se cruza con la parte inferior de los objetivos (con cierta tolerancia).
Hay 2 maneras en que haría esto:

El segundo es, con mucho, el más fácil de implementar, pero no es tan general como el primero. Entonces, al echar un vistazo rápido a su código, recorrería todos los elementos desplegables "posibles" para determinar el área de superposición y apuntar al más grande.