JQuery 1.3.2 Released.
docs.jquery.com
docs.jquery.com
Maybe "surpassed" would be a better verb here.
There are some things jQuery isn't too great at (event normalization is slow in IE, for example, and .remove() kills events and data), but I've never not been able to easily extend jQuery to use my own implementation.
Thanks again for jQuery.
As to the points you mention: "event normalization is slow in IE" Do you have any information on this? This should've gotten faster in 1.3 - but it's definitely something that we would want to improve, if that's not the case.
".remove() kills events and data" I agree that's lame. I have a new method penciled in on the roadmap: .extract() - it removes an element from the DOM but keeps all the data intact. I think this is what you're looking for!
To get around this, I use my own event normalization that seems to work across all browsers and only normalizes what I need in any given project, for example:
var e = e || window.event;
var fixed_e = {};
fixed_e.pageX = document.all ? e.clientX + truebody.scrollLeft : e.pageX;
fixed_e.pageY = document.all ? e.clientY + truebody.scrollTop : e.pageY;
fixed_e.X = (e.offsetX ? e.offsetX : e.layerX) || 0;
fixed_e.Y = (e.offsetY ? e.offsetY : e.layerY) || 0;
fixed_e.source = e.target ? e.target : e.srcElement;
Another problem with jQuery events is unbinding is tricky.. I don't like how I have to have a reference to the bound function laying around somewhere so that I can unbind it. In my event system, adding an event returns a handle, which allows you to simple call ".detach()" or ".attach()" or ".trigger()" .. it's worked out very well for me.As per the remove, I added a simple extension that's worked perfectly:
$.fn.rm = function(){
return this.each(
function(){
if (!this.parentNode) return; //already removed.
this.parentNode.removeChild(this);
}
);
}There's really not much to it - and it's really not much different from the code that you show above. A lot has changed since 1.3 so if you're still having problems, perhaps its not here and with some other aspect of the event handling code. Any more input would definitely be appreciated.
"I don't like how I have to have a reference to the bound function laying around somewhere so that I can unbind it."
Here are a couple ways to unbind an event handler without needing the original function.
$("div").bind("click", function(){});
// Unbind all bound events
$("div").unbind();
// Unbind all click events
$("div").unbind("click");
$("div").bind("click.tmp", function(){});
// Unbind all click events with the name 'tmp'
$("div").unbind("click.tmp");
The last one is probably what you want.You're right, the event namespacing was exactly what I was looking for.
BTW, is there a list of "reserved" words in jQuery? For example, jQuery has to store this information somewhere... possibly it gets attached to the DOM element itself. Where does ".data()" live? I often directly access the DOM elements, and want to be sure I don't interfere with jQuery.
A well written explanation and good visualizations and statistics of what changed (with the appropriate credit due).
It makes me want to upgrade instead of begrudgingly do so.
That way I can know an upgrade from 1.3.1 to 1.3.2 is safe across the board.