[Proto-Scripty] Re: More useful clone method

2009-08-28 Thread Matt Foster

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 watermar...@gmail.com 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 watermar...@gmail.com wrote:

  1.6.1rc3 added Element.clone (which calls cloneNode).

  On Aug 25, 5:46 pm, Matt Foster mattfoste...@gmail.com 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 watermar...@gmail.com 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;

 

[Proto-Scripty] Re: More useful clone method

2009-08-28 Thread T.J. Crowder

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 mattfoste...@gmail.com 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 watermar...@gmail.com 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 watermar...@gmail.com wrote:

   1.6.1rc3 added Element.clone (which calls cloneNode).

   On Aug 25, 5:46 pm, Matt Foster mattfoste...@gmail.com 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 watermar...@gmail.com 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) {
             

[Proto-Scripty] Re: More useful clone method

2009-08-26 Thread watermark86

1.6.1rc3 added Element.clone (which calls cloneNode).

On Aug 25, 5:46 pm, Matt Foster mattfoste...@gmail.com 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 watermar...@gmail.com 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 prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: More useful clone method

2009-08-26 Thread watermark86

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 watermar...@gmail.com wrote:
 1.6.1rc3 added Element.clone (which calls cloneNode).

 On Aug 25, 5:46 pm, Matt Foster mattfoste...@gmail.com 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 watermar...@gmail.com 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)) {
                           

[Proto-Scripty] Re: More useful clone method

2009-08-25 Thread Matt Foster

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 watermar...@gmail.com 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 prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~--~~~~--~~--~--~---