I'm not sure what all is involved/required for calling .unbind() to be honest. Wouldn't it just be this._input.unbind('change') ? or are there additional parameters required? If it needs a fn reference, that's what hitch() returns ...
var cb = $.hitch(this, "_change"); this._input.bind('change', cb).ubind('change', cb); Again, pardon my ignorance of the bind/unbind pattern. Regards, Peter On Fri, Apr 10, 2009 at 5:52 AM, Azat Razetdinov <razetdi...@gmail.com> wrote: > >> this._input.bind('change', $.hitch(this, "_onInputChange")); > > How do you unbind the ‘hitched’ method? > > On Apr 8, 11:04 pm, pete higgins <phigg...@gmail.com> wrote: >> My hitch() method does this kind of: >> >> http://higginsforpresident.net/js/jq.hitch.js >> >> It would look like: >> >> this._input.bind('change', $.hitch(this, "_onInputChange")); >> >> Regards, >> Peter Higgins >> >> >> >> On Wed, Apr 8, 2009 at 12:03 PM, gregory <gregory.tomlin...@gmail.com> wrote: >> >> > the only difficulty I am having with >> > Balazs Endresz's approach (which I have also >> > implemented in my environment) is if another developer passes a >> > function as 'data' param, the results become unpredictable. Though I >> > don't *think* anybody should be passing a function to access as >> > event.data, it currently does work to do so. >> >> > though changing the pattern to no longer have the handler as the last >> > param may cause minor confusion, it should not cause any backward >> > compatibility issues. >> >> > I have never bench marked the performance of 'return toString.call >> > (obj) === "[object Function]";' Is this faster than running typeof obj >> > === "function" ? >> >> > very, very interested in seeing the core of jquery improved to include >> > a capability to apply correct scope to the handler function >> >> > thanks! >> > -gregory >> >> > On Mar 29, 3:26 am, Azat Razetdinov <razetdi...@gmail.com> wrote: >> >> From the updated jQuery 1.4 Roadmap: >> >> >> > If you need a different object for the scope, why not use the data >> >> > argument to transport it? >> >> >> In OOP-style applications the handler is often not an anonymous >> >> function but a link to the current objects's prototype method: >> >> >> this._input.bind('change', this._onInputChange, this); >> >> >> And all prototype methods expect that 'this' points to the current >> >> object. If one needs the jQuery object, he could happily use >> >> event.currentTarget to reach it. >> >> >> One would recommend binding all handlers with anonymous functions, >> >> e.g.: >> >> >> var that = this; >> >> this._input.bind('change', function (event) { that._onInputChange >> >> (event) }); >> >> >> 1. It's more verbose. 2. There's no way to unbind this handler. >> >> >> On Feb 23, 11:56 pm, Azat Razetdinov <razetdi...@gmail.com> wrote: >> >> >> > Passing handler after scope is not suitable for two reasons: >> >> >> > 1. There's no way to determine whether data or scope is passed in a >> >> > three-argument method call. >> >> > 2. Passing scope after handler is common pattern in JavaScript 1.6 >> >> > methods like forEach. >> >> >> > On Dec 25 2008, 11:08 pm, "Eduardo Lundgren" >> >> >> > <eduardolundg...@gmail.com> wrote: >> >> > > The isFunction is faster now but still has more coast that when you >> >> > > don't >> >> > > need to call it. >> >> >> > > We should keep the handler as the last parameter to fit with the >> >> > > jQuery API, >> >> > > the change is compatible with it. >> >> >> > > $('div').bind('click', {data: true}, scope, >> >> > > *scope.internalHandler*); >> >> >> > > Scoping events is a good addition to jQuery. >> >> >> > > Ariel, Joern, John? Let me know if it make sense for you. >> >> >> > > Thanks, >> >> > > Eduardo Lundgren >> >> >> > > On Thu, Dec 25, 2008 at 11:57 AM, Balazs Endresz >> >> > > <balazs.endr...@gmail.com>wrote: >> >> >> > > > True, but the new isFunction is a couple of times faster than the >> >> > > > old >> >> > > > one, though it's still many times faster to directly call >> >> > > > Object.prototype.toString, which is far below 0.001ms. But as the >> >> > > > callback function is the last parameter everywhere in jQuery it >> >> > > > might >> >> > > > be confusing to change this pattern, it just looked more like >> >> > > > binding >> >> > > > the function with a native method for me. >> >> >> > > > On Dec 25, 7:06 pm, "Eduardo Lundgren" <eduardolundg...@gmail.com> >> >> > > > wrote: >> >> > > > > Hi Balazs, >> >> >> > > > > Thanks for give us your opinion. >> >> >> > > > > When you use $.isFunction(data) on the bind method it is very >> >> > > > > expensive >> >> > > > when >> >> > > > > you have a lot of iterations. >> >> >> > > > > Diff the file I attached with the original file (rev. 5996) I >> >> > > > > made only a >> >> > > > > small change on the bind() method, and it's compatible with data >> >> > > > > and with >> >> > > > > out API. >> >> >> > > > > On Thu, Dec 25, 2008 at 3:05 AM, Balazs Endresz < >> >> > > > balazs.endr...@gmail.com>wrote: >> >> >> > > > > > Hi, I think this would be really useful! I've also modified >> >> > > > > > jQuery to >> >> > > > > > do this a while ago (1.2.6) but with the new scope being the >> >> > > > > > last >> >> > > > > > argument, so it works without the data object as well: >> >> >> > > > > > jQuery.fn.bind=function( type, data, fn, bind ) { >> >> > > > > > return type == "unload" ? this.one(type, data, >> >> > > > > > fn) : >> >> > > > > > this.each >> >> > > > > > (function(){ >> >> > > > > > if( $.isFunction(data) ) >> >> > > > > > jQuery.event.add( this, type, >> >> > > > > > data, >> >> > > > bind, fn >> >> > > > > > ); >> >> > > > > > else >> >> > > > > > jQuery.event.add( this, type, >> >> > > > > > fn, data, >> >> > > > bind >> >> > > > > > ); >> >> > > > > > }); >> >> > > > > > } >> >> >> > > > > > jQuery.event = { >> >> > > > > > add: function(elem, types, handler, data, bind) { >> >> > > > > > if ( elem.nodeType == 3 || elem.nodeType == 8 ) >> >> > > > > > return; >> >> >> > > > > > if( bind != undefined ) >> >> > > > > > handler = jQuery.bind(handler, bind); >> >> > > > > > //change >> >> > > > scope >> >> > > > > > ... >> >> >> > > > > > jQuery.each( >> >> > > > > > ("blur,focus,load,resize,scroll,unload,click,dblclick," + >> >> >> > > > "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," >> >> > > > > > + >> >> > > > > > >> >> > > > > > "change,select,submit,keydown,keypress,keyup,error").split(","), >> >> > > > > > function(i, name){ >> >> >> > > > > > // Handle event binding >> >> > > > > > jQuery.fn[name] = function(fn, bind){ //second argument >> >> > > > > > for the >> >> > > > > > scope >> >> > > > > > return fn ? this.bind(name, fn, bind) : >> >> > > > this.trigger(name); >> >> > > > > > }; >> >> > > > > > }); >> >> >> > > > > > where jQuery.bind is: >> >> >> > > > > > jQuery.bind=function( fn, bind ){ >> >> > > > > > var args = $.makeArray( arguments ).slice(2); >> >> > > > > > if( args.length == 1 && $.isArray( args[0] ) ) >> >> > > > > > args = args[0]; >> >> > > > > > return function(){ >> >> > > > > > return fn.apply( bind, args ); >> >> > > > > > } >> >> > > > > > } >> >> >> > > > > > On Dec 25, 10:38 am, "Eduardo Lundgren" >> >> > > > > > <eduardolundg...@gmail.com> >> >> > > > > > wrote: >> >> > > > > > > Hi guys, >> >> >> > > > > > > The .bind() method consider the scope of the handler the >> >> > > > > > > element >> >> > > > whose >> >> > > > > > the >> >> > > > > > > event is assigned - that is the correct as default. >> >> >> > > > > > > I've been playing with the event.js and implemented an >> >> > > > > > > alternative to >> >> > > > > > call >> >> > > > > > > .bind(), specifying another scope, that looks useful for our >> >> > > > > > > api. >> >> >> > > > > > > I've attached the event.js modified from the rev. 5996 from >> >> > > > > > > the >> >> > > > trunk. >> >> > > > > > > The changes are compatible with the current API. >> >> >> > > > > > > Here goes one example: >> >> >> > > > > > > var scopeTest = function() { >> >> > > > > > > this.name = "iamanotherscope"; >> >> >> > > > > > > this.internalHandler = function(event) { >> >> > > > > > > console.log("I am another scope method.", >> >> > > > this.name, >> >> > > > > > > event, event.data); >> >> > > > > > > }; >> >> > > > > > > }; >> >> >> > > > > > > var scope = new scopeTest(); >> >> >> > > > > > > $('div').bind('click', {data: true}, globalHandler); >> >> > > > > > > $('div').bind('click', {data: true}, >> >> > > > scope.internalHandler); >> >> > > > > > // >> >> > > > > > > handler, data, default scope >> >> > > > > > > $('div').bind('click', {data: true}, scope, >> >> > > > > > > scope.internalHandler); // handler, data, pre-defined scope >> >> >> > > > > > > Let me know if make sense for you. >> >> >> > > > > > > -- >> >> > > > > > > Eduardo Lundgren >> >> > > > > > > Software Engineer >> >> > > > > > > Liferay, Inc. >> >> > > > > > > Enterprise. Open Source. For Life. >> >> >> > > > > > > event.js >> >> > > > > > > 26KViewDownload >> >> >> > > > > -- >> >> > > > > Eduardo Lundgren >> >> > > > > Software Engineer >> >> > > > > Liferay, Inc. >> >> > > > > Enterprise. Open Source. For Life. >> >> >> > > -- >> >> > > Eduardo Lundgren >> >> > > Software Engineer >> >> > > Liferay, Inc. >> >> > > Enterprise. Open Source. For Life.