2012-12-01 26 views
0

我有一個等待功能的需要,開始與以下內容:`返回this`,用正確的(保留)chainability

var delay = (function() { 
    return function(callback, ms) { 
     setTimeout(callback, ms || 1000); 
    }; 
})(); 

delay(function() { 
    $('#foo').animate({ 
     height: 180 
    }, 1000); 
}); 

移植再到jQuery的:

jQuery.fn.wait = function(callback, seconds) { 
    return this.each(function() { 
     return setTimeout(callback, seconds || 1000); 
    }); 
}; 

$('#second').wait(function() { 
    $('#second').addClass('foo'); // works well 
});​ 

$('#second').wait(function() { 
    $(this).addClass('foo'); // `this` will not work here 
});​ 

...這裏與我的最後一個實例更好的問題,或者我怎樣才能解決這個問題:在混亂結束了? this看起來在此間舉行的window -object,而不是實際的#second - 元素...

除此之外,是否有可能讓「鏈」只是走的更遠,如果超時爲0?因此,如果我們有以下情況,只有在定時器結束時纔會添加該類:

$('#second').wait().addClass('foo'); 
+0

使用'this'的'setTimeout' ...'this'是'window' – charlietfl

+0

邑,謝謝,@SLaks有反駁這個問題了。 ..對我最後一句話中的問題有任何想法? – yckart

+0

仍然不是鏈接問題...您仍然獲得鏈接性,元素本身從您的插件返回。 'setTimeout'中的上下文是不同的問題。添加成功的動畫回調類 – charlietfl

回答

0

爲什麼this不給你你想要的元素的原因是因爲你想在使用它功能您沒有設置一個背景下,嘗試內

jQuery.fn.wait = function(callback, seconds) { 
    return this.each(function() { 
     var self = this 
     return setTimeout(function(){ 
        callback.call(self); 
       }, seconds || 1000); 
    }); 
}; 
+0

Yap,謝謝,@SLaks已經駁斥了這個問題......對於最後一句話中的問題有任何想法? – yckart

+0

@yckart你說'根據這個'(粗體),根據什麼? – Musa

+0

英語不是我真正的母語,抱歉誤導!我更新了我的問題... – yckart

0

這與鏈接無關。
鏈接意味着在您的方法的返回值上調用其他jQuery方法。 ($(...).wait(...).somethingElse())。
您的方法已支持鏈接,因爲它返回this(通過this.each(),本身可鏈接)。

你問如何調用回調與特定this值:

var self = this; 
callback.call(self); 
+0

閱讀我最後的句子......這是一個鏈接問題!不過,謝謝你的回答! ;) – yckart

+0

@yckart:否;它不是鏈接的。看我的編輯。 – SLaks