ทำซ้ำผ่าน JavaScript ช่วงเวลาของงาน ใช้ฟังก์ชัน jQuery-setTimeout() ปัญหาที่เกี่ยวข้องกับ “สิ่งนี้”

โกลอฟนา / อูซันเนียทำงานผิดปกติ

ดิ setInterval()เมธอด กระจายไปตามหน้าต่างและอินเทอร์เฟซของผู้ปฏิบัติงาน เรียกใช้ฟังก์ชันซ้ำๆ หรือรันโค้ดขนาดสั้น โดยมีการหน่วงเวลาคงที่ระหว่างการโทรแต่ละครั้งมันส่งคืน ID ช่วงเวลา ซึ่งระบุช่วงเวลาโดยเฉพาะ ดังนั้นคุณสามารถลบออกได้ในภายหลังโดยเรียก clearInterval() วิธีนี้กำหนดโดยมิกซ์อิน WindowOrWorkerGlobalScope

ไวยากรณ์

varintervalID = ขอบเขต.setInterval( func, ล่าช้า, [arg1, arg2, ...]); varintervalID = ขอบเขต.setInterval( รหัส, ล่าช้า);

พารามิเตอร์

func ฟังก์ชั่นที่จะดำเนินการทุก ๆ มิลลิวินาทีที่ล่าช้า ฟังก์ชันนี้ไม่สามารถทำซ้ำได้ ไม่ว่าจะมีอาร์กิวเมนต์ใด และไม่มีค่าส่งคืนที่คาดไว้ รหัส ไวยากรณ์ทางเลือกช่วยให้คุณสามารถรวมสตริงแทนฟังก์ชัน ซึ่งสามารถเพิ่มเพื่อดำเนินการทุกๆ มิลลิวินาทีที่หน่วงเวลาได้ ไวยากรณ์นี้คือ ไม่แนะนำด้วยเหตุผลเดียวกันกับที่ทำให้การใช้ eval() มีความเสี่ยงด้านความปลอดภัย หน่วงเวลา เวลาในหน่วยมิลลิวินาที (หนึ่งในพันของวินาที) ตัวจับเวลาควรหน่วงเวลาระหว่างการดำเนินการของฟังก์ชันหรือโค้ดที่ระบุ กดดูรายละเอียดเกี่ยวกับค่าที่เท่ากันที่ยอมรับ arg1, ..., argN ทางเลือก อาร์กิวเมนต์เพิ่มเติมที่ส่งผ่านไปยังฟังก์ชันที่ระบุโดย funcเมื่อหมดเวลา

บันทึก: การส่งผ่านอาร์กิวเมนต์เพิ่มเติมไปยัง setInterval() ในไวยากรณ์แรกไม่ทำงานใน Internet Explorer 9 และรุ่นก่อนหน้า หากคุณต้องการให้ฟังก์ชันนี้แก่ส่วนเสริมของคุณ คุณควรใช้ polyfill (ดูหัวข้อ)

ค่าส่งคืน

intervalID เป็นตัวเลข ค่าที่ไม่ใช่ศูนย์ซึ่งระบุตัวจับเวลาที่สร้างขึ้นโดยการเรียก setInterval() ; ค่านี้สามารถส่งผ่านเพื่อยกเลิกการหมดเวลา

นอกจากนี้เรายังสามารถเปลี่ยนเพื่อให้ setInterval() และ setTimeout() แบ่งปันกลุ่ม sam ของ ID และ clearInterval() และ clearTimeout() ในทางเทคนิคสามารถใช้แทนกันได้ อย่างไรก็ตาม เพื่อความชัดเจน คุณควรพยายามจับคู่เสมอเพื่อหลีกเลี่ยงความสับสนเมื่อทำการรักษาโค้ดของคุณ

บันทึก: อาร์กิวเมนต์การหน่วงเวลาจะถูกแปลงเป็นจำนวนเต็ม 32 บิตที่ลงนามแล้ว เงื่อนไขที่มีผลถูกตั้งค่าเป็น 2147483647 ms ดังนั้นการแทรกจึงเหมือนกับการแทรกสมาชิกใน IDL

ตัวอย่าง

ตัวอย่างที่ 1: ไวยากรณ์พื้นฐาน

ขั้นตอนถัดไปแสดงให้เห็นถึงไวยากรณ์พื้นฐานของ setInterval()

Var intervalID = window.setInterval(myCallback, 500, "Parameter 1", "Parameter 2"); ฟังก์ชั่น myCallback(a, b) ( // รหัสของคุณที่นี่ // พารามิเตอร์เป็นตัวเลือกล้วนๆ console.log(a); console.log(b); )

ตัวอย่างที่ 2: การสลับสองสี

ฟังก์ชันหยุดการโทรถัดไป flashtext() หนึ่งครั้งต่อวินาที จนกว่าจะกดปุ่ม Stop

ตัวอย่าง setInterval/clearInterval

สวัสดีชาวโลก

ตัวอย่างที่ 3: การจำลองเครื่องพิมพ์ดีด

รอยเท้าของประเภททั่วไปของดรูการ์ในอันแรกนั้นแตกต่างกัน และประเภททั่วไปส่วนใหญ่จะรวมอยู่ใน NodeList เนื่องจากเป็นตัวแทนของกลุ่มตัวเลือกการร้องเพลง

เครื่องพิมพ์ดีด JavaScript - ตัวอย่าง MDN

CopyLeft 2012 โดย Mozilla Developer Network

[ เล่น | หยุด | ยุติ ]

Vivamus blandit แมสซา ut เมตุส แมตทิส ในฟรินจิลลา เลกตัส อิมเพอร์ดิเอต Proin ac ante a felis ornare vehicula. รถยนต์ Fusce pellentesque lacus vitae eros convallis ut mollis magna pellentesque Pellentesque placerat enim ที่ lacus ultricies vitae facilisis nisi fringilla ในภาวะที่ไร้สติ

เครื่องพิมพ์ดีด JavaScript

Lorem ipsum dolor sit amet, consectetur adipiscing elit. โลเรม อิปซัม โดลอร์ Nullam ultrices dolor ac dolor อิมเพอร์ดิเอต ullamcorper Suspendisse quam libero, ผู้ประมูล luctus mollis sed, malesuada condimentum magna Quisque ใน ante tellus ใน placerat est. ถิ่นที่อยู่อาศัย Pellentesque morbi tristique senectus et netus et malesuada fames ac turpis egestas Donec a mi magna, quis แมตทิส โดลอร์ Etiam sit amet ligula quis urna ผู้ประมูล imperdiet nec faucibus ante. Mauris vel คอนเซกเตตูร์ โดลอร์ เอกเอกเทศ elit eget velit pulvinar fringilla consectetur aliquam purus Curabitur convallis, justo posuere porta egestas, velit erat ornare tortor, ไม่ใช่ viverra justo diam eget arcu Phasellus adipiscing fermentum nibh ac คอมโมโด น้ำ turpis nunc, suscipit a hendrerit vitae, volutpat non ipsum.

Phasellus ac nisl lorem:

Duis lobortis sapien quis nisl luctus porttitor. ในช่วงเวลาเดียวกัน libero, eu tincidunt dolor eleifend sit amet. ต้องใช้ nec velit ใน dolor tincidunt rhoncus non non diam ผู้เขียน Morbi ornare orci, ไม่ใช่ euismod felis gravida nec. Curabitur elementum nisi a eros rutrum nec blandit diam placerat. Aenean tincidunt risus ut nisi consectetur เคอร์ซัส Ut vitae quam อิลิท. Donec dignissim อยู่ใน quam tempor consequat อะลิควอม อะลิควอม เดียม โน เฟลิส คอนวัลลิส ซัสซิพิท สิ่งอำนวยความสะดวก Nulla Donec lacus risus, dignissim et fringilla et, egestas veleros Duis malesuada accumsan dui, บน fringilla mauris bibStartum quis. Cras adipiscing ultricies fermentum. พรีเซ็นต์เอี๊ยมStartum condimentum feugiat.

น้ำเฟาซิบัส, ligula eu fringilla pulvinar, lectus tellus iaculis nunc, ประวัติ scelerisque metus leo non metus Proin Mattis lobortis lobortis. Quisque accumsan faucibus erat, vel varius tortor ultricies ac. แอคคัมซัน โฟซิบัส เอรัท Lorem ipsum dolor sit amet, consectetur adipiscing elit. โลเรม อิปซัม โดลอร์ Sed nec libero nunc. Nullam tortor nunc, elementum a consectetur et, ultrices eu orci Lorem ipsum dolor sit amet, consectetur adipiscing elit. โลเรม อิปซัม โดลอร์ Pellentesque a nisl eu sem vehicula egestas.

อาร์กิวเมนต์การโทรกลับ

เมื่อมองไปข้างหน้า Internet Explorer 9 จะไม่ฟังอาร์กิวเมนต์ของฟังก์ชันเรียกกลับใน setTimeout() หรือ setInterval() เดียว ต่อไปนี้ เฉพาะ IEรหัสแสดงเป็นวิธีการในการเอาชนะการเชื่อมโยง เพื่อที่จะได้เพิ่มความเร็วให้ใกล้เคียงกับรหัสที่น่ารังเกียจในรายการ

/*\ |*| |*| polyfill เฉพาะของ IE ที่ช่วยให้ส่งผ่านอาร์กิวเมนต์ตามอำเภอใจไปยัง |*| ฟังก์ชันเรียกกลับ ตัวจับเวลาจาวาสคริปต์ (ไวยากรณ์มาตรฐาน HTML5)..setInterval |*| https://website/User:fusionchess |*| |*| ไวยากรณ์: |*| var timeoutID = window.setTimeout(func, ดีเลย์[, arg1, arg2, ...]); |*| var timeoutID = window.setTimeout (รหัสล่าช้า); |*| var intervalID = window.setInterval(func, ดีเลย์[, arg1, arg2, ...]); |*| var intervalID = window.setInterval (รหัสล่าช้า); |*| \*/ if (document.all && !window.setTimeout.isPolyfill) ( var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) ( var aArg .prototype .slice.call(arguments, 2); if (document.all && !window.setInterval.isPolyfill) ( var __nativeSI__ = window.setInterval; window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2 เป็นต้น *) /) ( var aArgs = Ar) slice.call(อาร์กิวเมนต์, 2);

มีโอกาสมากขึ้นในการใช้ฟังก์ชันที่ไม่ระบุตัวตนเพื่อเรียกใช้การโทรกลับของคุณ แต่ราคาแพงกว่าเล็กน้อย ตัวอย่าง:

Var intervalID = setInterval(function() ( myFunc("หนึ่ง", "สอง", "สาม"); ), 1000); var intervalID = setInterval(ฟังก์ชัน(arg1) ().bind(ไม่ได้กำหนด, 10), 1000);

แท็บที่ไม่ใช้งาน

ต้องใช้ Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)

