Bleh.
When I pass a function in via the plugin's method with the below code, it
doesn't recognize the "this" scope anymore. Am I not passing the function
in correctly?
$('input:[EMAIL PROTECTED]').each( function() {
$(this).autoSave(function(){
$.AjaxCFC({
url: "some.cfc",
method: "updateAttendee",
data: {
fid:this.id,
field:this.id.split("_")[0],
id:this.id.split("_")[1],
value:this.value},
success: function(r){}
});
});
Daemach wrote:
>
> This last example helped. I think I have it now :)
>
> jQuery.fn.autoSave = function(fcn,settings) {
> settings = jQuery.extend({
> delay: 600,
> beforeClass: "asBefore",
> afterClass: "asAfter"
> }, settings);
>
> createCSSClass(".asBefore", "background-color:#FFdddd");
> createCSSClass(".asAfter", "background-color:#ddFFdd");
>
> if (!window.aSc) {
> aSc = new Object();
> aSc["timer"] = new Array();
> aSc["fn"] = new Array();
> }
>
> var p = aSc["fn"].length;
>
> aSc["timer"][p] = null;
> aSc["fn"][p] = function(e) {
>
> if (e && e.type == 'blur') {
> if (aSc["timer"][p])
> window.clearTimeout(aSc["timer"][p]);
> }
>
> if (this.value != this.title){
> fcn();
>
> jQuery(this).removeClass(settings.beforeClass).addClass(settings.afterClass);
> }
> }
>
> return this.each(function(){
> jQuery(this).attr("title",this.value).keyup(function() {
> if (this.value != this.title){
> if (jQuery(this).is('.' + settings.afterClass))
> jQuery(this).removeClass(settings.afterClass);
> if (!jQuery(this).is('.' + settings.beforeClass))
> jQuery(this).addClass(settings.beforeClass);
>
> var self = this;
> aSc["timer"][p] = window.setTimeout(function()
> {aSc["fn"][p].apply(self);},settings.delay);
> }
> }).keydown(function() {
> if (aSc["timer"][p])
> window.clearTimeout(aSc["timer"][p]);
> }).blur(aSc["fn"][p]);
>
> });
> };
>
> Blair Mitchelmore-2 wrote:
>>
>> Functions in JavaScript run at a certain scope. A lot of the time, if
>> the function isn't a part of some Object that scope defaults to the
>> window object. All JavaScript functions also have two functions that
>> allow you to redefine the scope of a function as you call it: apply and
>> call. apply takes 2 arguments: the new scope to call the function under
>> and an array of arguments to call the function with. call does the same
>> thing but instead of an array of arguments, you just supply the
>> arguments as additional arguments to that function call.
>>
>> Example:
>> var scope = "Scope";
>> var arg = "Arg";
>> var fn = function(e) {
>> window.alert(this + " => " + e);
>> };
>> fn(arg); // alerts " => Arg"
>> fn.apply(scope,[arg]); // alerts "Scope => Arg"
>> fn.call(scope,arg); // alerts "Scope => Arg"
>>
>> This allows you to redefine the this variable on the fly. Additionally,
>> the reason self is used rather than this in fn.apply(self) is because
>> 'this' changes scope once you enter a new function. So inside the
>> anonymous function defined in the setTimeout call, the scope variable
>> 'this' is likely to be the window object. So you have to save a
>> reference to the 'this' you want to use as a separate variable so it can
>> be referenced elsewhere: hence self = this followed by (inside the
>> anonymous function) fn.apply(self).
>>
>> -blair
>>
>> Daemach wrote:
>>> Yeah that worked. I'm not certain I understand why though :)
>>>
>>> It does make sense that the closure would actually have to be created
>>> inside
>>> the event handler but .apply(self) is a new one for me. What exactly is
>>> that doing?
>>>
>>>
>>> Blair Mitchelmore-2 wrote:
>>>> $(document).ready( function() {
>>>> var timer;
>>>> var fn = function(e) {
>>>> if (e && e.type == 'blur') {
>>>> if (timer)
>>>> window.clearTimeout(timer);
>>>> }
>>>> // Do stuff
>>>> alert(this.id);
>>>> }
>>>> $('#test').blur(fn).keyup(function() {
>>>> var self = this;
>>>> timer = window.setTimeout(function() {
>>>> fn.apply(self);
>>>> },2000);
>>>> }).keydown(function() {
>>>> if (timer) window.clearTimeout(timer);
>>>> });
>>>> });
>>
>> _______________________________________________
>> jQuery mailing list
>> [email protected]
>> http://jquery.com/discuss/
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/Gmail-style-updates-tf3269331.html#a9124486
Sent from the JQuery mailing list archive at Nabble.com.
_______________________________________________
jQuery mailing list
[email protected]
http://jquery.com/discuss/