タイムアウトを設定するだけです。
var tim;//global, I'll provide a (more complex) solution that doesn't need them, too
function loadPopupBox() { // to load the Popupbox
$('#popup_box').fadeIn("slow");
tim = setTimeout(function()
{
$('#popup_box').click();
},30000);
}
$('#popupBoxAccept').click( function() {
clearTimeout(tim);
});
現在、EVILグローバル変数を使用せずに:
$(document).ready(function()
{
(function(popup,accept,decline)
{
popup.fadeIn("slow");
var tim = setTimeout(function()
{
accept.click();//<-- access to reference is preserved
},30000);
accept.click(function()
{
clearTimeout(tim);
//do accept stuff
});
decline.click(function()
{
clearTimeout(tim);//<-- need that here, too!
//do decline stuff
});
})($('#popup_box'),$('#popupBoxAccept'),$('#popupBoxDecline'));
//pass all 3 elements as argument --> less typing, and is more efficient:
//the DOM is only searched once for each element
});
なぜこれが便利なのですか?var tim
シンプル:タイムアウトへの参照を失うことなく、別のコンテキストで使用できるようになりました。クロージャ、名前はそれをすべて言います:すべての変数と参照は同じスコープにきちんとバンドルされており、アクセスすることはできませんが、スコープ内から宣言されています:
var foo = (function()
{
var invisible = 'Now you see me';
return function()
{
return invisible;
}
};
console.log(invisible);//<-- undefined
var invisible = 'Now you don\'t';
console.log(foo());//<-- Now you see me
console.log(invisible);//Now you don\'t