⏱️ ساعة توقف عبر الإنترنت مع مؤقت للفترات
اضغط على "ابدأ"، ولا يقوم الأداة فعليًا بإضافة قطع صغيرة من الوقت بفواصل زمنية تبلغ 30 مللي ثانية. بل تُسجل القيمة الدقيقة لـ performance.now() في اللحظة التي تبدأ فيها، ثم في كل مرة تعيد الرسم، تطرح هذه القيمة المحفوظة من القيمة الحالية لحساب الوقت المنقضي — يتم إعادة حسابها من جديد، ولا يتم تراكمها. هذه الفرق مهم لأن المتصفحات تُبطئ عمداً setInterval في التبويبات الخلفية لتوفير البطارية، وهو الطريقة الكلاسيكية التي ينحرف بها المؤقتات المصنوعة يدويًا أو تفقد الثواني. لأن هذا المؤقت دائمًا يحسب رقمه من فرق توقيت بدلاً من عد عدد التكرارات الفعلية، فإن الوقت المعروض يعود فورًا إلى القيمة الصحيحة بمجرد عودتك إلى التبويب، حتى بعد دقائق من الغياب.
مؤقت التوقيت هو مؤقت مسافة مجاني في المتصفح يحسب الوقت المنقضي عن طريق مقارنة مقياس التوقيت الأحادي performance.now() مع توقيت البداية المحفوظ، بدلًا من عد عدد مرات setInterval، وبالتالي يبقى الرقم المعروض دقيقًا حتى عندما يُبطئ المتصفح تحديثات الشاشة في الأتاب.
مصمم للخصوصية. تعمل هذه الأداة بالكامل في متصفحك — لا يتم رفع أي شيء تدخله أو تخزينه، وتعمل الأداة دون اتصال بالإنترنت.
حول
تحت الغطاء، هناك ثلاث قطع من الحالة: قيمة "elapsed" تراكمية بالمللي ثانية، وقطعة "startAt" من performance.now() تُسجّل في اللحظة التي تضغط فيها على "ابدأ"، وعلم boolean "running". الدالة التي تنتج الرقم المعروض هي فقط "elapsed" زائد، إذا كان "running"، الفرق بين الوقت الحالي و"startAt". يُنفّذ setInterval هذه الدالة كل 30 مللي ثانية فقط لتجديد عرض الشاشة — لا تحمل هذه الفترة أي معلومات توقيت، بل هي مجرد محفّز لتجديد العرض. هذه هي الطريقة الصحيحة لبناء مؤقت توقيت، وتتجنّب هذه التصميم الخلل الشائع حيث يضيف المؤقت قيمة ثابتة في كل تكرار، ويبدأ بالانحراف تدريجيًا عندما تتأخر أو تُخطى أو تُدمج التكرارات.
هذا الخيار التصميمي هو ما يحدث أيضًا عندما تنتقل إلى أتاب آخر. تُبطئ المتصفحات مؤقتات الأتاب الخلفية لتوفير المعالج والبطارية — يمكن أن تُؤجل setInterval المُحدّد لكل 30 مللي ثانية إلى مرة واحدة في الثانية أو أقل عندما لا يكون الأتاب مرئيًا. في هذا مؤقت التوقيت، يؤثر ذلك فقط على تكرار تحديثات العرض على الشاشة؛ أما الحساب الأساسي (الوقت الحالي ناقص وقت البداية زائد ما تم تراكمه مسبقًا) فلا يهتم بعدد التحديثات التي تم تخطيها. عند العودة إلى الأتاب، يظهر الوقت المنقضي الصحيح فورًا في المرة التالية لتجديد العرض — لا يفقد أو يكتسب أي وقت بسبب التقليل، بل فقط سلاسة عرض الوقت بينما كنت تنظر إلى شيء آخر.
استخدام performance.now() بدلًا من Date.now() هو أيضًا الخيار الصحيح لهذا العمل، وليس تفصيلًا ثانويًا. يعكس Date.now() ساعة جدارية لنظامك، ويمكن أن تقفز — مثلًا بعد استيقاظ جهاز كمبيوتر من النوم وتحديثه مع خادم NTP، أو عند تغيير الساعة يدويًا، أو عند تعديل الساعات الصيفية، يمكن أن تقفز Date.now() للأمام أو حتى للخلف أثناء الجلسة. يُعرّف performance.now() كمقياس تدريجي: يزداد فقط بسرعة ثابتة ولا يتأثر بتلك التصحيحات، وهو بالضبط ما يضمنه مؤقت التوقيت، بينما لا يملك مؤقت جدارية الوقت ذلك.
الحد الحقيقي هو الاستمرارية، ولا يوجد. يحتفظ هذا التصميم بـ "elapsed" وقائمة "laps" كمتغيرات عادية في ذاكرة الصفحة — لا يوجد أي مكالمة في الكود إلى localStorage أو إلى مساعدة Playground.store() الخاصة بهذا الموقع التي يستخدمها أدوات Toolio الأخرى لحفظ البيانات بعد إعادة تحميل الصفحة. هذا يعني أن إعادة تحميل الصفحة أو إغلاق الأتاب أو النقر بعيدًا إلى أداة أخرى تمسح وقت التشغيل والفترات المسجلة فورًا ونهائيًا. لا يوجد "استئناف الجلسة السابقة"، لا شيء يزامن عبر الأجهزة، ولا شيء لحفظه، لأن شيئًا لا يتم كتابته في التخزين أصلًا. إذا كان تاريخ الفترات مهمًا لك — مثل سجل تمارين أو مدة عرض — انسخ الأرقام أو اخذ لقطة شاشة قبل أن تغادر، لأن هذه الصفحة لن تتذكرها لك.
كيف تستخدم
- اضغط على "ابدأ" — يُعيد تسمية الزر فورًا إلى "ايقاف"، ويبدأ المؤقت في الارتفاع في الوقت الحقيقي، مع تحديث الشاشة كل 30 مللي ثانية.
- اضغط على "laps" في أي وقت أثناء التشغيل لتسجيل الوقت الحالي؛ يتم إضافة الدخول الجديد إلى أعلى قائمة laps ويظهر كلاً من الفارق الزمني (الوقت منذ آخر lap) ووقت الإجمالي.
- اضغط على نفس الزر مرة أخرى، الآن مسمى "ايقاف"، لجمد العرض — يتم الحفاظ على الوقت المنقضي داخليًا، ولا يتم فقدان أي شيء، ويتحول الزر مرة أخرى إلى "ابدأ".
- اضغط على "ابدأ" مرة أخرى لاستئناف العد من حيث توقفت، وليس من الصفر.
- اضغط على "إعادة الضبط" لوضع العرض إلى الصفر، ومسح كل lap مسجل، واستعادة الزرين إلى تسمياتهما الأصلية — هذا هو الطريقة الوحيدة لبدء جلسة جديدة، لأن لا يوجد ميزة حفظ لحماية الجلسة القديمة أولًا.
الأسئلة الشائعة
- كيف يقيس هذا المؤقت الزمن فعليًا تحت الغطاء؟
- يقرأ performance.now() مرة واحدة، في اللحظة التي تضغط فيها على "ابدأ"، ويحفظ هذا الرقم. من ذلك الوقت، فإن القيمة على الشاشة هي فقط "الوقت المحفوظ" زائد "الوقت الحالي ناقص توقيت البداية المحفوظ" — يتم إعادة حسابها من جديد في كل 30 مللي ثانية عند تحديث الشاشة. لا يتم فقط إضافة +30 مللي ثانية ثابتة إلى المجموع المستمر في كل تكرار، وهو ما يجعل العديد من المؤقتات المصنوعة يدويًا تفقد التزامن تدريجيًا.
- ماذا يحدث للوقت إذا انتقلت إلى علامة تبويب متصفح أخرى أثناء تشغيله؟
- تُبطئ العلامات التبويبية الخلفية — يمكن للمتصفح أن يتأخر في setInterval المحدد لكل 30 مللي ثانية إلى مرة واحدة في الثانية أو أقل لتوفير المعالج والبطارية، وبالتالي قد يبدو أن العرض قد تجمد أو ارتفع أثناء غيابك. لكن لأن هذا المؤقت دائمًا يحسب الوقت المنقضي كفرق توقيت بدلًا من عد عدد التكرارات، فإن العودة إلى العلامة التبويبية تجعل المرة التالية لتجديد العرض تظهر الوقت المنقضي الصحيح فورًا. لا تفقد أو تكتسب أي وقت بسبب التقليل — فقط سلاسة العرض تتأثر أثناء غيابك.
- لماذا performance.now() بدلًا من Date.now() — هل يهم فعليًا؟
- نعم. يعكس Date.now() ساعة جدارية لنظامك، ويمكن أن تقفز للأمام أو للخلف — على سبيل المثال مباشرة بعد استيقاظ جهاز كمبيوتر من النوم وتحديثه مع خادم NTP، أو إذا تم تغيير الساعة يدويًا. performance.now() هو مقياس تدريجي يزداد فقط بسرعة ثابتة ولا يتأثر بتلك التصحيحات، وهو بالضبط الخاصية التي يحتاجها مؤقت التوقيت، وهذا التصميم يستخدم المقياس الصحيح لذلك.
- هل يحفظ هذا المؤقت الوقت المنقضي أو سجل الفترات في أي مكان؟
- لا — وبعكس بعض أدوات Toolio الأخرى، لا يستخدم هذا التصميم أي تخزين في ذاكرة المتصفح (localStorage) لهذا البيانات. كل ما تراه موجود فقط في ذاكرة الصفحة طالما أن هذا الأتاب مفتوح. عند إعادة تحميل الصفحة أو إغلاق الأتاب أو الانتقال إلى أداة أخرى، فإن الوقت المنقضي وكل الفترات تختفي نهائياً؛ لا يوجد إلغاء أو حفظ تلقائي، لأن شيئًا لا يتم كتابته في التخزين أصلًا. انسخ الأرقام أو اخذ لقطة شاشة قبل أن تغادر إذا كنت بحاجة لتسجيلها.
- هل هناك حد لعدد laps، وما معنى الرقمين في كل صف lap؟
- لا يوجد حد — القائمة تنمو فقط، مع إرفاق أحدث lap في الأعلى. كل صف يعرض رقمين: الفارق الزمني، باللون المميز، وهو الوقت المنقضي منذ آخر lap؛ والوقت الإجمالي، باللون الرمادي، وهو الوقت الكلي منذ الضغط على "ابدأ". هذا التوزيع يسمح لك بتقييم قطعة فردية — فترة تمارين واحدة، قسم واحد من عرض — دون فقدان متابعة الجلسة العامة.
- هل هذه الأداة ترفع بياناتي؟
- لا. يعمل كل شيء مباشرة في متصفحك، لذا بياناتك لن تغادر جهازك أبداً — بل إنها تعمل دون اتصال بالإنترنت بمجرد تحميل الصفحة.