So I definitely agree that having a single, one-off, API addition (to
bind and live) is kind of lame - especially when it conflicts with the
jQuery way of defining the methods (having a non-callback argument
being last).

I sat down and wrote up a quick jQuery.bind() but found one critical
issue that was not resolved by the hitch/bind/fn.prototype.bind
technique: You can't (easily) unbind a function that has a different
scope defined.

For example:

function foo(){}
.bind( "click", foo.bind(someObject) );
.unbind( "click", foo /* errr.... we actually need to save the fn
somewhere */ );

jQuery has already solved this problem internally using our
jQuery.event.proxy method - and, in fact, if I were to land a
jQuery.bind() it would end up using jQuery.event.proxy(). But if you
look at jQuery.event.proxy() you can see that, in reality, we could
just be using that method and skip this whole dance entirely. For
example (and this works today, in jQuery 1.3.2):

function foo(){}
.bind( "click", jQuery.event.proxy( foo, someObject ) );
.unbind( "click", foo );

Save for the sugar that hitch provides I can't see any reason to not
just promote jQuery.event.proxy() to jQuery.proxy() and make it an
officially supported part of the jQuery API.

Filed: http://dev.jquery.com/ticket/5736
Landed (in a branch, for review and further discussion):
http://github.com/jquery/jquery/commit/66975de2d249643779e2b3daad0457f7f5f92508

--John

For fun, here is the jQuery.bind() that I quickly wrote (that DOESN'T
use jQuery.proxy):

