2 * jquery.event.drag.live - v 2.2
3 * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
4 * Open Source MIT License - http://threedubmedia.com/code/license
8 // REQUIRES: jquery 1.7.x, event.drag 2.2
12 // local refs (increase compression)
14 // ref the special event config
15 drag = $event.special.drag,
16 // old drag event add method
18 // old drag event teradown method
19 origteardown = drag.teardown;
21 // allow events to bubble for delegation
22 drag.noBubble = false;
24 // the namespace for internal live events
25 drag.livekey = "livedrag";
27 // new drop event add method
28 drag.add = function( obj ){
29 // call the old method
30 origadd.apply( this, arguments );
32 var data = $.data( this, drag.datakey );
33 // bind the live "draginit" delegator
34 if ( !data.live && obj.selector ){
36 $event.add( this, "draginit."+ drag.livekey, drag.delegate );
40 // new drop event teardown method
41 drag.teardown = function(){
42 // call the old method
43 origteardown.apply( this, arguments );
45 var data = $.data( this, drag.datakey ) || {};
46 // bind the live "draginit" delegator
48 // remove the "live" delegation
49 $event.remove( this, "draginit."+ drag.livekey, drag.delegate );
54 // identify potential delegate elements
55 drag.delegate = function( event ){
57 var elems = [], target,
58 // element event structure
59 events = $.data( this, "events" ) || {};
61 $.each( events || [], function( key, arr ){
62 // no event type matches
63 if ( key.indexOf("drag") !== 0 )
65 $.each( arr || [], function( i, obj ){
66 // locate the element to delegate
67 target = $( event.target ).closest( obj.selector, event.currentTarget )[0];
71 // add an event handler
72 $event.add( target, obj.origType+'.'+drag.livekey, obj.origHandler || obj.handler, obj.data );
73 // remember new elements
74 if ( $.inArray( target, elems ) < 0 )
78 // if there are no elements, break
81 // return the matched results, and clenup when complete
82 return $( elems ).bind("dragend."+ drag.livekey, function(){
83 $event.remove( this, "."+ drag.livekey ); // cleanup delegation