เริ่มต้นใน Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) เงื่อนไขต่างๆ จะถูกจำกัดไม่ให้เริ่มทำงานบ่อยกว่าหนึ่งครั้งต่อวินาทีในแท็บที่ไม่ใช้งาน

ปัญหา "นี้"

หากคุณผ่านเมธอดก่อน setInterval() หรือมีฟังก์ชันอื่น คุณจะต้องแนะนำความหมาย ดูรายละเอียดเพิ่มเติมใน JavaScript

คำอธิบาย

โค้ดที่รันโดย setInterval() ทำงานในบริบทการดำเนินการแยกต่างหากจากฟังก์ชันที่เรียกใช้ วิธีสุดท้ายคือ สัญญาณคีย์สำหรับชื่อฟังก์ชันถูกตั้งค่าเป็นวัตถุหน้าต่าง (หรือส่วนกลาง) ซึ่งไม่เหมือนกับค่านี้สำหรับฟังก์ชันที่เรียกว่า setTimeout กดที่ก้นสเต็ป (ซึ่งเป็นชัยชนะ setTimeout() แทน setInterval() - อันที่จริงอาหารเพื่อความเงียบซึ่งใช้งานได้):

MyArray = ["ศูนย์", "หนึ่ง", "สอง"]; myArray.myMethod = ฟังก์ชัน (sProperty) ( alert(arguments.length > 0 ? this : this); ); myArray.myMethod(); // พิมพ์ "ศูนย์ หนึ่ง สอง" myArray.myMethod(1); // พิมพ์ setTimeout "หนึ่ง" (myArray.myMethod, 1000); // พิมพ์ "" หลังจาก 1 วินาที setTimeout(myArray.myMethod, 1500, "1"); // พิมพ์ "undefined" หลังจาก 1.5 วินาที // ส่งผ่านวัตถุ "นี้" ด้วย .call จะไม่ทำงาน // เพราะสิ่งนี้จะเปลี่ยนค่าของสิ่งนี้ภายใน setTimeout เอง // ในขณะที่เราต้องการเปลี่ยนค่าของสิ่งนี้ภายใน myArray .myMethod // อันที่จริงแล้วมันจะเป็นข้อผิดพลาดของข้อผิดพลาด รหัส setTimeout คาดว่าสิ่งนี้จะเป็นวัตถุหน้าต่าง: setTimeout.call(myArray, myArray.myMethod, 2000); // ข้อผิดพลาด: "วัตถุ NS_ERROR_XPC_BAD_OP_ON_WNPRO" setTimeout.call(myArray , myArray.myMethod, 2500, 2); // ข้อผิดพลาดเดียวกัน

อย่างที่คุณเห็น ไม่มีทางที่จะทำให้ออบเจ็กต์ของคุณมีฟังก์ชันเรียกกลับในพันธมิตร JavaScript

ทางออกที่เป็นไปได้

วิธีที่เป็นไปได้ในการแก้ปัญหา " นี้ " คือการแทนที่ฟังก์ชันโกลบอล setTimeout() หรือ setInterval() ดั้งเดิมสองฟังก์ชันด้วยสองฟังก์ชัน ไม่ใช่เจ้าของภาษาที่เปิดใช้งานการเรียกใช้ผ่านเมธอด Function.prototype.call ตัวอย่างต่อไปนี้แสดงการแทนที่ที่เป็นไปได้:

// อนุญาตให้จับวัตถุ "เป้าหมาย" ผ่านตัวจับเวลา JavaScript var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval; window.setTimeout = ฟังก์ชัน (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) ( var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback in () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); ); window.setInterval = ฟังก์ชัน (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) ( var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeSI__(vCallback in () () vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); );

คุณยังสามารถแทนที่การเปลี่ยนมาตรฐาน HTML5 ของอาร์กิวเมนต์ตามอำเภอใจไปยังตัวจับเวลาฟังก์ชันเรียกกลับใน IE จึงสามารถใช้เป็น ไม่ได้มาตรฐานโพลีฟิลเช่นกัน ดูสำหรับ ได้มาตรฐานโพลีฟิล

การทดสอบคุณสมบัติใหม่:

MyArray = ["ศูนย์", "หนึ่ง", "สอง"]; myArray.myMethod = ฟังก์ชัน (sProperty) ( alert(arguments.length > 0 ? this : this); ); setTimeout (การแจ้งเตือน 1500 "สวัสดีชาวโลก!"); // ใช้มาตรฐานของ setTimeout และ setInterval ไว้ แต่... setTimeout.call(myArray, myArray.myMethod, 2000); // พิมพ์ "ศูนย์ หนึ่ง สอง" หลังจาก 2 วินาที setTimeout.call(myArray, myArray.myMethod, 2500, 2); // พิมพ์ "สอง" หลังจาก 2.5 วินาที

