דלג לתוכן
מדריכים בעברית - G4A - אתר המדריכים הישראלי
חיפוש
סגור את תיבת החיפוש
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

JavaScript – setTimeout & setInterval

setTimeout ו-setInterval הן מתודות שנועדו לתזמון, נוכל להשתמש בהן על מנת שנוכל לתזמן קריאה לפונקציה למשל, ועוד שימושים מבוססי תזמון

תארו לכם מצב שבו עלינו לתזמן יציאה לפועל של פונקציה.
בשפת JavaScript קיימות 2 מתודות שיכולות לסייע לנו בפעולות מסוג זה – setTimeout ו-setInterval.
במאמר זה נעבור על שתיהן ונבאר את אופן פעולתן.

setTimeout

setTimeout היא מתודה אשר מאפשרת לנו להריץ פונקציה לאחר אינטרוול הזמן.
במילים אחרות נוכל פשוט לומר שנשתמש בה כאשר אנו מעוניינים להריץ פונקציה לאחר פרק זמן מסוים.
פונקציה זו כוללת מספר העמסות:

setTimeout(function);
setTimeout(function, delay);

setTimeout(function, delay, param1);
setTimeout(function, delay, param1, param2);
setTimeout(function, delay, param1, param2,param3,etc…);

שימו לב כי הכוונה ב-3 ההעמסות הנוספת היא שנוכל לשלוח כמה פרמטרים נוספים שנרצה.

  • function – הפונקציה שברצוננו שתרוץ בחלוף הזמן.
  • delay – פרק הזמן שהרצת הפונקציה תתעכב, כלומר השהייה.
  • param – ארגומנטים נוספים שנרצה לשלוח לפונקציה.

 

*אם נרצה, נוכל להסיר setTimeout על ידי שימוש ב-()clearTimeout.
שימו לב לקטע הקוד הבא שיבאר את פעולתה של המתודה setTimeout:

var timeout = setTimeout(() => console.log('hello, world! 1'), 1000);
console.log('hello, world! 2');
console.log('hello, world! 3');
JavaScript - setTimeout
JavaScript – setTimeout

בדוגמא זו ראינו כיצד עוררנו את הפונקציה שהזנו כפרמטר ל-setTimeout לאחר שניה.
ובזמן השהייה זו הוצאנו לפועל פונקציות אחרות, כלומר שמה שעשינו זה לעורר (invoke) את הפונקציה בזמן הרצוי.
בהחלט דבר שימושי למקרים מסוימים, אך תארו לכם את הסיטואציה הבאה:

אנו מעוניינים שלאחר חלוף ההשהיה וריצת הפונקציה פעולה זו תחזור על עצמה שוב ושוב.
ובכן, נוכל ליצור התנהגות זו באמצעות setTimeout אם ממש נרצה, אך האמת שלשם כך יש לנו את setInterval.

setInterval

setInterval – מתודה זו מאפשרת לנו להריץ פונקציה לאחר אינטרוול הזמן, ולחזור על כך ברצף למשך אינטרוול זמן.
אמנם נשמע מבלבל ולא ברור, אך בואו נראה כיצד setInterval עובד.
ל-setInterval יש תחביר זהה לזה של setTimeout:

setInterval(function);
setInterval(function, delay);

setInterval(function, delay, param1);
setInterval(function, delay, param1, param2);
setInterval(function, delay, param1, param2,param3,etc…);

כלומר שגם כאן הכוונה היא שנוכל לשלוח כמה פרמטרים נוספים שנרצה.

  • function – הפונקציה שברצוננו שתרוץ בכל פרק זמן מוגדר (פרק הזמן מוגדר בפרמטר delay).
  • delay – זמן ההשהיה במילי-שניות שהרצת הפונקציה אמורה להתעכב בכל אינטרוול.
  • param – ארגומנטים נוספים שנרצה לשלוח לפונקציה.

*אם נרצה, נוכל להסיר setInterval על ידי שימוש ב-()clearInterval.

שימו לב ל- Code Snippet הבא שידגים את setInterval בפעולה:

var count = 0;

var intervalID = setInterval((myVar) => {
    console.log(count * myVar); 
    count < 10 ? count++ : clearInterval(intervalID); 
}, 500, '1');

בדוגמא זו הדפסנו מספר בכל אינטרוול שאורך כחצי שניה (500 מילי-שניות), כאשר הגענו ל-10 הסרנו את ה-setInterval.
כארגומנט נוסף שלחנו את הספרה 1, ובכל אינטרוול העלנו את ערכו של המשתנה count,
לאחר מכן הדפסנו את הערך ששלחנו כארגומנט פי ערכו של count:

