@yossiz כתב בinterval של JS מתעצל במלאכתו:
נראה לי שעיקר מה שנוגע אליך זה שהדפדפן עלול להשבית את הinterval אם הכרטיסייה לא פעילה
כבר רשמתי את הדף ברשימת הדפים שאין להשביתם, והבעיה נשארה עד שעשיתי כנ"ל.
@yossiz כתב בinterval של JS מתעצל במלאכתו:
נראה לי שעיקר מה שנוגע אליך זה שהדפדפן עלול להשבית את הinterval אם הכרטיסייה לא פעילה
כבר רשמתי את הדף ברשימת הדפים שאין להשביתם, והבעיה נשארה עד שעשיתי כנ"ל.
מעדכן שהסתדרתי על ידי אובייקט Date. אמנם התמיהה במקומה עומדת, אבל הבעיה המעשית נפתרה.
ראיתי שהשאלה נשאלה ב-stack overflow אך אין שם תשובה משכנעת. לפי המוסבר שם, שום שעון js לא אמור לעבוד.
בניתי את הסקריפט החמוד הזה טיימר שעות עבודה - עותק.html, ולכאורה הכל בסדר, אבל להפתעתי אחרי שעבדתי שעה הוא מציג חמש דקות...
מתברר שאחרי 75 שניות פעילות, ה-interval מתחיל להאט את פעילותו ולפעום אחת לשתי שניות, שלוש, עשר, והלאה.
מצורף הקוד המלא, העיקר בשורות 20 ומטה, ו-37 ומאה.
let timeElement = document.querySelector('#time'),
fractionalHoursElement = document.querySelector('#fractional-hours'),
hoursInputElement = document.querySelector('#hours-input'),
minutesInputElement = document.querySelector('#minutes-input'),
runButton = document.querySelector('#run'),
stopButton = document.querySelector('#stop'),
clearButton = document.querySelector('#clear'),
setTimeButton = document.querySelector('#set-time'),
hoursIncrementButton = document.querySelector('#hours-increment'),
hoursDecrementButton = document.querySelector('#hours-decrement'),
minutesIncrementButton = document.querySelector('#minutes-increment'),
minutesDecrementButton = document.querySelector('#minutes-decrement'),
myTimerInterval,
timer = Number(localStorage.timer) || 0,
isRunning = false;
function start() {
if (isRunning) return;
isRunning = true;
myTimerInterval = setInterval(() => {
timer++;
updateStorage(timer);
updateDisplay();
}, 1000);
}
function updateStorage(t) {
localStorage.timer = t;
}
function updateDisplay() {
let hours = Math.floor(timer / 3600);
let minutes = Math.floor((timer % 3600) / 60);
let seconds = timer % 60;
let fractionalHours = (timer / 3600).toFixed(2);
updateTimer(hours, minutes, seconds);
updateFractionalHours(fractionalHours);
if (seconds === 0) {
hoursInputElement.value = hours;
minutesInputElement.value = minutes;
}
}
function updateTimer(h, m, s) {
let hoursStr, minutesStr, secondsStr;
if (h < 100) {
hoursStr = h.toString().padStart(2, '0') + ":";
} else {
hoursStr = h.toString() + ":";
}
minutesStr = m.toString().padStart(2, '0') + ":";
secondsStr = s.toString().padStart(2, '0');
timeElement.innerText = hoursStr + minutesStr + secondsStr;
}
function updateFractionalHours(fh) {
fractionalHoursElement.innerText = `${fh} שעות`;
}
function stop() {
if (!isRunning) return;
clearInterval(myTimerInterval);
isRunning = false;
}
function clearTimer() {
if (timer === 0) return;
if (confirm("ביקשת לאפס את הטיימר. האם אתה בטוח?")) {
stop();
timer = 0;
updateStorage(timer);
updateDisplay();
}
}
function setTime() {
let hours = parseInt(hoursInputElement.value, 10) || 0;
let minutes = parseInt(minutesInputElement.value, 10) || 0;
if (isNaN(hours) || isNaN(minutes) || hours < 0 || minutes < 0 || minutes >= 60) {
alert("אנא הזן זמן תקין");
return;
}
timer = (hours * 3600) + (minutes * 60);
updateStorage(timer);
updateDisplay();
}
function incrementHours() {
let hours = parseInt(hoursInputElement.value, 10) || 0;
hoursInputElement.value = hours + 1;
}
function decrementHours() {
let hours = parseInt(hoursInputElement.value, 10) || 0;
if (hours > 0) {
hoursInputElement.value = hours - 1;
}
}
function incrementMinutes() {
let minutes = parseInt(minutesInputElement.value, 10) || 0;
if (minutes < 59) {
minutesInputElement.value = minutes + 1;
}
}
function decrementMinutes() {
let minutes = parseInt(minutesInputElement.value, 10) || 0;
if (minutes > 0) {
minutesInputElement.value = minutes - 1;
}
}
document.addEventListener('DOMContentLoaded', start);
runButton.addEventListener('click', start);
stopButton.addEventListener('click', stop);
clearButton.addEventListener('click', clearTimer);
setTimeButton.addEventListener('click', setTime);
hoursIncrementButton.addEventListener('click', incrementHours);
hoursDecrementButton.addEventListener('click', decrementHours);
minutesIncrementButton.addEventListener('click', incrementMinutes);
minutesDecrementButton.addEventListener('click', decrementMinutes);
@NH-LOCAL כתב בצאט AI | מודל שפה!:
openai שחררה מודל שפה גדול חדש, שמיועד לפתרון בעיות מתמטיות.
שחררה ממש?
אפשר קישור או שלא דק?
@חגי כתב באירוח שרת node.js בחינם:
@שלום-עולם-0 כן.
אני לא מצליח לקבל מהאתר את התגובה שאני אמור לקבל לפי הבנתי.
זה אמור לעבוד עם משלוח AJAX מהקונסולה שלי – אני אמור לקבל תגובה "hello world"?
@חגי כתב באירוח שרת node.js בחינם:
בשביל משהו יותר רציני תעדיף כנראה להשתמש בספרייה שנותנת לך לנתב בקשות.
באמת תודה על ההשקעה, אבל אני לא צריך משהו יותר רציני.
@חגי אם כתוב שם קוד כזה:
Deno.serve((Request) => new Response("Hello World"));
המשמעות היא שכל קריאה שתישלח לכתובת של אתר התוצאה, תיענה ב-"hello world?"
@חגי קוד שאכתוב ב-playground יהיה גלוי לכל העולם?
א"כ יצא שכרי בהפסדי.
@חגי כתב באירוח שרת node.js ב-firebase:
@שלום-עולם-0 השורת פקודה נמצאת במחשב שלך, אם אתה בווינדוס, אז אתה יכול לבחור בין cmd.exe לבין ps.exe
חסר לי פה איזה פרט, ולכן אני לא מבין: למה כדי להפעיל שרת js בשירות ענני של גוגל אני צריך להתקין npm או כל דבר אחר במחשב שלי?
@חגי כתב באירוח שרת node.js ב-firebase:
תכתוב בשורת פקודה npm i -g firebase-tools
היכן נמצאת שם שורת הפקודה?
לא מתחיל להבין את הממשק.
@ש-ב-ח אתה רוצה לתפוס רק את המילה החמישית עצמה?
לאיזו שפה אתה כותב רג'קס?
יש לי קוד JS שאני רוצה להפעיל באתר באופן שהלוגיקה לא תהיה גלויה למשתמשים, כלומר כנראה עלי להריץ אותו בצד שרת כ-node.js.
הומלץ לי כאן להשתמש ב-firebase, וכה אני מנסה לעשות; אלא שאיני מבין את צורת העבודה עם השירות הזה.
פתחתי שם פרויקט. כך כתוב לי:
מה להתקין, איך והכי חשוב איפה להתקין?
אני גם לא מבין האם ולמה אני צריך npm ושאר ירקות; כל מה שאני צריך הוא שהמשתמש יזין בדף קלט,
הוא יישלח ב-AJAX לשרת והשרת יעבד אותו ע"י קוד ה-js שלי ויענה מה שיענה.
@יהודי-טוב אני מנסה ליישם את העצה שלך. פתחתי שם פרויקט. כך כתוב לי:
מה להתקין, איך והכי חשוב איפה להתקין?
@שלום-עולם-0 כתב במַעבָר מ-JS ל-Node.js:
והאם הדבר הזה יכול לעזור לי?
במחשבה שניה נראה שלא; זה מוגבל לשימוש באזורים מסוימים בעולם (?!):
כתבתי פרויקט בשפת js, בה אני מתמצא ברמה טובה, ואני מעוניין להפעיל אותו בצד שרת כדי שהלוגיקה לא תהיה גלויה למשתמשים.
הבנתי שזה אמור לעבור עם node, ויש לי שתי שאלות:
@NH-LOCAL כתב בצאט AI | מודל שפה!:
ככלל, אתה צודק שהוא מתקשה בפתרון בעיות מתמטיות, אבל הוא בודאי לא נטול יכולת בנושא.
מידע נוסף:
להסבר מדוע גפ"ט מתקשה בלוגיקה ומתמטיקה, ראה בפסקה זו של המאמר המצוין והמעמיק What Is ChatGPT Doing … and Why Does It Work? (=מה chatGPT עושה... ולמה זה עובד?).
אגב, המאמר כולו מומלץ קריאה. לא ראיתי הסבר כל כך יסודי ורציני שמונגש בלשון ברורה בלי מינוח מקצועי גבוה.
אורך המאמר שווה לכ-60 עמ', והוא נשאר קריא אחרי תרגום גוגל לעברית. ממליץ מאוד לטרנסלט, ליישר כיווניות, להדפיס ולקרוא.
@צדיק-תמים כתב בהתנהגות מוזרה של מתודת ג'אווהסקריפט reduce:
אתה יכול לראות כאן מבנה של פונקציית reduce תקינה: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it
את הדוגמאות שם ראיתי, אבל הן לא עזרו לי כיוון שהן עוסקות במערך שכולו פרימטיבים ולא מערכים.
@שואף כתב בפיתרון אפשרי לאימות חשבון גוגל - להכניס מספר שמקבל סמסים:
אני מדבר על העיצה השלישית
היכן הוא מציעה להוסיף את הסיומת?
יש לי מערך כעין זה.
let myArr = [[1, 33], ["abc", 50], [12, 90]];
כל אייטם במערך הוא מערך בן שני אייטמים, שהשני ביניהם (אינדקס 1) הוא מספר.
לשם הוצאת הסכום של כל הרכיבים השניים בתתי-המערכים, רציתי להשתמש במתודת reduce של JS – שתפקידה לעבור על מערך ולהוציא ערך יחיד לפי פונקציית callback; וכה כתבתי:
myArr.reduce((item, item2) => item1[1] + item2[1]);
זה נראה שימוש נכון במתודה. אבל נעלבתי מאוד לקבל תשובה שגויה: "NaN"!
למה NaN?!
לתוספת הילת התעלומה, כשכתבתי לאמר:
myArr.reduce((item1,item2) => item1 + item2[1]);
התשובה הייתה:
'1,335090'
כלומר סטרינג של תת-המערך הראשון בשלמותו, עם אייטמי 1 של שני תתי המערכים האחרים. איזו עקביות יש כאן?!