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.

Reply via email to