<div>That's awesome! So slick! </div>
<div> </div>
<div>Is var val; potentially modified by a closure when the handler is applied (otherwise it takes the default return handler return value)?</div>
<div> </div>
<div>Cheers,</div>
<div>-Jonathan
</div>
<div><span class="gmail_quote">On 11/21/07, <b class="gmail_sendername">Brandon Aaron</b> <<a href="mailto:brandon.aaron@gmail.com">
brandon.aaron@gmail.com</a>> wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Absolutely. For the events I've already implemented I just handed off the execution to jQuery.event.handle
but you could use your own handle to process the event queue however you please. The event.stopPropagation and event.preventDefault and return false act as expected for the events I've implemented thus far.
<div>
</div>
<div>I was also thinking about the mousemove performance issues. One could implement a special event for mousemove and overwrite the default handling of it. Meaning you could skip the jQuery.event.fix method all together and just roll with a native event object. It might look something like this:
</div>
<div>
</div>
<div>
<div>mousemove: {</div>
<div><span style="WHITE-SPACE: pre"></span>setup: function() {</div>
<div><span style="WHITE-SPACE: pre"></span>jQuery(this).bind('mousemove', jQuery.event.special.mousemove.handler);</div>
<div><span style="WHITE-SPACE: pre"></span>},</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>teardown: function() {</div>
<div><span style="WHITE-SPACE: pre"></span>jQuery(this).ubind('mousemove', jQuery.event.special.mousemove.handler);</div>
<div><span style="WHITE-SPACE: pre"></span>},</div>
<div><span style="WHITE-SPACE: pre"></span></div>
<div><span style="WHITE-SPACE: pre"></span>handler: function(event) {</div>
<div><span style="WHITE-SPACE: pre"></span>// returned undefined or false</div>
<div><span style="WHITE-SPACE: pre"></span>var val;</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>// Namespaced event handlers</div>
<div><span style="WHITE-SPACE: pre"></span>var parts = event.type.split(".");</div>
<div><span style="WHITE-SPACE: pre"></span>event.type = parts[0];</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], </div>
<div><span style="WHITE-SPACE: pre"><span style="WHITE-SPACE: normal">args = Array.prototype.slice.call( arguments, 1 );</span></span></div>
<div><span style="WHITE-SPACE: pre"></span>args.unshift( event );</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>for ( var j in handlers ) {</div>
<div><span style="WHITE-SPACE: pre"></span>var handler = handlers[j];</div>
<div><span style="WHITE-SPACE: pre"></span>// Pass in a reference to the handler function itself </div>
<div><span style="WHITE-SPACE: pre"></span>// So that we can later remove it</div>
<div><span style="WHITE-SPACE: pre"></span>args[0].handler = handler;</div>
<div><span style="WHITE-SPACE: pre"></span>args[0].data = handler.data;</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>// Filter the functions by class</div>
<div><span style="WHITE-SPACE: pre"></span>if ( !parts[1] || handler.type == parts[1] ) {</div>
<div><span style="WHITE-SPACE: pre"></span>var ret = handler.apply( this, args );</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>if ( val !== false )</div>
<div><span style="WHITE-SPACE: pre"></span>val = ret;</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>if ( ret === false ) {</div>
<div><span style="WHITE-SPACE: pre"></span>event.preventDefault();</div>
<div><span style="WHITE-SPACE: pre"></span>event.stopPropagation();</div>
<div><span style="WHITE-SPACE: pre"></span>}</div>
<div><span style="WHITE-SPACE: pre"></span>}</div>
<div><span style="WHITE-SPACE: pre"></span>}</div>
<div>
</div>
<div><span style="WHITE-SPACE: pre"></span>return val;</div>
<div><span style="WHITE-SPACE: pre"></span>}</div>
<div>}</div></div>
<div>
</div>
<div>
</div>
<div>That handler is jQuery.event.handle just without the call to jQuery.event.fix. It isn't particular small but it does allow you to stick with the jQuery events API but handle the mousemove event differently. I could have also named it
jQuery.event.special.mousemove.handle. Only setup and teardown need to be named specifically.
<div>
</div>
<div>--</div>
<div><span class="sg">Brandon Aaron</span>
<div><span class="q" id="q_1166402c80a34a4d_2">