Settimeout ไม่ทำงานเมื่อหน้าต่างสูญเสียโฟกัส

ฉันมีโครโนกราฟ JavaScript แบบง่าย ๆ ที่แสดงบนฟิลด์แบบฟอร์มที่เรียกว่า "d2" ซึ่งใช้เพื่อตรวจสอบว่ามีคนใช้เวลาทำงานเฉพาะเจาะจงนานเท่าใด:

var milisec=0 
var seconds=0
var complemento1=""
document.form1.d2.value='00:00:00' 

function display(){ 
    if (milisec>=9){ 
        milisec=0 
        seconds+=1 
    } 
    else{
        milisec+=1
    }
    complemento1=complemento2=complemento3="";
    if ((seconds%60)<10) complemento1="0";
    if ((Math.floor(seconds/60)%60)<10) complemento2="0";
    if ((Math.floor(seconds/3600))<10) complemento3="0";
    document.form1.d2.value=complemento3+Math.floor(seconds/3600)+":"+complemento2+(Math.floor(seconds/60)%60)+":"+complemento1+(seconds%60)
    setTimeout("display()",100) 
}

ปัญหาคือเมื่อบุคคลนั้นเปิดแท็บใหม่ / ใช้โปรแกรมอื่น ตัวจับเวลาจะหยุดแล้วกลับมาทำงานต่อเมื่อหน้าต่างถูกโฟกัสอีกครั้ง (โดยใช้ Chrome) มันมีพฤติกรรมที่แปลกประหลาดที่สุด เพราะบางครั้งก็ได้ผล บางครั้งก็ไม่ได้ผล

ฉันเห็นโพสต์จำนวนมากที่จำเป็นต้องมีสคริปต์เพื่อหยุดเมื่อไม่ได้โฟกัส ฉันต้องการสิ่งที่ตรงกันข้ามและค้นหานานกว่าหนึ่งชั่วโมงโดยไม่มีโชค ความช่วยเหลือของคุณได้รับการชื่นชมอย่างมาก!


person user2115923    schedule 27.02.2013    source แหล่งที่มา
comment
nitpick: เปลี่ยนบรรทัด setTimeout เป็น setTimeout(display,100) อย่าใช้สตริงเนื่องจากจะทำให้เกิดการประเมินเพิ่มเติม   -  person epascarello    schedule 27.02.2013
comment
comment
Chrome จะควบคุมการหมดเวลาและช่วงเวลาโดยอัตโนมัติเมื่อแท็บไม่ได้โฟกัส และฉันไม่คิดว่าคุณจะสามารถบังคับให้แท็บทำอย่างอื่นได้ แต่คุณสามารถคำนวณและชดเชยความคลาดเคลื่อนได้อย่างง่ายดาย โดยเฉพาะอย่างยิ่งหากคุณกำลังคำนวณเวลา แทนที่จะสมมติว่าการหมดเวลาของคุณจะทำงานในอีก 100 มิลลิวินาทีข้างหน้า ให้ประหยัดเวลาปัจจุบันและเปรียบเทียบกับเวลาที่การหมดเวลาเริ่มทำงาน   -  person Mahn    schedule 27.02.2013


คำตอบ (1)


ไม่รับประกันว่าการหมดเวลาของ JavaScript จะดำเนินการในเวลาที่กำหนด ตัวอย่างเช่น หากเธรดกำลังยุ่งอยู่กับสิ่งอื่นในขณะที่ตัวจับเวลาเสร็จสิ้น เธรดก็จะทำงานให้เสร็จก่อน จากนั้นจึงดำเนินการจับเวลาของคุณ

นอกจากนี้ฟังก์ชันของคุณจะไม่คำนึงถึงเวลาที่ใช้ในฟังก์ชันการแสดงผล ดังนั้นจะมีการหน่วงเวลาเล็กน้อยสำหรับแต่ละมิลลิวินาที

วิธีที่ถูกต้องในการใช้งานตัวจับเวลาคือการใช้เวลาของระบบ

ดังนั้นบางอย่างเช่น:

//Call at the beggining to save the start time
var start_time = new Date()

// Compute seconds (does not matter when/how often you call it.) 
var milliseconds_since_start = new Date().valueOf() - start_time 

ออบเจ็กต์ Date ยังสามารถจัดรูปแบบช่วงเวลานี้เป็นนาฬิกาให้คุณได้:

var m  = new Date(milliseconds_since_start)
m.getMinutes()+":"+m.getSeconds()
person Boris Marinov    schedule 17.01.2015