สำหรับรุ่นที่ซับซ้อนกว่าแต่ยังคงโมดูลาร์ของมัน ( ภูต) ดู JavaScript Daemons Management เวอร์ชันที่ซับซ้อนกว่านี้ไม่ได้เป็นเพียงคอลเล็กชันเมธอดที่ใหญ่และปรับขนาดได้สำหรับ ภูตตัวสร้าง อย่างไรก็ตาม ภูตตัวสร้างเองไม่ได้เป็นอะไรนอกจากโคลนของ MiniDaemonด้วยการสนับสนุนเพิ่มเติมสำหรับ ในนั้นและ เริ่มฟังก์ชันที่ประกาศระหว่างการสร้างอินสแตนซ์ของ ภูต . ดังนั้น MiniDaemonเฟรมเวิร์กยังคงเป็นวิธีที่แนะนำสำหรับแอนิเมชั่นอย่างง่าย, เพราะ ภูตหากไม่มีการรวบรวมวิธีการนี้ มันเป็นโคลนของมันโดยพื้นฐาน

minidaemon.js

/*\ |*| |*| :: MiniDaemon:: |*| |*| แก้ไข #2 - 26 กันยายน 2014.setInterval |*| https://website/User:fusionchess |*| https://github.com/madmurphy/minidaemon.js |*| |*| กรอบนี้อยู่ภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNU เวอร์ชัน 3 หรือใหม่กว่า |*| http://www.gnu.org/licenses/lgpl-3.0.html |*| \*/ function MiniDaemon (oOwner, fTask, nRate, nLen) ( if (!( this && this instance of MiniDaemon)) ( return; ) ถ้า (arguments.length< 2) { throw new TypeError("MiniDaemon - not enough arguments"); } if (oOwner) { this.owner = oOwner; } this.task = fTask; if (isFinite(nRate) && nRate >0) ( this.rate = Math.floor(nRate); ) ถ้า (nLen > 0) ( this.length = Math.floor(nLen); ) ) MiniDaemon.prototype.owner = null; MiniDaemon.prototype.task = null; MiniDaemon.prototype.rate = 100; MiniDaemon.prototype.length = อินฟินิตี้; /* คุณสมบัติเหล่านี้ควรเป็นแบบอ่านอย่างเดียว */ MiniDaemon.prototype.SESSION = -1; MiniDaemon.prototype.INDEX = 0; MiniDaemon.prototype.PAUSED = จริง; MiniDaemon.prototype.BACKW = จริง; /* เมธอดสากล */ MiniDaemon.forceCall = function(oDmn) ( oDmn.INDEX += oDmn.BACKW ? -1: 1; if (oDmn.task.call(oDmn.owner, oDmn.INDEX, oDmn.length, oD) .BACKW) === false || oDmn.isAtEnd()) ( oDmn.pause(); return false; ) return true; /* Instances method */ MiniDaemon.prototype.isAtEnd = function () ( return this.BACKW ? isFinite(นี่.ความยาว) && นี่.INDEX< 1: this.INDEX + 1 >this.length; ); MiniDaemon.prototype.synchronize = ฟังก์ชัน () ( if (this.PAUSED) ( return; ) clearInterval(this.SESSION); this.SESSION = setInterval(MiniDaemon.forceCall, this.rate, this); ); MiniDaemon.prototype.pause = ฟังก์ชัน () ( clearInterval(this.SESSION); this.PAUSED = true; ); MiniDaemon.prototype.start = ฟังก์ชัน (bReverse) ( var bBackw = Boolean(bReverse); if (this.BACKW === bBackw && (this.isAtEnd() || !this.PAUSED)) ( return; ) this.BACKW = bBackw;this.PAUSED=false;this.synchronize(); );

MiniDaemon ส่งผ่านอาร์กิวเมนต์ไปยังฟังก์ชันเรียกกลับ ในขณะที่คุณฝึกฝนกับมันด้วยเบราว์เซอร์ เนื่องจากโดยธรรมชาติแล้วมันไม่รองรับตัวละครนี้ ให้ใช้วิธีใดวิธีหนึ่งที่พัฒนาขึ้น

ไวยากรณ์

var myDaemon = MiniDaemon ใหม่ ( วัตถุนี้, โทรกลับ[ , ประเมิน [, ความยาว]]);

คำอธิบาย

บันทึกการใช้งาน

โดยปกติแล้ว ฟังก์ชัน SetInterval() จะถูกแฮ็กเพื่อตั้งค่าสำหรับฟังก์ชันต่างๆ เช่น เรียกใช้ซ้ำแล้วซ้ำอีก เช่นเดียวกับแอนิเมชัน คุณสามารถเปิดชั่วโมงได้โดยเรียก WindowsOrWorkerGlobalScope.clearInterval()

หากคุณต้องการให้ฟังก์ชั่นของคุณถูกเรียกว่า ครั้งหนึ่งหลังจากหน่วงเวลาที่กำหนด ให้ใช้ .

ข้อจำกัดความล่าช้า

Tse mozhe buti เป็นไปได้สำหรับ timchasovyh dzvinkiv; คุณสามารถตั้งค่า callback สำหรับ setInterval() ให้เปิด callInterval() ให้ทำงานเร็ว ๆ นี้ ให้กดในครั้งต่อไปที่หยุด ระยะเวลา เมื่อช่วงเวลาช้าลงห้าเท่าเสมอ เบราว์เซอร์จะตั้งค่าต่ำสุด 4 ms โดยอัตโนมัติเป็นเวลาหนึ่งชั่วโมง

เบราว์เซอร์สามารถให้ค่าขั้นต่ำที่เข้มงวดยิ่งขึ้นแก่คุณสำหรับชั่วโมงในบางสถานการณ์ หากคุณไม่ต้องการให้มีความผิด โปรดทราบด้วยว่าระยะเวลาจริงที่ผ่านไประหว่างการโทรเพื่อโทรกลับอาจยาวนานกว่าการหน่วงเวลาที่กำหนด อ่านเหตุผลเพิ่มเติมสำหรับความล่าช้านานกว่าที่ระบุใน WindowOrWorkerGlobalScope.setTimeout() สำหรับตัวอย่าง

ตรวจสอบให้แน่ใจว่าระยะเวลาดำเนินการสั้นกว่าความถี่ของช่วงเวลา

หากเป็นไปได้ว่าตรรกะของคุณอาจหมายถึงเรื่องไม่สำคัญก่อนสิ้นวัน จะถูกเรียกเพราะคุณถูกเรียกฟังก์ชันที่เรียกว่า setTimeout() ตัวอย่างเช่น ตามกฎแล้ว setInterval() ไปที่ tow บนเซิร์ฟเวอร์ระยะไกลโดยใช้เวลา 5 วินาที คำว่า บนเซิร์ฟเวอร์ที่ไม่ถูกต้อง และในทางกลับกัน คุณสามารถขอให้ลองใหม่เพื่อดำเนินการใหม่ให้เสร็จสิ้นได้ ตลอดทั้งชั่วโมง ดังนั้นคุณสามารถค้นหาสิ่งที่คุณต้องการดื่มร่วมกันซึ่งคุณต้องกู้คืนตามลำดับ

เชอเรโล: http://learn.javascript.ru/settimeout-setinterval

ขอให้การขาย JavaScript ทั้งหมดมีตัวตั้งเวลาภายใน ซึ่งช่วยให้คุณตั้งค่าฟังก์ชันการคลิกแบบสัปดาห์ผ่านช่วงงานเป็นชั่วโมงได้

Zocrema ความเป็นไปได้ได้รับการสนับสนุนโดยเบราว์เซอร์และเซิร์ฟเวอร์ Node.JS

setTimeout

ไวยากรณ์:

var timerId = setTimeout(func/code, หน่วงเวลา[, arg1, arg2...])