כעת בואו נבחן מימוש מעט יותר מורכב של setInterval.

איך ליצור טיימר באמצעות שימוש ב-setInterval

במהלך לימודיי, באחד משיעורי JavaScript נתקלתי בבעיה יפה אשר לה נדגים פתרון אפשרי באמצעות setInterval.
נתבקשנו לקבל תאריך לידה מן המשתמש, ולחשב כמה זמן נשאר לו לחיות,
הנחת היסוד שבה השתמשנו היא שתוחלת החיים היא 100 כביכול לצורך התרגיל, נתבקשנו לציין שנים, חודשים וימים.
עד כאן כמובן שזוהי בעיה שניתן לפתור באמצעות שימוש באובייקט Date של JavaScript,
אך משום שרציתי להראות את זמן החיים שנותר כטיימר שסופר אחורה – השתמשתי ב-setInterval.

ראשית ניצור את קבצי ה-HTML ו-CSS שלנו:

<!DOCTYPE html>
<html>

<head>
    <link rel="stylesheet" href="styles.css">
    <meta charset="utf-8" />
</head>

<body>

    <div class="container">

        <form>
            <label for="date">Date Of Birth</label>
            <input id="date" type="date" name="date" min="1930-01-01" max="2022-01-01" required />
            <input type="button" id="btn" name="btn" value="click">

            <label>Timer</label>
            <div class="container2" name="container2">
                <input type="textarea" id="txt_years" name="txt_years">
                <input type="textarea" id="txt_days" name="txt_days">
            </div>

            <div class="container2">
                <input type="textarea" id="txt_hours" name="txt_hours">
                <input type="textarea" id="txt_minutes" name="txt_minutes">
                <input type="textarea" id="txt_seconds" name="txt_seconds">
            </div>
        </form>

    </div>
    
</body>

</html>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@500&display=swap');

body {
    font-family: Poppins, "Sans Serif";
    font-size: 46px;
    font-weight: bold;
    text-shadow: 1px 5px 9px rgb(71, 68, 68);
    color: rgb(39, 44, 42);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    height: 100vh;
	background-image: linear-gradient(to top left, #e2e2e2 , #f5f5f5);
}

#btn {
	font-family: Poppins, "Sans Serif";
	background-color: #3f87ca;
	color: #ffffff;
    width: 100%; 
    border-radius: 4px; 
	padding: 5px;
	margin: 5px;
	width: 28%;
    margin: 5%;
    font-size: 22px;
    border: 2px outset #ccc; 
}
#btn:hover {
	background-color: #3c3c3c;
}

.container {
    border-radius: 15px 0 15px 0;
    display: flex;
    align-items: center;
    flex-direction: column;
    flex-wrap: wrap;
    justify-content: center;
    box-shadow: 3px 3px #cfcfcf;
	background-image: linear-gradient(to right bottom, #e2e2f2 , #f5f5f5);
}
.container2 {
    display: flex;
    align-items: center;
    flex-direction: row;
    justify-content: space-around;
}
.container form{
    margin: 5%;
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: center;
}

input[type=date], input[type=textarea] {
    font-family: Poppins, "Sans Serif";
    margin-top: 5%;
    border: 2px inset #ccc; 
    border-radius: 4px; 
    border-color: beige;
    width: 50%;
    height: 46px;
    font-size: 28px;
  }

#txt_years, #txt_days, #txt_hours, #txt_minutes, #txt_seconds{
    border: 2px inset #ccc; 
    border-radius: 4px; 
    border-color: beige;
    align-items: center;
    height: 46px;
    width: 20%;
}
#txt_years, #txt_days {
    width: 40%;
}

כעת מה שנותר לנו זה ליצור את קוד ה-JavaScript שיבצע את החישוב ויחזיר לנו טיימר.
שימו לב לקטע הקוד הבא שיבצע זאת ומיד נבאר אותו:

const btn = document.querySelector("#btn");
const txt_years = document.querySelector("#txt_years");
const txt_days = document.querySelector("#txt_days");
const txt_hours = document.querySelector("#txt_hours");
const txt_minutes = document.querySelector("#txt_minutes");
const txt_seconds = document.querySelector("#txt_seconds");

