Interesting you should ask that question:
http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/e5286fee9ac18a40/53ff3b0aec0b293d#53ff3b0aec0b293d

-- T.J. :-)

On Aug 28, 8:24 pm, Matt Foster <[email protected]> wrote:
> Scenario for you...
>
> What if I have a parent object that I use deepClone on and it has
> child elements that have event handlers, is this functionality
> preserved with the method?
>
> On Aug 26, 1:18 pm, watermark86 <[email protected]> wrote:
>
>
>
> > Well, I have x-mas presents.  I give it "it works for me" status.
> > I've tested this bit of code with firefox and it seems to work with
> > every scenario I can throw at it.  I'm sure there is room for speed
> > improvements and I know it doesn't conform to coding style, but it
> > works.  It would be great if prototype officially extended
> > Element.clone with this functionality.
>
> > deepClone: function(element) {
> >         var newElement = element.clone(true); //clone the node
>
> >         //stop observing all events on the newElement (IE (and some
> > others?) copies them)
> >         newElement.stopObserving();
>
> >         //copy storage
> >         Element.getStorage(newElement);
> >         (Element.Storage[newElement._prototypeUID[0]]=new Hash
> > (Element.getStorage(element))).unset('prototype_event_registry');
>
> >         //copy the events on the parent
> >         if (!Object.isUndefined(registry = Element.retrieve(element,
> > 'prototype_event_registry'))) {
> >                 registry.each( function(pair) {
> >                         var eventName = pair.key, responders = pair.value;
> >                         responders.each( function(r) {
> >                                 Element.observe(newElement, eventName, 
> > r.handler);
> >                 });
> >                 });
> >         }
>
> >         //get all of the descendants
> >     var srcdecend = element.descendants();
> >     var dstdecend = newElement.descendants();
> >     var numdecend = srcdecend.length;
>
> >     //foreach of the descendants
> >     for(var i = 0; i < numdecend; ++i) {
> >         //stop observing all events on the newElement (IE (and some
> > others?) copies them)
> >                 dstdecend[i].stopObserving();
> >                 //copy storage
> >                 Element.getStorage(dstdecend[i]);
> >                 
> > (Element.Storage[dstdecend[i]._prototypeUID[0]]=Element.getStorage
> > (srcdecend[i]).clone()).unset('prototype_event_registry');
> >         //copy the events on each child to it's new corrisponding child
> >         var registry = Element.retrieve(srcdecend[i],
> > 'prototype_event_registry');
> >                 if (!Object.isUndefined(registry)) {
> >                         registry.each( function(pair) {
> >                                 var eventName = pair.key, responders = 
> > pair.value;
> >                                 responders.each( function(r) {
> >                                         Element.observe(dstdecend[i], 
> > eventName, r.handler);
> >                         });
> >                         });
> >                 }
> >     }
>
> >     return newElement;
> >   }
>
> > On Aug 26, 9:43 am, watermark86 <[email protected]> wrote:
>
> > > 1.6.1rc3 added Element.clone (which calls cloneNode).
>
> > > On Aug 25, 5:46 pm, Matt Foster <[email protected]> wrote:
>
> > > > Good luck with this,  let us know if it works out.
>
> > > > Quick glance at your code I can see an obvious error...
>
> > > > >         var newElement = element.clone(true); //clone the node
>
> > > > Element doesn't have a clone method.  The native DOM element does have
> > > > a cloneNode method though.
>
> > > > --
>
> > > >http://positionabsolute.net
>
> > > > On Aug 25, 2:15 pm, watermark86 <[email protected]> wrote:
>
> > > > > I'm using 1.6.1rc3 to have access to Element.storage.  I need to write
> > > > > a function that deep clones an element and copies the Element.observe
> > > > > events as well as the Element.Storage items with it.  I've managed to
> > > > > write the code that can copy one or the other.
>
> > > > > The problem comes in when I try to do both (copy the storage items and
> > > > > the events.)  I suppose due to Event.observe using the Element.storage
> > > > > item, I can't seem to have the items that I've stored with
> > > > > Element.store to copy while maintaining the Event.observe events that
> > > > > I've copied.
>
> > > > > I can copy the observe events or the element.store events, but not
> > > > > both.  Below is some terrible code for review.  Thanks for any help or
> > > > > insults.
>
> > > > > deepClone: function(element) {
> > > > >         //deep clone node
> > > > >         var newElement = element.clone(true); //clone the node
>
> > > > >         //stop observing because of IE BS
> > > > >         newElement.stopObserving();
>
> > > > >         //copy the item
> > > > >         var registry = Element.retrieve(element,
> > > > > 'prototype_event_registry');
> > > > >         if (!Object.isUndefined(registry)) {
> > > > >                 registry.each( function(pair) {
> > > > >                         var eventName = pair.key, responders = 
> > > > > pair.value;
> > > > >                         responders.each( function(r) {
> > > > >                                 Element.observe(newElement, 
> > > > > eventName, r.handler);
> > > > >                 });
> > > > >                 });
> > > > >         }
>
> > > > >     //for all of the descendants, copy the event handlers
> > > > >     var srcdecend = element.descendants();
> > > > >     var dstdecend = newElement.descendants();
> > > > >     var numdecend = srcdecend.length;
>
> > > > >     for(var i = 0; i < numdecend; ++i) {
> > > > >         //stop observing because of IE BS
> > > > >                 dstdecend[i].stopObserving();
> > > > >         //copy the registry
> > > > >         var registry = Element.retrieve(srcdecend[i],
> > > > > 'prototype_event_registry');
> > > > >                 if (!Object.isUndefined(registry)) {
> > > > >                         registry.each( function(pair) {
> > > > >                                 var eventName = pair.key, responders 
> > > > > = pair.value;
> > > > >                                 responders.each( function(r) {
> > > > >                                         Element.observe(dstdecend[i], 
> > > > > eventName, r.handler);
> > > > >                         });
> > > > >                         });
> > > > >                 }
> > > > >     }
>
> > > > >     return newElement;
> > > > >   }
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to