Ah, JS is a bit quirky, but those quirks are kind of what makes it so useful and great. This is my understanding of it...
First off, functions are just another type of object in JS. So if you have a function: function foo(){ alert('foo'); } you can run that function by doing "foo()", or you can refer to it as a variable as "foo" - notice the lack of parentheses. So now take your case, where you want to register a function as a callback for something else. The idea is that whatever you pass in for onSuccess should be a function object that will be called later, you don't want to run that function right then. So you need to pass in the variable that is your function, not run the function itself. The tricky thing is that when you refer to the function as a variable, if it is inside some other object, it doesn't know about the "this" object when it is called for execution later. I don't know why that is, it just is the way of the JS world I guess. So the prototype.js library adds a "bind()" method to the function object. That method returns a function - and that's confusing. It returns a function that remembers the "this" argument that you pass in, and when executed it will run the method you have bound against that. So in practice this is what happens: 1) onSuccess: this.switchPrompt(evt) This would just run the switchPrompt function and set onSuccess to the value it returns... not what you want. 2) onSuccess: this.switchPrompt This would register that function variable as the callback, but it probably wouldn't work because it won't be able to access the "this" object when it runs. Not what you want. 3) onSuccess: this.switchPrompt.bind(this) Will create a fake function for you and return that, so the callback is properly set to a function variable that can be run and will remember it's "this" parent object. That's what you want. Hope that is accurate / helpful. It's certainly confusing :-) rahul -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Jason Hummel Sent: Thursday, October 27, 2005 12:09 PM To: rails-spinoffs@lists.rubyonrails.org Subject: Re: [Rails-spinoffs] Problem passing event object Thanks for the feedback, the bind(this) worked like a charm, I was beating my head against my monitor trying to come up with a solution. I'm confused, though, as to why javascript loses the reference to "this" without that bind method can somebody explain? Also why doesn't onSuccess: this.switchPrompt.bind(this) fire automatically, because it has "()" at the end. I know I tried this.switchPrompt(evt) at one point, and instead of pointing the switchPrompt method to be fired onSuccess, it just always fired it automatically - because it had the parenthases at the end. Thanks for the other thoughts as well, I implemented both of them, just to be on the safe side. On 10/27/05, Rahul Bhargava <[EMAIL PROTECTED]> wrote: > A few thoughts : > > 1) You need to bind the object to get it to work: > onSuccess: this.switchPrompt.bind(this), > onFailure: this.dontCheck.bind(this) > that will fake out Javascript and set up the "this" reference to work > correctly for you I think. > > 2) On another note, I've noticed that it's appropriate to use the > Event.observe() method to set up onclick listeners. For instance: > > Event.observe(this.chkbox, > 'click',this.switchRequired.bindAsEventListener(this)); > > In this case it probably makes no difference, but in general it helps > you around browser inconsistencies with events and listeners. > > 3) Do you really want to cache the whole event? I don't know if that > will cause any weirdness because of the browser trying to destroy it or > something. In general I would cache the source of the event only, which > is probably what you need anyway: > this.cache = Event.element(evt); > but maybe I'm wrong and you do want the whole event and caching it is > not a problem. _______________________________________________ Rails-spinoffs mailing list Rails-spinoffs@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs _______________________________________________ Rails-spinoffs mailing list Rails-spinoffs@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs