2016-08-17 8 views
1

setSlide、setMobile、およびhideによって提供される機能を扱う単一の関数を定義し、遅延の発生時にSetTimeoutによって呼び出される関数を渡すだけです。私はこれを行う方法がわかりません。誰かがこれを達成する方法を説明してもらえますか?ありがとうございました。他の関数の機能を扱う単一の関数を定義する

(function($) { 
var currentTime = new Date().getTime()/1000; 

var setSlide = function (timeout) { 
    setTimeout(showSlide, timeout * 1000); 
}, 
showSlide = function() { 
    $('.newsletter-popup').addClass('slide-left'); 
}, 
setMobile = function (timeout) { 
    setTimeout(showMobile, timeout * 1000); 
}, 
hide = function (timeout) { 
    setTimeout(hideMobile, timeout * 1000); 
}, 
showMobile = function() { 
    $('.newsletter-popup').removeClass('hidden'); 
}, 
hideMobile = function() { 
    $('.newsletter-popup').addClass('hidden'); 
}; 
$(document).ready(function() { 

    if (readCookie('nl_suppress')) { 
     $('.newsletter-popup').removeClass('slide-left'); 
    } else if (!readCookie('nl_display')) { 
     setSlide(10); 
    } else if (currentTime - readCookie('nl_display') > 86400) { 
     showSlide(); 
    } else { 
     setSlide(currentTime - (readCookie('nl_display') + 86400)); 
    } 

    $('.nlForm').submit(function() { 
     createCookie('nl_suppress', new Date(), 30); 
    }); 

    function checkCookie() { 
     var date = new Date(); 
     date.setTime(date.getTime() + (86400000)); 
     $('.newsletter-popup').removeClass('slide-left'); 
     hide(1); 

     if(readCookie('nl_display')) { 
      // already been clicked once, hide it 
      createCookie('nl_suppress', new Date(), 180); 
      return; 
     } 
     // first time this is clicked, mark it 
     createCookie('nl_display', new Date().getTime()/1000, 180); 
     setMobile(14); 
     setSlide(15); 
    }; 

    $('.newsletter-close').on('click', checkCookie); 
}); 
})(jQuery); 
+0

単一の機能をどのように表示する必要がありますか? – zhon

答えて

1

それは本当に簡単です:

const callFunctionWithTimeout = (fn, timeout) => setTimeout(fn, timeout * 1000) 

その後、代わりにsetSlide(10)の例については、あなたが行う:あなたが同じことを行う関数を作成したいよう

callFunctionWithTimeout(showSlide, 10) 
+0

ありがとうございました!これは完璧に機能しましたが、そのオプションを使用してクロスブラウザをサポートすることには懸念がありました。 – Chad

+0

@Chadブラウザ間でのサポートが必要な場合は、[Babel](https://babeljs.io/)を使用してコードをコンパイルできます。 –

2

をですねsetTimeoutと同じですが、遅延には1000が掛けられて秒単位になります。

それは次のようになります。

function setTimeoutSeconds(func, delay) { 
    setTimeout(func, delay * 1000); 
} 

代わりsetSlidesetMobile、またはhideを呼び出す次に、あなたが希望するコールバックでsetTimeoutSecondsを呼び出します。

setTimeoutSeconds(hideMobile, 1); 
setTimeoutSeconds(showMobile, 14); 
setTimeoutSeconds(showSlide, 15); 

あなたはまだsetSlide ...などの機能を持っていると思った場合は、部分的に適用される関数を使用できます。

function applyTimeout(func) { 
    return function(delay) { 
     setTimeout(func, delay * 1000); 
    } 
} 

をし、このようにそれらを作成します。

var setSlide = applyTimeout(showSlide); 

これを同じ方法で呼び出します。

setSlide(15); 
関連する問題