diff --git a/src/core.js b/src/core.js
index 944e8a9..1908123 100644
--- a/src/core.js
+++ b/src/core.js
@@ -614,6 +614,20 @@ jQuery.extend({
                return ret.concat.apply( [], ret );
        },

+       bind: function( scope, fn ) {
+               if ( scope ) {
+                       if ( typeof fn === "string" ) {
+                               fn = scope[ fn ];
+                       }
+
+                       if ( fn ) {
+                               return function() {
+                                       return fn.apply( scope, arguments );
+                               };
+                       }
+               }
+       },
+
        // Use of jQuery.browser is frowned upon.
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
        browser: {




On Tue, Dec 29, 2009 at 4:58 PM, Rick Waldron <waldron.r...@gmail.com> wrote:
> This is exactly what I was getting at... With regard to event handler
> .bind() and fn.bind()
>
> So far with my $.hitch tests, the one thing I dislike is the argument
> structure. It does what it should but I'd much prefer
> a function.prototype.bind() if given the choice.
>
>
>
> -- Sent from my Palm Prē
> ________________________________
> ajpiano wrote:
>
> I love the idea of extending scope manipulation to any function,
> rather than only event handlers. Callbacks to ajax requests often
> need a better scope than the XHR, and while I look forward to 1.4's
> functionality for event handlers, it would really be a shame to
> continue to force people to use non-jQuery solutions for full scope
> manipulation.
>
> That said, and while I do love (and frequently recommend) $.hitch, I
> prefer an approach more like Prototype or Underscore's that doesn't
> involve passing so many strings.
>
> --adam
>
> On Dec 29, 3:45 pm, Peter Higgins <phigg...@gmail.com> wrote:
>> It is a short-port of Dojo's dojo.hitch(). The only thing it doesn't do
>> that Dojo's does is currying the arguments in the original hitched
>> function, eg:
>>
>> // a bad example off the top of my head
>> var x = $(".nodes");
>> var clicker = $.hitch(x, "bind", "click");
>>
>> clicker(function(e){
>>     // this just called $(.nodes").bind("click", arguments[0])
>>
>> });
>>
>> It would be another few bytes to support that. dojo.partial is equally
>> as neat.
>>
>> Regards,
>> Peter
>>
>>
>>
>> Rick Waldron wrote:
>> > $.hitch() is a great "fn.bind()" solution, I still want to try a
>> > variety of scope related tests, but so far its really solid. I love
>> > the fact that you included the exception for a non existent  method, I
>> > referred to Prototype's latest and there is no such check.
>>
>> > Hats off.
>>
>> > Rick
>>
>> > On Tue, Dec 29, 2009 at 12:40 PM, Rick Waldron <waldron.r...@gmail.com
>> > <mailto:waldron.r...@gmail.com>> wrote:
>>
>> >     Agreed, that is slick. As soon as I get back to the office I'm
>> >     going to test it, I look forward to this.
>>
>> >     -- Sent from my Palm Prē
>>
>> >
>> > ------------------------------------------------------------------------
>> >     aHeckman wrote:
>>
>> >     Yeah this looks good Peter. This should be in core IMHO.
>>
>> >     BTW, you're running for president? LOL
>>
>> >     On Dec 29, 9:24 am, Peter Higgins <phigg...@gmail.com
>> >     <mailto:phigg...@gmail.com>> wrote:
>> >     > ... this is why I keep suggesting making the bind functionality as
>> >     > explicit function call, rather than hidden away in one or two
>> > api's:
>>
>> >     >http://higginsforpresident.net/js/static/jq.hitch.js
>>
>> >     > It does not extend any native prototypes, is useful and a bit
>> > magic
>> >     > (with the string->method resolution).
>>
>> >     > Regards,
>> >     > Peter
>>
>> >     > aHeckman wrote:
>> >     > > I too feel relying on a function.prototype.bind implementation
>> >     would
>> >     > > be the most forward looking but I'm not sure that jives with the
>> >     > > general approach of jQuery:
>>
>> >     > > jQuery doesn't extend Native.prototype.anything.
>>
>> >     > > On Dec 29, 1:12 am, Daniel Friesen <nadir.seen.f...@gmail.com
>> >     <mailto:nadir.seen.f...@gmail.com>> wrote:
>>
>> >     > >> Rick Waldron wrote:
>>
>> >     > >>> Available, as in the "scope" argument is being retrofitted to
>> > an
>> >     > >>> existing function, and ONLY to that function.
>>
>> >     > >>>     I don't get what you are talking about a fn.bind()
>> >     implementation in
>> >     > >>>     jQuery, or what you mean by available in just one
>> >     function though.
>>
>> >     > >>> Read ES5.
>>
>> >     > >>> function.prototype.bind()
>>
>> >     > >> I already read ES5, I use portions of ES5 in a number of js
>> >     server-based
>> >     > >> projects already.
>>
>> >     > >> However I don't get "ONLY" one function, since the whole point
>> > of
>> >     > >> .bind() is to bind a `this` onto ONE function with one call.
>> >     It's not
>> >     > >> bind otherwise.
>>
>> >     > >> So I don't see any limitation. Unless you are under the
>> >     > >> misinterpretation that after you have called .bind() on one
>> >     function you
>> >     > >> have modified that function and bound it's `this`. .bind()
>> >     doesn't
>> >     > >> modify the function, it returns a new one.
>> >     > >>  From ES5 15.3.4.5 Function.prototype.bind> The bind method
>> >     takes one or more arguments, thisArg and (optionally)
>>
>> >     > >>> arg1, arg2, etc, and returns a *new*
>> >     > >>> function object by performing the following steps:
>>
>> >     > >> So this is valid ES5 code.
>>
>> >     > >> "use strict";
>> >     > >> var a = function() { alert(this); };
>> >     > >> var a1 = a.bind("a");
>> >     > >> var a2 = a.bind("b");
>>
>> >     > >> a(); // Alerts undefined
>> >     > >> a1(); // Alerts "a"
>> >     > >> a2(); // Alerts "b"
>>
>> >     > >>> On Mon, Dec 28, 2009 at 7:43 PM, Daniel Friesen
>> >     > >>> <nadir.seen.f...@gmail.com <mailto:nadir.seen.f...@gmail.com>
>> >     <mailto:nadir.seen.f...@gmail.com
>> >     <mailto:nadir.seen.f...@gmail.com>>> wrote:
>>
>> >     > >>>     I made a post about how confusing people may find the
>> >     name bind some
>> >     > >>>     time ago. Suggested renaming bind to something like
>> >     event, and keeping
>> >     > >>>     bind as an alias of course. That was rejected.
>>
>> >     > >>>     I don't get what you are talking about a fn.bind()
>> >     implementation in
>> >     > >>>     jQuery, or what you mean by available in just one
>> >     function though.
>>
>> >     > >>>     ~Daniel Friesen (Dantman, Nadir-Seen-Fire)
>> >     > >>>     [http://daniel.friesen.name]
>>
>> >     > >>>     Rick Waldron wrote:
>> >     > >>>     > John,
>>
>> >     > >>>     > While I'm glad to see a scope arg available, i still
>> >     think this is
>> >     > >>>     > negligent to the future of jQuery and ES standards. I
>> >     really think a
>> >     > >>>     > fn.bind() implementation would ideal (since it would be
>> >     jQuery-wide
>> >     > >>>     > and not just available in one function), but as I've
>> >     noted in
>> >     > >>>     the past
>> >     > >>>     > and is exampled here, beginners may find this syntax a
>> >     bit boggling:
>>
>> >     > >>>     > $(foo).bind('event', fn.bind(bar) );
>>
>> >     > >>>     > Rick
>>
>> >     > >> ~Daniel Friesen (Dantman, Nadir-Seen-Fire)
>> >     [http://daniel.friesen.name]
>>
>> >     > > --
>>
>> >     > > You received this message because you are subscribed to the
>> >     Google Groups "jQuery Development" group.
>> >     > > To post to this group, send email to
>> >     jquery-dev@googlegroups.com <mailto:jquery-dev@googlegroups.com>.
>> >     > > To unsubscribe from this group, send email to
>> >     jquery-dev+unsubscr...@googlegroups.com
>> >     <mailto:jquery-dev%2bunsubscr...@googlegroups.com>.
>> >     > > For more options, visit this group
>> >     athttp://groups.google.com/group/jquery-dev?hl=en
>> >     <http://groups.google.com/group/jquery-dev?hl=en>.
>>
>> >     --
>>
>> >     You received this message because you are subscribed to the Google
>> >     Groups "jQuery Development" group.
>> >     To post to this group, send email to jquery-dev@googlegroups.com
>> >     <mailto:jquery-dev@googlegroups.com>.
>> >     To unsubscribe from this group, send email to
>> >     jquery-dev+unsubscr...@googlegroups.com
>> >     <mailto:jquery-dev%2bunsubscr...@googlegroups.com>.
>> >     For more options, visit this group at
>> >    http://groups.google.com/group/jquery-dev?hl=en.
>>
>> > --
>>
>> > You received this message because you are subscribed to the Google
>> > Groups "jQuery Development" group.
>> > To post to this group, send email to jquery-...@googlegroups.com.
>> > To unsubscribe from this group, send email to
>> > jquery-dev+unsubscr...@googlegroups.com.
>> > For more options, visit this group at
>> >http://groups.google.com/group/jquery-dev?hl=en.
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "jQuery Development" group.
> To post to this group, send email to jquery-...@googlegroups.com.
> To unsubscribe from this group, send email to
> jquery-dev+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/jquery-dev?hl=en.
>
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "jQuery Development" group.
> To post to this group, send email to jquery-...@googlegroups.com.
> To unsubscribe from this group, send email to
> jquery-dev+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/jquery-dev?hl=en.
>

--

You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to jquery-...@googlegroups.com.
To unsubscribe from this group, send email to 
jquery-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en.


Reply via email to