พารามิเตอร์:

  • func/code
    • ฟังก์ชันหรือแถวของโค้ดสำหรับการแสดงภาพ
    • แถวpodtremuєtsyaสำหรับ summіnostі, vikoristovuvat їїไม่แนะนำ
  • ล่าช้า
    • ทริมในหน่วยมิลลิวินาที 1,000 มิลลิวินาทีเท่ากับ 1 วินาที
  • arg1, arg2…
    • อาร์กิวเมนต์ที่ต้องส่งผ่านไปยังฟังก์ชัน ไม่รองรับใน IE9
    • ฟังก์ชันจะหมดอายุในหนึ่งชั่วโมง หากพารามิเตอร์การหน่วงเวลามีผล

ตัวอย่างเช่น รหัสถัดไปจะเป็น alert("สวัสดี") ในหนึ่งวินาที:

func()(alert("สวัสดี");) setTimeout(func, 1000);

เนื่องจากอาร์กิวเมนต์แรกอยู่ในแถว ตัวแปลจึงสร้างฟังก์ชันที่ไม่ระบุชื่อในแถวที่สาม

บันทึกดังกล่าวใช้งานได้ดังนี้:

SetTimeout("alert("สวัสดี")", 1000);

แทนที่ด้วยฟังก์ชันที่ไม่ระบุชื่อ:

ตั้งเวลาหมดเวลา ( การทำงาน()(แจ้งเตือน ("สวัสดี")), 1,000);

พารามิเตอร์สำหรับฟังก์ชันและบริบท

ในเบราว์เซอร์สมัยใหม่ทั้งหมด เมื่อเปิดใช้งาน IE10 แล้ว setTimeout จะให้คุณตั้งค่าพารามิเตอร์ของฟังก์ชันได้

ก้นล่าง vivede "สวัสดี ฉันชื่อ Vasya" จีบ IE9-:

ฟังก์ชั่นพูดว่าสวัสดี (ใคร)(alert("สวัสดี ฉัน" + ใคร); ) setTimeout(sayHi, 1000, "Vasya");

…อย่างไรก็ตาม สำหรับความคิดเห็นส่วนใหญ่ เราต้องการการสนับสนุนจาก IE เก่า และเราไม่อนุญาตให้มีการโต้แย้ง ดังนั้น ในการส่งผ่าน ให้รวมวิกิในฟังก์ชันที่ไม่ระบุชื่อ:

ฟังก์ชั่นพูดว่าสวัสดี (ใคร)( alert("สวัสดี ฉัน" + ใคร); ) setTimeout( การทำงาน()(พูดสวัสดี("วาสยา")), 1,000);

Wikiclick ไม่ส่งบริบทนี้ผ่าน setTimeout

Zokrema, wickklix ไปยังเมธอดของออบเจ็กต์ผ่าน setTimeout ไปยังบริบทส่วนกลาง อาจนำไปสู่ผลลัพธ์ที่ไม่ถูกต้อง

ตัวอย่างเช่น เราสามารถพูด user.sayHi() ในหนึ่งวินาที:

ฟังก์ชัน ผู้ใช้ (id) การทำงาน()( alert( .id นี้); ); ผู้ใช้ var = ผู้ใช้ใหม่ (12345); setTimeout(user.sayสวัสดี 1,000); // คะแนน 12345 แม้ว่าวิดีโอ "ไม่ได้กำหนด"

ปุ่ม setTimeout เรียกใช้ฟังก์ชัน user.sayHi ในบริบทส่วนกลาง ซึ่งจะไม่อนุญาตให้เข้าถึงวัตถุผ่านสายโซ่

ไม่เช่นนั้น ดูเหมือนว่าวิกิ setTimeout สองอันทำงานเหมือนกัน:

// (1) setTimeout หนึ่งแถว (user.sayHi, 1000); // (2) สองแถวเดียวกัน func=user.sayสวัสดี; setTimeout (ฟังก์ชัน 1,000);

โชคดีที่ปัญหานี้ถูกละเมิดได้ง่ายโดยการสร้างฟังก์ชันระดับกลาง:

ฟังก์ชัน ผู้ใช้ (id)(นี้ .id = id นี้ .sayHi = การทำงาน()( alert( .id นี้); ); ผู้ใช้ var = ผู้ใช้ใหม่ (12345); setTimeout( การทำงาน()( user.sayHi(); ), 1000 );

ฟังก์ชันการตัดคำใช้เพื่อข้ามเบราว์เซอร์ส่งผ่านอาร์กิวเมนต์และบันทึกบริบทของการตัดคำ

สกาสุวรรณยา วิโคนันทะ

ฟังก์ชัน setTimeout จะหมุน timerId ซึ่งสามารถจับคู่กับการจับคู่ได้

ไวยากรณ์:

ClearTimeout (รหัสจับเวลา)

เรากำหนดเวลาสำหรับก้นที่น่ารังเกียจแล้วเราก็เห็นมัน (เปลี่ยนใจ) เป็นผลให้ไม่มีอะไรเกิดขึ้น

var timerId = setTimeout ( การทำงาน()(แจ้งเตือน(1)), 1000); clearTimeout(timerId);

setInterval

เมธอด setInterval มีไวยากรณ์คล้ายกับ setTimeout

var timerId = setInterval(func/code, หน่วงเวลา[, arg1, arg2...])

ความรู้สึกของการโต้แย้งก็เหมือนกัน Ale บนvіdmіnu setTimeout เรียกใช้ vikonannya funkіїไม่ใช่ครั้งเดียว แต่ทำซ้ำเป็นประจำทุก ๆ หนึ่งชั่วโมง Zupiniti vikonannya สามารถคลิกได้:

ClearInterval (รหัสจับเวลา)

เหยียบก้นเมื่อเริ่มต้นจะแสดงการแจ้งเตือนผิวเป็นเวลาสองวินาทีอย่าคลิกที่ปุ่ม "หยุด":

<ประเภทอินพุต ="button" onclick ="clearInterval(timer)" value ="(!LANG:(!LANG:Stop" > !}!} <สคริปต์ > var i = 1; ตัวจับเวลา var = setInterval ( การทำงาน()(การแจ้งเตือน(i++)), 2000);สคริปต์ >

Cherga ที่ซ้อนทับของ vitklik_v ที่ setInterval

setInterval รายสัปดาห์ (funktion, zatrymka) ตั้งค่าฟังก์ชันการแจ้งเบาะแสผ่านการนัดหมายของช่วงเวลาหนึ่งชั่วโมง เอล มีความละเอียดอ่อนอยู่ที่นี่

จริงๆ แล้ว การหยุดระหว่างรอบจะน้อยลง ช่วงเวลาก็ต่ำลง

ตัวอย่างเช่น ใช้ setInterval(function() ( func(i++) ), 100) จะมี func skin 100 ms เพื่อเพิ่มมูลค่าของ lichnik

ต่ำกว่าเล็กน้อย บล็อกสีแดง - ชั่วโมงของ func ชั่วโมงระหว่างบล็อก - ชั่วโมงเดียวกันระหว่างการเรียกใช้ฟังก์ชันและชั่วโมงที่เล็กกว่า มีการติดตั้ง jam ไว้ด้านล่าง!

ดังนั้น เบราว์เซอร์จึงเริ่มต้นการเรียกใช้ฟังก์ชันอย่างนุ่มนวลใน 100ms โดยไม่ต้องปรับเวลาของฟังก์ชันเอง

Buvay, vykonannya funktsіїใช้เวลามากกว่าหนึ่งชั่วโมง nizh zatrimka เช่น ฟังก์ชันพับได้ แต่มีสะดุดเล็กน้อย แต่หน้าที่คือการล้างแค้นผู้ดำเนินการแจ้งเตือน/ยืนยัน/พร้อมท์ ราวกับว่ากำลังปิดกั้นการไหลของสัญญาณเตือน และที่นี่tsіkavіrechіเริ่มต้น

หากไม่สามารถเรียกใช้ฟังก์ชันได้ แสดงว่าเบราว์เซอร์ไม่ว่าง เข้าแถว และปรากฏว่าเหมือนกับการโทรของเบราว์เซอร์