btn.addEventListener("click", _ => {
    const today = new Date();
    const result = document.querySelector('input[type="date"]');
    validate(result, today)? countDown(today) : alert("please enter correct date");
});

function validate(result, today){
    const year = new Date(result.value).getFullYear();
    return date.value != "" && (year > 1930 && year < today.getFullYear()) ? true : false;
}

function countDown(date) {
    date.setFullYear(date.getFullYear() + 100);
    var countDownDate = date.getTime();

    var timer = setInterval(_ => {
        var now = new Date().getTime();
        var diffrence = countDownDate - now;

        var days = Math.floor(diffrence / (1000 * 60 * 60 * 24));
        var hours = Math.floor((diffrence % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        var minutes = Math.floor((diffrence % (1000 * 60 * 60)) / (1000 * 60));
        var seconds = Math.floor((diffrence % (1000 * 60)) / 1000);
        
        diffrence = Math.floor((countDownDate - now) / 86400000);

        var years = diffrence >= 365 ? years = Math.floor(diffrence / 365) : years = 0;

        txt_years.value = `years: ${years}`;
        txt_days.value = `days: ${days}`;
        txt_hours.value = `hours: ${hours}`;
        txt_minutes.value = `minutes: ${minutes}`;
        txt_seconds.value = `seconds: ${seconds}`;

        if (diffrence < 0) {
            clearInterval(timer);
            alert("the end");
        }
    }, 1000);
};

מה שעשינו כאן בעצם זה לקחת את התאריך שהוזן,
השתמשנו ב- EventListener על מנת להאזין לקליק על הכפתור,
ביצענו עליו ולידציה על מנת למנוע תקלות בחישוב,
ולבסוף נכנסנו לפונקציה שבתוכה הגדרנו את הטיימר שלנו (ה-setInterval).
ה-setInterval שהגדרנו עובד כך שהוא מחזיר בכל אינטרוול את הפרש הזמן בין אותו הרגע לבין סוף חייו של האדם בעל התאריך המוזן,
ולכן מה שיוצא לנו כאן זה טיימר, כי זמן ההשהיה שהגדרנו הוא שניה (1000 מילי-שניות),
כלומר שה-view יתעדכן בהפרש זמן חדש ורלוונטי שיוצג מחדש בכל שניה.
אם נריץ את התוכנית, נוכל לקבל את התוצאה הבאה:

לקריאה מורחבת על setInterval יש ללחוץ כאן.

אהבתכם את המדריך? פתר לכם תקלה? הזמינו את כותב המדריך לכוס קפה

גולשים יקרים, התכנים המוצגים באתר נכתבים בהתנדבות מלאה מתוך כוונה להנגיש מידע עבורכם. אם נתקלתם במדריך חינמי שפתר לכם תקלה או לימד אתכם משהו חדש שלא ידעתם, וברצונכם לתגמל את כותב המדריך או סתם להזמין אותו לכוס קפה, הינכם יותר ממוזמנים לתרום.

ניתן לתרום 10, 15, 20 או כל סכום אחר שתרצו באמצעות כרטיס אשראי \ Paypal

בניית אתרים webpress

רוצים לשתף את המדריך?

כתיבת תגובה לבטל

האימייל לא יוצג באתר. שדות החובה מסומנים *

הזמינו אותי לכוס קפה
buy me coffee

אהבתכם את המדריך? פתר לכם תקלה? הזמינו את כותב המדריך לכוס קפה

גולשים יקרים, רוב התכנים המוצגים באתר נכתבים בהתנדבות מלאה מתוך כוונה להנגיש מידע עבורכם. אם נתקלתם במדריך חינמי שפתר לכם תקלה או לימד אתכם משהו חדש שלא ידעתם, וברצונכם לתגמל את כותב המדריך או סתם להזמין אותו לכוס קפה, הינכם יותר ממוזמנים לתרום.

资讯网北京二手房交易周期无限流小说推荐狄更斯起名什么时候合适2020年春节啥时候贴对联又好黄海波主演的电视剧网站模板seo优化万妖之祖民间借贷赢在作文商丘到阿克苏的火车网站搜索引擎内部优化推广营销网址网站制作图片今日算命今日运程装饰网站设计男人起名打分超人总动员下载电影天堂上海网站定制设计教育公司书法起名历史进程seo关键字优化.优选品达seo公司取名字周易免费查询检测桑黄菌的技术栽培网上付费起名字姓夏女孩宝宝起名雷安情侣网名免费学服装设计的网站上海公司网站制作周乐易少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化