John, thanks for the explanation.  I see the problem now.  How about
building an array of the new elements as we duplicate them, and then
return that?

jQuery.fn.removeAll = function() {
        var ret = [];
        this.each(function() {
                var newEl = this.cloneNode(false);
                this.parentNode.replaceChild(newEl, this);

                //Copy back events if they haven't been copied already by IE
                if(jQuery.support.noCloneEvent) {
                        cloneCopyEvent($(this), $(newEl));
                }

                ret[ret.length] = newEl;
        });
        return jQuery(ret);
};

This seems to work as expected.
Devon

On Dec 15, 4:44 pm, John Resig <jere...@gmail.com> wrote:
> Devon -
>
> Let me explain this in a different way: You're creating a duplicate
> copy of the element, one which isn't tied to anything.
>
> Another way to illustrate it:
>
> var divs = $("div");
> // .length == 10
>
> divs.eq(0).children().length
> // 3
>
> var empty = $("div").empty();
> // .length == 10
>
> empty.eq(0).children().length
> // 0
>
> divs.eq(0).children().length
> // 3
>
> It's not actually emptying out the right elements - you have this
> quantum state where you have "the same" elements and they're both
> empty and full.
>
> --John
>
>
>
> On Tue, Dec 15, 2009 at 4:04 PM, Devon Govett <devongov...@gmail.com> wrote:
> > Karl, yes but this is about empty not remove, which means that the
> > parent of the removed elements is returned not the children
> > themselves.  For example:
>
> > $("div.foo").empty() //returns div.foo not the children of div.foo
>
> > The element that we call empty on is not removed from the document so
> > returning it shouldn't be an issue.  It would be an issue for the
> > remove function, which directly removes the element that you call it
> > on.
>
> > Devon
>
> > On Dec 15, 8:37 am, Karl Swedberg <k...@englishrules.com> wrote:
> >> Devon, some people like to remove elements and have the option of
> >> adding some or all of them back into the DOM at a later time.
>
> >> DBJDBJ, this is just FYI since you already retracted your suggestion
> >> to add a .detach() method, but jQuery 1.4a already has a .detach()
> >> method. It removes elements from the DOM without removing their events
> >> or data.
>
> >> --Karl
>
> >> On Dec 15, 2009, at 7:33 AM, Devon Govett wrote:
>
> >> > @John I would like to ask the same thing DBJDBJ did.  Why would you
> >> > want to find the index of an element that no longer exists?  This just
> >> > seems unintuitive.  You shouldn't be able to find the index of
> >> > something not in the document.  The two sets of elements did refer to
> >> > the same thing, but no they don't because you removed the elements.
> >> > This makes sense to me.  As far as I know, no matter how you remove
> >> > elements they are not part of the document any more.  Isn't that the
> >> > point of removing them?
>
> >> > Devon
>
> >> > On Dec 14, 11:48 pm, John Resig <jere...@gmail.com> wrote:
> >> >> A major problem with your technique is that the original elements are
> >> >> simply no longer part of the document.
>
> >> >> For example:
>
> >> >> var someElems = $("div");
> >> >> // length == 10
>
> >> >> var removed = $("div.foo").remove();
> >> >> // length == 5
>
> >> >> someElems.index( removed )
> >> >> // -1 (the elements you just removed aren't found!)
>
> >> >> This creates a problem: You now have two sets of elements that sort
> >> >> of
> >> >> refer to the same thing but actually aren't the same.
>
> >> >> --John
>
> >> >> On Mon, Dec 14, 2009 at 11:35 PM, Devon Govett
> >> >> <devongov...@gmail.com> wrote:
> >> >>> I did some performance testing with the following code, and found it
> >> >>> to be much slower than the cloneNode method, but still often twice
> >> >>> as
> >> >>> fast as the current method.
>
> >> >>> jQuery.fn.removeAll = function() {
> >> >>>        this.each(function() {
> >> >>>                var nextSibling = this.nextSibling;
> >> >>>                var parent = this.parentNode;
>
> >> >>>                parent.removeChild(this);
> >> >>>                while (this.firstChild) {
> >> >>>                        this.removeChild(this.firstChild);
> >> >>>                }
> >> >>>                if(nextSibling)
> >> >>>                        parent.insertBefore(this, nextSibling)
> >> >>>                else
> >> >>>                        parent.appendChild(this);
> >> >>>        });
> >> >>> };
>
> >> >>> What are the problems with the cloneNode method?
>
> >> >>> Devon
>
> >> >>> On Dec 13, 5:36 pm, Devon Govett <devongov...@gmail.com> wrote:
> >> >>>> Yeah I tried that too, and it was slightly slower in most browsers
> >> >>>> than cloneNode.  The other issue with this, is that if the user
> >> >>>> has a
> >> >>>> slow computer, or the removal is taking a really long time, layout
> >> >>>> problems may occur since there is no element in the DOM during the
> >> >>>> emptying.  The cloneNode method has the advantage that during the
> >> >>>> emptying process nothing is removed from the screen and so things
> >> >>>> don't look weird.  I know this is an edge case, but it is
> >> >>>> something to
> >> >>>> consider.
>
> >> >>>> Devon
>
> >> >>>> On Dec 13, 10:46 am, John Resig <jere...@gmail.com> wrote:
>
> >> >>>>> Actually, now that you bring this up, it would make a lot of
> >> >>>>> sense to
> >> >>>>> just remove the element from the DOM first and /then/ go through
> >> >>>>> and
> >> >>>>> clean up the child nodes, and finally re-inject the element
> >> >>>>> again. I'm
> >> >>>>> hesitant to do a cloneNode because of the inherent problems that
> >> >>>>> exist
> >> >>>>> in Internet Explorer. I'll see if I have some time to do some perf
> >> >>>>> testing on this later today.
>
> >> >>>>> --John
>
> >> >>>>> On Sun, Dec 13, 2009 at 8:19 AM, Devon Govett
> >> >>>>> <devongov...@gmail.com> wrote:
> >> >>>>>> Hi all,
>
> >> >>>>>> I've just blogged about a technique that I used to make
> >> >>>>>> jQuery.empty
> >> >>>>>> over 10x faster in some cases.  Basically, rather than
> >> >>>>>> individually
> >> >>>>>> removing each child element from the DOM which causes the
> >> >>>>>> browser to
> >> >>>>>> reflow after each one, I use a shallow cloneNode to do the job
> >> >>>>>> then
> >> >>>>>> copying events back over.  Check out the blog post for more
> >> >>>>>> details:
> >> >>>>>>http://devongovett.wordpress.com/2009/12/12/how-to-make-jquery-empty-
> >> >>>>>> ....
> >> >>>>>> I've included some charts comparing the performance of jQuery
> >> >>>>>> 1.4's
> >> >>>>>> empty and html("") functions, as well as the function I've
> >> >>>>>> written,
> >> >>>>>> and the cloneNode method out performs all other methods by a
> >> >>>>>> significant amount in all browsers.
>
> >> >>>>>> Thanks for jQuery!
> >> >>>>>> Devon
>
> >> >>>>>> --
>
> >> >>>>>> You received this message because you are subscribed to the
> >> >>>>>> Google Groups "jQuery Development" group.
> >> >>>>>> To post to this group, send email to jquery-...@googlegroups.com.
> >> >>>>>> To unsubscribe from this group, send email to 
> >> >>>>>> jquery-dev+unsubscr...@googlegroups.com
> >> >>>>>> .
> >> >>>>>> For more options, visit this group 
> >> >>>>>> athttp://groups.google.com/group/jquery-dev?hl=en
> >> >>>>>> .
>
> >> >>> --
>
> >> >>> You received this message because you are subscribed to the Google
> >> >>> Groups "jQuery Development" group.
> >> >>> To post to this group, send email to jquery-...@googlegroups.com.
> >> >>> To unsubscribe from this group, send email to 
> >> >>> jquery-dev+unsubscr...@googlegroups.com
> >> >>> .
> >> >>> For more options, visit this group 
> >> >>> athttp://groups.google.com/group/jquery-dev?hl=en
> >> >>> .
>
> >> > --
>
> >> > You received this message because you are subscribed to the Google
> >> > Groups "jQuery Development" group.
> >> > To post to this group, send email to jquery-...@googlegroups.com.
> >> > To unsubscribe from this group, send email to 
> >> > jquery-dev+unsubscr...@googlegroups.com
> >> > .
> >> > For more options, visit this group 
> >> > athttp://groups.google.com/group/jquery-dev?hl=en
> >> > .
>
> > --
>
> > You received this message because you are subscribed to the Google Groups 
> > "jQuery Development" group.
> > To post to this group, send email to jquery-...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > jquery-dev+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/jquery-dev?hl=en.

--

You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to jquery-...@googlegroups.com.
To unsubscribe from this group, send email to 
jquery-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en.


Reply via email to