ภาพด้านล่างเป็นตัวอย่างของภาพที่จำเป็นสำหรับการทำงาน ตราบเท่าที่พวกเขาได้รับชัยชนะ

ฟังก์ชันรายสัปดาห์ การเริ่มต้น setInterval เพิ่มในบรรทัดและประมาทเลินเล่อ หากเราสามารถ:

การเปิดใช้ฟังก์ชันอื่นจะดำเนินการทันทีที่ฟังก์ชันแรกเสร็จสิ้น:

มากกว่าหนึ่งครั้ง อย่าวาง vikonnanny บนเส้น

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

ในภาพด้านล่าง setInterval ใช้เพื่อหน่วงเวลาฟังก์ชัน 200 ms และตั้งค่าการเรียกปลุกในสาย ที่ 300 ms และ 400 ms ตัวจับเวลาจะถูกส่งต่ออีกครั้ง แต่จะไม่มีอะไรผ่านไปอีก

setInterval รายสัปดาห์ไม่รับประกันการกระตุกระหว่างวิคอน

Buvayut vipadki ถ้าจริง zatrimka มากหรือน้อยสำหรับงาน Vzagali ไม่ใช่ความจริงที่ว่ามันจะเป็นเหมือน zatrimka

ทำซ้ำการซ้อน setTimeout

ใน vipads ถ้าคุณต้องการไม่เพียงแค่การทำซ้ำแบบปกติแต่ต้องติดตามระหว่างการเปิดตัว คุณจะต้องใส่ setTimeout เข้าไปใหม่ด้วยฟังก์ชัน viconan ของสกิน

ด้านล่างเป็นก้นซึ่งดูเหมือนการเตือนด้วยช่วงเวลา 2 วินาทีและระหว่างนั้น

<ประเภทอินพุต ="button" onclick ="clearTimeout(timer)" value ="(!LANG:(!LANG:Stop" > !}!} <สคริปต์ > var i = 1; ตัวจับเวลา var = setTimeout ( เรียกใช้ฟังก์ชัน ()(alert(i++); timer = setTimeout(run, 2000); ), 2000);สคริปต์ >

ในบรรทัดรายชั่วโมง จะมีการแก้ไขระหว่างการเปิดตัว ภาพประกอบสำหรับการตัดแต่ง 100ms:

ตัวจับเวลาหน่วงเวลาขั้นต่ำ

ตัวจับเวลาเบราว์เซอร์อาจพูดติดอ่างเล็กน้อย มันเปลี่ยนจากประมาณศูนย์เป็น 4ms ในเบราว์เซอร์สมัยใหม่ สำหรับผู้สูงอายุ คุณสามารถมีมากขึ้นและเข้าถึง 15ms

เบื้องหลังมาตรฐาน การพูดติดอ่างขั้นต่ำคือ 4ms ดังนั้นจึงไม่มีความแตกต่างระหว่าง setTimeout(..,1) และ setTimeout(..,4)

ลักษณะการทำงาน setTimeout และ setInterval มีฟีเจอร์ Zero-thumb และเฉพาะเบราว์เซอร์

  1. Opera, setTimeout(.., 0) เหมือนกับ setTimeout(.., 4) สามารถเปรียบเทียบได้ด้านล่าง setTimeout(..,2) เบราว์เซอร์ Tse sooblivist tsgo
  2. setInterval(.., 0) null stutter ของ Internet Explorer ไม่ทำงาน ไปที่ setInterval ด้วยตัวคุณเอง setTimeout(.., 0) ทำงานได้ดี

ความถี่ที่แท้จริงของ spratsovuvannya

Spratsovuvannya สามารถรวยได้เร็วกว่านี้ ในความผันผวนหลายประการ การตัดแต่งต้องไม่ใช่ 4ms แต่ 30ms หรือ 1000ms

เบราว์เซอร์ส่วนใหญ่ (เดสก์ท็อปในภาษาเปอร์เซีย) ยังคงเรียกใช้ setTimeout / setInterval ต่อไปเมื่อแท็บไม่ทำงาน ในกรณีนี้ จำนวนหนึ่ง (Chrome, FF, IE10) จะลดความถี่ของตัวจับเวลาขั้นต่ำลงได้มากถึง 1 ครั้งต่อวินาที ที่ออกมาว่า “เบื้องหลัง” ผู้ฝากเงินมีตัวจับเวลาแต่ไม่ค่อยมี

เมื่อใช้แบตเตอรี่ ในแล็ปท็อป เบราว์เซอร์สามารถลดความถี่ได้ เพื่อให้สามารถปิดใช้งานรหัสและป้องกันการชาร์จแบตเตอรี่ได้ง่ายขึ้น โดยเฉพาะ cym vidomy IE การลดระดับสามารถตีได้สองสามครั้ง ร่วงหล่นในสนาม เมื่อถูกครอบงำโดยตัวประมวลผล JavaScript คุณอาจไม่สามารถแทนที่ตัวจับเวลาได้ หากเป็นเช่นนั้น การรัน setInterval จะถูกข้ามไป

Visnovok: ที่ความถี่ 4ms, varto orient แต่อย่าเปิด varto

การดูช่วงที่คอนโซล

