I'm working on a more or less single page app right now. As such, there's a lot of dynamic DOM manipulation. Sometimes, we need to re-evaluate a jQuery selector to get the new set of objects after the DOM has changed.
Typically we've solved this problem by always using the selector to find the children. This became really frustrating in my Jasmine tests where I found myself doing this a lot!
it("toggles the display of an element", function() {
var $togglableItem = $('.togglable');
expect($togglableItem.length).toBe(0);
$button.trigger('click');
var $togglableItem = $('.togglable');
expect($togglableItem.length).not.toBe(0);
$button.trigger('click');
var $togglableItem = $('.togglable');
expect($togglableItem.length).toBe(0);
});
Even in production code (outside of tests) that can be kind of a pain. I wanted to be able to do something more like this:
it("toggles the display of an element", function() {
var $togglableItem = $('.togglable');
expect($togglableItem.length).toBe(0);
$button.trigger('click');
expect($togglableItem.refresh().length).not.toBe(0);
$button.trigger('click');
expect($togglableItem.refresh().length).toBe(0);
});
A Common Solution
I've seen some implementations of a jQuery refresh plugin that look like this:
(function($) {
$.fn.extend({
refresh: function() { return $(this.selector); }
});
})(jQuery);
I have two problems with this approach. First, I don't always have my elements attached to the DOM when I want to do a refresh. In fact, typically in testing, I don't add my test elements to the DOM so I can't just reuse the selector. The selection depends on the parent jQuery object.
Second, I also really enjoy the fluency of jQuery and often make use of .end() method when it makes sense. The approach above flattens the selector stack and .end() returns the default jQuery object.
Preferred Approach
To maintain the fluency of jQuery and allow the refresh, here's what I'm proposing:
(function($) {
$.fn.extend({
refresh: function() {
var $parent = this.end();
var selector = this.selector.substring($parent.selector.length).trim();
return $parent.find(selector);
}
});
})(jQuery);
Caveats
I haven't used this in the wild yet. I know .selector is deprecated, but it's the best I could find for now. It does, however, work pretty darned well in my Jasmine tests. :)

I went on my honeymoon with my beautiful wife last week and the week before. Having a little time off of work gave me the opportunity to get some work done :). I've been wanting for a while to develop a survey to find out
I have an old website where I keep most of my bookmarklets. I'm planning on deprecating that site and just putting up some personal stuff (since I don't do what that site says I do anymore).