javascript - Jquery not deep copying from event handler -
i have event handler set using plain javscript this:
myelement.addeventlistener('drop', handledrop, false);
then, inside handle drop try this:
var mycontainer = $(this.parentnode); mycontainer.after(mycontainer.clone(true, true));
however, appears event not being carried on cloned element. happening because not binding event jquery also?
i tried test binding event jquery instead, doesn't support datatransfer
object broke other code.
one solution write own wrapper addeventlistener remembers listeners added, can "replayed":
// set event handler after memoizing function myaddeventlistener(element, type, listener, usecapture) { // store listeners array under element.listeners if (!element.listeners) { element.listeners=[]; } // each element of array array of arguments addeventlistener element.listeners[element.listeners.length] = array.prototype.slice.call(arguments,1); // apply listener element element.addeventlistener (type, listener, usecapture); } // copy list of event handlers 1 element function copyeventlisteners (from_element, to_element) { var i; if (from_element.listeners) { (i=0; i<from_element.listeners.length; i++) { element.addeventlistener.apply (to_element, from_element.listeners[i]); } } }
then:
function clone_with_listeners (element) { var cloned_element = element.clonenode(); copyeventlisteners (element, cloned_element); return cloned_element; }
if have no religious convictions preventing overwriting original method on element object:
var orgaddeventlistener = element.addeventlistener; // our version of addeventlistener element.addeventlistener = function (type, listener, usecapture) { // store listeners array under element.listeners if (!this.listeners) { this.listeners=[]; } // each element of array array of arguments addeventlistener this.listeners[element.listeners.length] = array.prototype.slice.call (arguments,0); // apply listener element orgaddeventlistener.call (element, type, listener, usecapture); }; // copy list of event handlers element element.copyeventlisteners = function (to_element) { var i; if (from_element.listeners) { (i=0; i<this.listeners.length; i++) { element.addeventlistener.apply (to_element, this.listeners[i]); } } };
and then:
element.clonenode = function () { var cloned_element = this.clonenode(); this.copyeventlisteners (cloned_element); return cloned_element; };
Comments
Post a Comment