var timeMark=วันใหม่; setTimeout( ฟังก์ชัน go()(var diff = ใหม่ วันที่ - timeMark; // เข้าสู่ zatrymka ของปีศาจในคอนโซลคอนโซล .log(diff); // จำชั่วโมงที่สิ้นสุด // เพื่อลดการพูดติดอ่างระหว่าง wikis timeMark = วันที่ใหม่; setTimeout(ไป, 100); ), 100);

setTimeout(func, 0) เคล็ดลับ

เคล็ดลับนี้จะไปที่บันทึกย่อของการแฮ็ก JavaScript

ฟังก์ชันถูกปิดด้วย setTimeout(func, 0) ดังนั้นคุณจึงต้องการเรียกใช้หลังจากสคริปต์สตรีมสิ้นสุด

ทางด้านขวาคือ setTimeout ไม่มีทางเอาชนะฟังก์ชันได้ตั้งแต่แรก น้อยกว่าplanuєїї vikonannya อ๋อ ล่าม JavaScript มีแนวโน้มที่จะแทนที่ฟังก์ชันที่กำหนดเวลาไว้มากกว่าหลังจากแทนที่สคริปต์การสตรีม

เบื้องหลังมาตรฐาน setTimeout ไม่สามารถแทนที่ฟังก์ชันจากการหมดเวลาเป็น 0 ได้ตลอดเวลา ดังที่เราได้กล่าวไว้ก่อนหน้านี้ การหมดเวลาจะกลายเป็น 4ms Ale smut here คนที่จะเคยเป็น vikonnannya ได้ตลอดเวลาจะตามหลัง vikonannya ของสตรีมโค้ด

ตัวอย่างเช่น:

varresult; ฟังก์ชั่น showResult()( alert(ผล); ) setTimeout(showResult, 0 ); ผลลัพธ์ = 2 * 2; // มีชีวิต 4

ด้วยกัน

เมธอด setInterval(func, delay) และ setTimeout(func, delay) อนุญาตให้ func ทำงานเป็นประจำ/ทุกๆ มิลลิวินาทีที่หน่วงเวลา

มีสองวิธีในการเปลี่ยนตัวระบุตัวจับเวลา คุณสามารถใช้ clearInterval/clearTimeout คลิกด่วนสำหรับซิปได้

| | setinterval | setTimeout | || ----------- | ---------- | | เวลา | ไปหลังตัวจับเวลาทุกสัปดาห์อย่างเคร่งครัด ในฐานะล่ามอาชีพ หนึ่งสัปดาห์หายไปในชุดดำ ไม่รับประกันชั่วโมงของการสิ้นสุดของฟังก์ชัน ช่วงเวลานั้นหลังจากเสร็จสิ้นการเริ่มต้นอันหนึ่งบนซังของอีกอันหนึ่งสามารถเปลี่ยนแปลงได้ | setTimeout แบบเรียกซ้ำรายสัปดาห์จะแทนที่ setInterval ซึ่งจำเป็นต้องหยุดชั่วคราวระหว่างรอบ | | ตัดแต่ง ตัดแต่งขั้นต่ำ: 4ms. | จางขั้นต่ำ: 4ms | | เฉพาะเบราว์เซอร์ IE ไม่ใช้ 0 stutter Opera มี 0 stutter เทียบเท่ากับ 4ms ส่วน stutters อื่น ๆ จะได้รับการประมวลผลอย่างแน่นอน รวมถึง 1ms, 2ms และ 3ms ที่ไม่ได้มาตรฐาน |

เมื่อเขียนโปรแกรมด้วยภาษาสคริปต์ จำเป็นต้องสร้างการหยุดชั่วคราวเป็นระยะ - เพื่อหยุดโปรแกรมชั่วคราวเป็นเวลาหนึ่งชั่วโมงแล้วจึงทำงานต่อ ตัวอย่างเช่น สคริปต์ VBS และ PHP สามารถใช้วิธีการต่อไปนี้:

VBS: wscript.sleep 1500 (สลีปเป็นเวลา 1.5 วินาที)

PHP: สลีป(10); (Zupinka เป็นเวลา 10 วินาที)

Pіd h podіbnihหยุดระบบ vykonoyuchu (PHP หรือ VBS) ไม่ทำอะไร. Rozrobnik ลองใช้ Javascript แบบสัญชาตญาณแล้วคุณจะรู้สึกกระปรี้กระเปร่าอย่างไม่อาจยอมรับได้ การให้อภัยโดยทั่วไปเมื่อพยายามหยุดชั่วคราวใน Javascript จะมีลักษณะดังนี้:

ฟังก์ชัน badtest() ( สำหรับ (var i = 1; i< 10; i++) { window.setTimeout("document.getElementById("test1").value += " + i, 900) } }

คุณคิดว่าถ้าในระหว่างรอบของเชอร์กา คุณไปถึงการวาดหมายเลขเชอร์กาของคุณ setTimeoutเข้าสู่หุ่นยนต์ Javascript อย่างตรงไปตรงมา ตรวจสอบ 0.9 วินาที เพิ่มตัวเลขที่ส่วนท้ายของฟิลด์ป้อนข้อมูล จากนั้นไปที่หุ่นยนต์ แต่แท้จริงแล้วมันไม่ใช่อย่างนั้น: setIntervalі setTimeoutใน Javascript จำเป็นต้องเพิ่มมากกว่าtієїdії (หรือฟังก์ชั่น) ตามที่ระบุโดยแขน ตัวอย่างของเราจะมีลักษณะดังนี้:

  1. ผม = 1;
  2. เพิ่มหมายเลข "1" ลงในช่องป้อนข้อมูลเป็นเวลา 0.9 วินาที
  3. negainoหลังจากกำหนดงานนี้ วัฏจักรดำเนินต่อไป: i = 2;
  4. เพิ่มตัวเลข "2" ลงในช่องป้อนข้อมูล 0.9 วินาที

negainoหมายถึง ตัวอย่างเช่น 1 มิลลิวินาที (ซึ่งมีขนาดเล็กมากจนเข้าใจไม่ได้ เท่ากับ 900 มิลลิวินาที) วัฏจักรนี้จะทำให้งานของคุณสำเร็จลุล่วง โดยสร้างงานจำนวนมากในเวลาเดียวกัน Tse หมายความว่ารายการทั้งหมดสำหรับ "ภาพวาด" จะเสร็จสมบูรณ์ในเวลาจริงในชั่วโมงเดียวกันโดยไม่มีการหยุดชั่วคราวระหว่างการเพิ่มตัวเลขใหม่ รอบเริ่มต้น; ทั้งหมดจางเป็น 0.9; และ shirr - ตัวเลขทั้งหมดถูกจัดเรียงเป็นแถวทีละตัว

และวิธีทำสาสสุวัตอย่างถูกต้องในครั้งนี้ setTimeout? มันซับซ้อน. มาเรียกฟังก์ชั่น ซ้ำๆ(อยู่ตรงกลางของฟังก์ชัน ฟังก์ชันสุด ๆ) และเพื่อให้กระบวนการไม่จำกัด ตั้งค่าฟัน (เช่น ค่าของตัวเลขอื่น ๆ):

ฟังก์ชัน welltest() ( if (i< 9) { document.getElementById("test2").value += ++i window.setTimeout("welltest()", 400) } }

เปลี่ยนอีกแล้ว ฉันเกิดขึ้นเพื่อเริ่มการทำงานของท่าทาง - ตัวอย่างเช่นเช่นนี้:

ขณะนี้แกนทำงานตามที่ควรจะเป็น (เราเปลี่ยนชั่วโมงของการตัดแต่งจาก 0.9 เป็น 0.4 วินาที) แต่สำหรับงานที่คล้ายกัน มีเหตุผลมากกว่าที่จะไม่หยุด setTimeoutเอ setInterval(ถ้าคุณต้องการสองฟังก์ชั่น):

ฟังก์ชัน besttest() ( window.i = 0 window.timer1 = window.setInterval("draw()", 400) ) ฟังก์ชัน draw() ( document.getElementById("test3") .value += ++i if (i >= 9) clearInterval(window.timer1) )

คุณสมบัติของ Javascirpt Method setIntervalสำหรับผู้ที่ไม่ผ่านไวน์ "ด้วยตัวเอง" โยคะต้องทำด้วยวิธีพิเศษ clearInterval. ดังนั้นจึงตระหนักได้ว่าเช่นเดียวกัน zavdannya vіdkladenoї dії ถูกกำหนดตัวระบุพิเศษ - ตัวจับเวลา: window.timer1 = window.setInterval(...)

ตัวระบุสามารถป้อนด้วยวิธีนี้โดยค่าเริ่มต้นโดยใช้ method setTimeout. ตัวระบุตัวจับเวลาทั้งหมดต้องถูกรู้จักอย่างละตัว (ต้องไม่ซ้ำกันภายในหน้าต่างการสตรีมของเบราว์เซอร์) ในทำนองเดียวกันสามารถทำได้ในตอนท้ายของวันเมื่อมีการนัดหมายที่ได้รับชัยชนะและการนัดหมายสามารถทำได้พร้อมกัน (ครั้งเดียวพร้อมกันเนื่องจากคอมพิวเตอร์มีทรัพยากรจำนวนมาก) ซึ่งโดยหลักการแล้วเป็นไปไม่ได้ PHP หรือ VBS

ด้านก้นของแกนที่มีตัวจับเวลา Javascript จำนวนมาก ซึ่งสามารถทำงานได้หนึ่งชั่วโมง: setinterval.htm (ฟังก์ชัน Javascript ในไฟล์ setinterval.js) คุณสามารถสตาร์ทหุ่นยนต์ของตัวจับเวลาทั้งหมดที่ด้านข้าง (เมนูเมนู) ด้วยปุ่ม Esc ตัวจับเวลาของแอปพลิเคชันทั้งหมดขึ้นอยู่กับ "ธรรมชาติ" (และไม่ใช่นามธรรม) ฉัน++) vіdlіk - ชั่วโมงหรือvіdstanі "วันครบรอบ" ทั้งหมดได้รับการซิงโครไนซ์เป็นพิเศษ (เพื่อความถูกต้อง) ตัวจับเวลาซึ่งอยู่ในชนบทจะกะพริบใน "ตัวบ่งชี้" และในเมนูซึ่งคุณสามารถดูได้ ("vyzhdzhaє")

เมนูวีไอพี

เมนูของเรา scho vyzhdzhaє - vyzhdzhaєจริงๆ (z-pіd "caps"): ช่องว่างระหว่างองค์ประกอบถูกเติมเป็นพิเศษ schob bachiti เหมือนออกจากvіїzhdzhaє โดยไม่คาดคิด ปรากฏว่าเราไม่สามารถสร้างการเปลี่ยนแปลงที่ราบรื่นสำหรับรายการวันต่างๆ ได้ แม้จะเนื่องมาจากประสิทธิภาพการทำงานของคอมพิวเตอร์ต่ำ (AMD Athlon 999 MHz)

เห็นได้ชัดว่าจำเป็นต้องเสร็จสิ้นความงามของความสามัคคีนั้นเพื่อให้รายการเมนูต่างๆหลุดออกไปในชั่วโมงนั้น Tobto dowshi รายการวิปัสสนาสำนึกผิดที่มีความรู้สึกผิดมากกว่า สั้น - มีความเยือกเย็นน้อยกว่า จะนำไปปฏิบัติได้ดังนี้

  1. เราติดตั้ง "วิสัยทัศน์" ชั่วโมงสุดท้ายเช่น 200 มิลลิวินาที
  2. แม้ว่ารายการที่ตกลงมาสามารถมีความสูงได้ 20 พิกเซล แต่แน่นอนว่าเราสามารถวางลงหนึ่งพิกเซลต่อช่วงเวลา 10 มิลลิวินาที และแม้แต่ใน 200 มิลลิวินาที รายการทั้งหมดก็จะพอดี
  3. ตัวอย่างเช่น รายการที่ตกลงมา อาจมีความสูง 40 พิกเซล เพื่อที่จะรวมในชั่วโมงเดียวกัน เรามีความผิดในการลดลงหนึ่งพิกเซลต่อ 5 มิลลิวินาที

สำหรับตรรกะนี้ เช่นเดียวกับรายการที่ตกลงมา อาจมีความสูง 200 พิกเซล เรามีความผิดในการลดระดับโยคะลงหนึ่งพิกเซลต่อ 1 มิลลิวินาที แต่ความเร็วดังกล่าวในคอมพิวเตอร์ของเราใช้งานไม่ได้ - เบราว์เซอร์ไม่ได้รับตำแหน่งใหม่ของรายการในเสี้ยววินาที ดังนั้น. Javascript ดีแล้ว (มีอะไรจะดีอีก) แต่บราวเซอร์ (Firefox) ไม่ใช่ สถานการณ์ทั่วไปสำหรับอินเทอร์เน็ต

เลยใช้เวลาในการดูเมนูมากหรือน้อยก็ทำได้แค่ขอความช่วยเหลือก็ยังไม่ชัดเจนเท่าไหร่ คอมพิวเตอร์สวีเดน. แต่เราจะโทษว่าแพงที่สุดหรือไม่? อัลกอริทึม (โดยไม่ต้องอัปเกรดรหัสเฟิร์มแวร์ของคอมพิวเตอร์) มีลักษณะดังนี้:

  1. ตั้งค่าชั่วโมงบนเป็นมุมมองรายการ: เวลา = 224 (มิลลิวินาที)
  2. ตั้งค่าชั่วโมงต่ำสุดของหนึ่งช่วงในรอบ: หน่วงเวลา = 3 (มิลลิวินาที)
  3. ตั้งค่าระยะขอบขั้นต่ำสำหรับรายการ: offset = 1 (px)
  4. เราเปลี่ยนทุกอย่างในเวลาที่รกร้างตามความสูงของรายการ: 1) เพิ่มชั่วโมงของการตัดแต่ง (ช่วงเวลา) กลับเป็นสัดส่วนกับความสูงและโดยตรงในสัดส่วนของเวลาชั่วโมงสูง (ที่ความสูง 224 ค่าสัมประสิทธิ์ ล่วงหน้าคือ 1); 2) แม้ว่าความสูงจะใหญ่กว่าสำหรับ 40 พิกเซล แต่ขนาดขั้นต่ำจะใหญ่กว่าตามสัดส่วนความสูง ค่าคงที่ "40" ถูกลบออกโดยวิธีอย่างเป็นทางการสำหรับคอมพิวเตอร์ยอดนิยมที่สุด การทดสอบบนคอมพิวเตอร์ Pentium 4 CPU 2.53GHz แสดงให้เห็นตัวเลขเดียวกัน - 40 มิฉะนั้น ตัวจับเวลาจะแยกออกจากกัน รายการไม่อยู่ในขั้นตอน

Axis ตอนนี้แสดงรายการviїzhdzhayut สำหรับชั่วโมงที่คล้ายกันมากหรือน้อย ที่ด้านข้าง setinterval.htm

แกนฉันบรูซ:

ฟังก์ชัน slide_do(obj, maxtop, offset) ( if (getTopLeft(obj).top< maxtop) { obj.style.top = getTopLeft(obj).top + offset } else { if (obj && obj.timer1) { clearInterval(obj.timer1) obj.timer1 = null } } }

ฟังก์ชันซึ่งแสดงแท็บในรายการเมนูนั้นค่อนข้างง่าย เหลือเพียงเปิดตัวїїโดยประมาณในแถวดังกล่าว:

ts.timer1 = setInterval(ฟังก์ชัน()(slide_do(ts, maxtop, offset)), หน่วงเวลา)

ก่อนเริ่มต้น เพียงคำนวณค่าทั้งหมดของ maxtop และ offset แล้ววางรายการไว้ที่ตำแหน่ง mintop ฟังก์ชัน “ด้านหน้า” ทำหน้าที่อะไร สไลด์ () rozmirom 40 แถว และทั้งหมดในครั้งเดียว - ในไฟล์ setinterval.js ดังนั้นอึนี้จะไม่ทำงานหากไม่มีไฟล์สไตล์ที่แนบมา

สิ่งสำคัญคือต้องเข้าใจวิธีใช้ตัวจับเวลา JavaScript โดยส่วนใหญ่แล้ว พฤติกรรมของเราไม่ได้แตกสลายด้วยความไวต่อกระแสน้ำที่ไหลแรงตามสัญชาตญาณของเรา และมันเชื่อมโยงกับมันด้วยว่ากลิ่นเหม็นจะจบลงในเหงื่อเพียงครั้งเดียว มาดูฟังก์ชันบางอย่างกัน ซึ่งเราสามารถใช้ตัวจับเวลาได้:

  • var id = setTimeout(fn, หน่วงเวลา); - สร้างตัวจับเวลาอย่างง่ายที่เปิดใช้งานฟังก์ชั่นหลังจากพูดติดอ่างที่กำหนด ฟังก์ชันจะหมุน ID เฉพาะ เพื่อช่วยในการกำหนดตัวจับเวลา
  • var id = setInterval(fn, หน่วงเวลา); - คล้ายกับ setTimeout แต่เรียกใช้ฟังก์ชันอย่างต่อเนื่องในช่วงเวลาที่กำหนด (จนกว่าจะมีการเรียก)
  • clearInterval(id); clearTimeout(id); - ยอมรับตัวจับเวลา ID (เปลี่ยนหนึ่งในฟังก์ชั่นที่อธิบายไว้ข้างต้น) และโทรกลับ "a.
เป็นความคิดที่ดี หากคุณลองพิจารณาดู ดูเหมือนว่าไม่รับประกันความถูกต้องของระยะเวลาการตัดขอบของตัวจับเวลา ด้วยเหตุผลที่ดี เบราว์เซอร์จะแฮ็กย่อย JavaScript แบบอะซิงโครนัสทั้งหมดในเธรดเดียว (เช่น การคลิกเมาส์หรือตัวจับเวลา) และเฉพาะในชั่วโมงนั้นเท่านั้น หากถึงคิวย่อย แผนภาพถัดไปแสดงให้เห็นสิ่งที่ดีที่สุด:

เพื่อให้ข้อมูลจำนวนมากแก่เด็ก ๆ ทุกคน วิธีรับข้อมูล และยังช่วยให้คุณเข้าใจกลไกของหุ่นยนต์อะซิงโครนัสและ JavaScript ได้ดีขึ้น ในแผนภาพนี้ การแสดงชั่วโมงและมิลลิวินาทีในแนวตั้ง บล็อกสีน้ำเงินแสดงบล็อกของโค้ด JavaScript ซึ่งเป็นการพิมพ์ประเภทหนึ่ง ตัวอย่างเช่น บล็อกแรกถูกทำเครื่องหมายไว้ตรงกลางเป็นเวลา 18 มิลลิวินาที การคลิกเมาส์จะบล็อกการทำเครื่องหมายเป็นเวลาประมาณ 11 มิลลิวินาที เป็นต้น

JavaScript สามารถแทนที่โค้ดได้เพียงอันเดียว (ผ่านลักษณะเธรดเดียวของการแทนที่) ในขณะที่บล็อกรูทีนย่อยแบบอะซิงโครนัสอื่นๆ ซึ่งหมายความว่าเมื่อพ็อดแบบอะซิงโครนัสผิด (เช่นการคลิกเมาส์ ตัวจับเวลา wick หรือคำขอ XMLHttp เสร็จสมบูรณ์) การชนะจะถูกเพิ่มลงในบรรทัดและต่อมา (แน่นอนว่าการใช้งานนั้นแตกต่างกันไปตามความเสถียรของเบราว์เซอร์ แต่ให้ชัดเจน)

ประการแรก เป็นที่ชัดเจนว่าตัวจับเวลาสองตัวเริ่มต้นที่ตรงกลางของบล็อก JavaScript: setTimeout ที่มีความล่าช้า 10ms และ setInterval โดยมีการหน่วงเวลาเท่ากัน จำเป็นหากตัวจับเวลาเริ่มต้น มันจะเริ่มทันที หากบล็อกแรกของรหัสยังไม่เสร็จสมบูรณ์ อย่างไรก็ตาม โปรดทราบว่าไม่สามารถใช้ VIN โดยตรงได้ (ไม่สามารถทำได้ผ่านเธรดเดียว) เพิ่ม Natom_st แล้ว ฟังก์ชั่นนี้ถูกใช้ที่สีดำและ vykonuetsya ในช่วงเวลาถัดไปที่พร้อมใช้งาน

นอกจากนี้ เมื่อบล็อก JavaScript แรกสิ้นสุดลง บล็อกจะเรียกว่าการคลิกเมาส์ Obrobnik tsієї asynchronous podії (แต่มันไม่ตรงกันเพื่อที่เราไม่สามารถส่งต่อได้) ไม่สามารถเอาชนะได้โดยไม่หยุดพักในขณะนี้ vin นั้นก็ถูกใช้ไปในสายเช่นตัวจับเวลา

หลังจากที่บล็อกแรกของโค้ด JavaScript ถูกจี้ เบราว์เซอร์จะถามว่า "ใครกำลังตรวจสอบการไฮแจ็ก" ในเวลาเดียวกัน นักสะสมคลิกที่เมาส์และตัวจับเวลาจะถูกตำหนิที่สถานี เบราว์เซอร์เลือกหนึ่งในนั้น (ตัวคลิก) และชนะ ตัวจับเวลาจะตรวจสอบส่วนที่มีของชั่วโมงในชั่วโมงถัดไป

ให้เคารพในขณะที่การจับการคลิกของเมาส์ยังคงทำงานอยู่ ให้ใช้การเรียกกลับเป็นช่วงแรก ดังนั้นมันจึงเหมือนกับการเรียกกลับของตัวจับเวลา โดยจะมีคำสั่งจากฝ่ายดำ Prote ตรวจสอบว่าถ้าฉัน spratsyuєช่วงเวลาอีกครั้ง (จนกว่าจะถึงเวลาโทรกลับ) การชนะจะถูกลบออกจากแผนภูมิ Yakby all interval-callback" และผลาญคิวในขณะที่กำลังตรวจสอบโค้ดชิ้นใหญ่อยู่ จะทำให้มีการสร้างฟังก์ชันขึ้นมามากมาย เพื่อตรวจสอบการโทรโดยไม่เกิดความล่าช้าระหว่างช่วงสิ้นสุด โทร. เพิ่มอีกหนึ่งให้กับภาพวาด

ด้วยวิธีนี้ เราสามารถระวังความล้มเหลวได้หากมีการเรียกใช้ช่วงเวลา-การโทรกลับเป็นครั้งที่สามหลังจากช่วงเวลานี้ หากล้มเหลว นี่เป็นลักษณะสำคัญที่ต้องแสดงให้เห็น: ช่วงเวลาไม่อนุญาตให้ผู้ที่ได้รับชัยชนะในครั้งเดียว พวกเขาจะถูกเพิ่มเข้าไปในเส้นโดยไม่ทำให้ช่วงเวลาของการขัดขวางระหว่างผู้ชนะสมดุล

Nareshti หลังจากการเรียกกลับช่วงเวลาอื่นเสร็จสิ้น เราหวังว่าจะไม่มีสิ่งใดถูกทิ้งไว้ ที่เครื่องยนต์ JavaScript จะต้องถูกตำหนิ ซึ่งหมายความว่าเบราว์เซอร์จะตรวจสอบการย่อยแบบอะซิงโครนัสใหม่อีกครั้ง อย่าข้ามเป็นเวลา 50ms การโทรกลับช่วงเวลาจะเริ่มอีกครั้ง ในขณะนี้ ไม่มีอะไรต้องเคลียร์ ซึ่งจะบล็อกโยคะ มันจะไม่ทำงานสำหรับสิ่งนั้น

ลองมาดูตัวอย่างที่แสดงความแตกต่างระหว่าง setTimeout และ setInterval
setTimeout(function()( /* บล็อคยาวของโค้ด... */ setTimeout(arguments.callee, 10); ), 10); setInterval(function()( /* บล็อคยาวของโค้ด... */ ), 10);
ทั้งสองตัวเลือกนี้เทียบเท่ากันในแวบแรก แต่ในความเป็นจริงแล้วไม่เป็นเช่นนั้น รหัสที่จะ setTimeout เพื่อตั้งค่าการหมดเวลาจะเป็น 10ms หลังจากการวนซ้ำไปข้างหน้า (อาจใหญ่กว่านี้ แต่ไม่สามารถเล็กลงได้) เช่นเดียวกับรหัสที่จะ setInterval เพื่อ setInterval เพื่อเรียกสกิน 10ms ข้างหน้าทางขวา ขึ้นอยู่กับ กับจำนวนครั้ง

มาสรุปทุกสิ่งที่กล่าวไว้:
- เอ็นจิ้น JavaScript เป็นมิดเดิลแวร์แบบเธรดเดียว แปลงอินพุตแบบอะซิงโครนัสเป็นบรรทัด ซึ่งถูกล้าง
- ฟังก์ชัน setTimeout และ setInterval มีความแตกต่างกันโดยพื้นฐานในโค้ดแบบอะซิงโครนัส
- หากไม่สามารถจับเวลาได้ในช่วงเวลาที่กำหนด จะถูกวางไว้ก่อนจุดเริ่มต้นของการหยุดพัก (เนื่องจากจะทำสำหรับ bagan zatrimka)
- ช่วงเวลา (setInterval) สามารถวนซ้ำได้ทีละครั้งโดยไม่มีการกระตุก เนื่องจากใช้เวลามากกว่าหนึ่งชั่วโมง การกระตุกจะถูกกำหนดด้านล่าง

ทุกอย่างเป็นข้อมูลที่สำคัญมากสำหรับการแจกจ่าย การรู้ว่ากลไก JavaScript ทำงานอย่างไร โดยเฉพาะอย่างยิ่งพ็อดย่อยแบบอะซิงโครนัสจำนวนมาก (ซึ่งมักใช้) จะเป็นการวางรากฐานสำหรับการสนับสนุนการเพิ่มใหม่

© 2022 androidas.ru - ทั้งหมดเกี่ยวกับ Android