Ripetere l'ora JavaScript tramite job interval hour. Applicare le funzioni jQuery-setTimeout(). Problemi correlati con "questo"

Golovna / Malfunzionamenti di Usunennya

Il setInterval() metodo, distribuito tra le interfacce di finestra e di lavoro, chiama ripetutamente una funzione o esegue uno snippet di codice, con un intervallo di tempo fisso tra ogni chiamata. Questo si trasforma in un intervallo ID, che neob-language identifica l'intervallo, quindi puoi saltare a quel termine con l'aiuto di callinterval() . Questo metodo dipende dall'aiuto del mixin WindowsOrWorkerGlobalScope.

Sintassi

varintervalID = scopo.setInterval( funz, ritardo, [arg1, arg2, ...]); varintervalID = scopo.setInterval( codice, ritardo);

Parametri

func Una funzione da eseguire ogni millisecondo di ritardo. Questa funzione non si ripete, sia essa una specie di pensiero, e non un significato rinnovato, ma rivelata. code Per una sintassi opzionale aggiuntiva, puoi includere string invece di funzione, che è skin comprimibile e viconanimo uguale a milliononivcon. La sintassi Tsei è non consigliato per gli stessi motivi che rendono l'utilizzo di eval() un rischio per la sicurezza. ritardo Il tempo, in millisecondi (migliaia di due), in cui il timer deve ritardare tra le esecuzioni della funzione o del codice specificato. Fare clic sui dettagli sui valori di ritardo assegnati. arg1, ..., argN Opzionale Argomenti aggiuntivi che vengono passati alla funzione specificata da funz una volta scaduto il timer.

Nota: il passaggio di argomenti aggiuntivi a setInterval() nella prima sintassi non funziona in Internet Explorer 9 e versioni precedenti. Mentre provi a fornire alcune funzionalità a quale browser sei responsabile del polyfill (vedi la sezione).

valore di ritorno

intervalID è un valore numerico, diverso da zero, che identifica il timer creato dalla chiamata a setInterval(); questo valore può essere passato per annullare il timeout.

Può essere efficiente assicurarsi che setInterval() e setTimeout() condividano il sam pool di ID e che clearInterval() e clearTimeout() possano essere tecnicamente usati in modo intercambiabile. Per chiarezza, tuttavia, sei responsabile di cercare di abbinarlo per evitare confusione se mantieni il tuo codice.

Nota: l'argomento ritardo viene convertito in un numero intero a 32 bit con segno. Il termine effettivo aggiunge fino a 2147483647 ms, quindi si presume che l'argomento ritardo sia un identificatore nell'IDL.

Esempi

Esempio 1: sintassi di base

I passaggi successivi dimostrano la sintassi di base di setInterval() "s.

Var intervalID = window.setInterval(myCallback, 500, "Parameter 1", "Parameter 2"); function myCallback(a, b) ( // Il tuo codice qui // I parametri sono puramente opzionali. console.log(a); console.log(b); )

Esempio 2: alternare due colori

Quindi, ricorda la funzione flashtext() un secondo fino a quando non viene premuto il pulsante Stop.

esempio setInterval/clearInterval

Ciao mondo

Esempio 3: Simulazione di una macchina da scrivere

Footsteps simula la macchina da scrivere cancellando e quindi digitando lentamente il contenuto in NodeList che corrisponde a un gruppo specificato di selettori.

Macchina da scrivere JavaScript - Esempio MDN

CopyLeft 2012 di Mozilla Developer Network

[ giocare a | Pausa | Terminare ]

Vivamus blandit massa ut metus mattis in fringilla lectus imperdiet. Proin ac ante a felis ornare vehicula. Fusce pellentesque lacus vitae eros convallis ut mollis magna pellentesque. Pellentesque placerat enim at lacus ultricies vitae facilisis nisi fringilla. In tincidunt tincidunt tincidunt.

Macchina da scrivere JavaScript

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ultrices dolor ac dolor imperdiet ullamcorper. Suspendisse quam libero, luctus auctor mollis sed, malesuada condimentum magna. Quisque in ante tellus, in placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec a mi magna, quis mattis dolor. Etiam sit amet ligula quis urna auctor imperdiet nec faucibus ante. Mauris vel consectetur dolor. Nunc eget elit eget velit pulvinar fringilla consectetur aliquam purus. Curabitur convallis, justo posuere porta egestas, velit erat ornare tortor, no viverra justo diam eget arcu. Phasellus adipiscing fermentum nibh ac commodo. Nam turpis nunc, suscipit a hendrerit vitae, volutpat non ipsum.

Phasellus ac nisl lorem:

Duis lobortis sapien quis nisl luctus porttitor. Nel periodo sempre libero, eu tincidunt dolor eleifend sit amet. Ut nec velit in dolor tincidunt rhoncus non non diam. Morbi auctor ornare orci, non euismod felis gravida nec. Curabitur elementum nisi a eros rutrum nec blandit diam placerat. Aenean tincidunt risus ut nisi consectetur cursus. Ut vitae quam elit. Donec dignissim est in quam tempor consequat. Aliquam aliquam diam non felis convallis suscipit. Nulla facile. Donec lacus risus, dignissim et fringilla et, egestas veleros. Duis malesuada accumsan dui, in fringilla mauris bibStartum quis. Cras adipiscing ultricies fermentum. Praesent bibStartum condimentum feugiat.

Nam faucibus, ligula eu fringilla pulvinar, lectus tellus iaculis nunc, vitae scelerisque metus leo non metus. Proin mattis lobortis lobortis. Quisque acccsan 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.

argomenti di richiamata

Guardando al futuro, Internet Explorer 9 non considera nemmeno il passaggio di argomenti alle funzioni di callback in setTimeout() o setInterval() . Il seguente specifico di IE codice per dimostrare un metodo per superare tale scambio. Per hackerare, accelerare il codice successivo nella finestra in alto dello script.

/*\ |*| |*| Polyfill specifico di IE che consente il passaggio di argomenti arbitrari a |*| funzioni di callback dei timer javascript (sintassi standard HTML5)..setInterval |*| https://sito web/Utente:fusionchess |*| |*| Sintassi: |*| var timeoutID = window.setTimeout(func, delay[, arg1, arg2, ...]); |*| var timeoutID = window.setTimeout(codice, ritardo); |*| var intervalID = window.setInterval(func, delay[, arg1, arg2, ...]); |*| var intervalID = window.setInterval(codice, ritardo); |*| \*/ if (document.all && !window.setTimeout.isPolyfill) ( var __nativeST__ = window.setTimeout; window.setTimeout = funzione (vCallback, nDelay /*, argumentToPass1, argumentToPass2, ecc. */) ( var aArg .prototype .slice.call(arguments, 2); if (document.all && !window.setInterval.isPolyfill) ( var __nativeSI__ = window.setInterval; window.setInterval = function(vCallback, nDelay /*, argumentToPass1, argumentToPass2, ecc. * /) ( var aArgs = Ar slice.call(arguments, 2);

Più opzioni per l'utilizzo di funzioni anonime, per richiamare la tua richiamata, ma la soluzione è un po' più costosa. Esempio:

Var intervalID = setInterval(function() ( myFunc("uno", "due", "tre"); ), 1000); var intervalID = setInterval(function(arg1)().bind(undefined, 10), 1000);

Schede inattive

Richiede Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)

A partire da Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), i termini sono bloccati per attivarsi non più di una volta al secondo in schede inattive.

Il problema "questo".

Dovresti sempre passare il metodo prima di setInterval(), o che si tratti di qualche altra funzione, dovrai apportare modifiche con valori validi. Esaminiamo i dettagli nel riferimento JavaScript.

Spiegazione

Il codice eseguito da setInterval() viene eseguito in un contesto di esecuzione separato rispetto alla funzione da cui è stato chiamato. Come ultima risorsa, la parola chiave per la funzione specificata deve essere assegnata all'oggetto window (o Global), che non è uguale al valore per la funzione chiamata setTimeout . Premi sul calcio del passo (come setTimeout() invece di setInterval() - potenza, in effetti, per tutti i timer):

MyArray = ["zero", "uno", "due"]; myArray.myMethod = funzione (sProperty) ( alert(arguments.length > 0 ? this : this); ); myArray.myMethod(); // Stampa "zero,uno,due" myArray.myMethod(1); // Stampa "uno" setTimeout(myArray.myMethod, 1000); // Stampa "" dopo 1 secondo setTimeout(myArray.myMethod, 1500, "1"); // stampa "undefined" dopo 1,5 secondi // il passaggio dell'oggetto "this" con .call non funzionerà // perché questo cambierà il valore di questo all'interno di setTimeout stesso // mentre vogliamo cambiare il valore di questo all'interno di myArray .myMethod // in effetti, wine è colpevole di essere sbagliato per il codice setTimeout si aspetta che questo sia l'oggetto della finestra: setTimeout.call(myArray, myArray.myMethod, 2000); // errore: "NS_ERROR_XPC_BAD_OP_ON_WN_PRO object" setTimeout.call(myArray , myArray.myMethod, 2500, 2); // stesso errore

Come puoi vedere, non c'è modo di portare il tuo oggetto alle funzioni di callback in un'alleanza JavaScript.

Una possibile soluzione

Un possibile modo per modificare la potenza è sostituire due funzioni globali naturali setTimeout() o setInterval() con due non nativo quelli che abilitano la loro chiamata tramite il metodo Function.prototype.call. L'esempio seguente mostra una possibile sostituzione:

// Consente di passare a "questo" oggetto tramite timer JavaScript var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval; window.setTimeout = funzione (vCallback, nDelay /*, argumentToPass1, argumentToPass2, ecc. */) ( var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback in? () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); ); window.setInterval = funzione (vCallback, nDelay /*, argumentToPass1, argumentToPass2, ecc. */) ( var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeSI__(vCallback in () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); );

Due modifiche si basano anche sullo standard HTML5 per passare argomenti arbitrari ai timer delle funzioni di callback in IE. Quindi possono essere usati come non conforme agli standard anche i polyfill. Vedi il per a conforme allo standard polifill.

Nuovo test delle funzionalità:

MyArray = ["zero", "uno", "due"]; myArray.myMethod = funzione (sProperty) ( alert(arguments.length > 0 ? this : this); ); setTimeout(avviso, 1500, "Ciao mondo!"); // Standard victoria setTimeout e setInterval vengono mantenuti, ma... setTimeout.call(myArray, myArray.myMethod, 2000); // Stampa "zero,uno,due" dopo 2 secondi setTimeout.call(myArray, myArray.myMethod, 2500, 2); // Stampa "due" dopo 2,5 secondi

Per una versione più complessa ma comunque modulare ( Demone) JavaScript JavaScript Gestione dei demoni . Questa versione pieghevole più grande non è solo una grande e ampia raccolta di metodi per Demone costruttore. in ogni caso, il Demone yoga constructorself non è altro che un clone di Mini Demone con un ulteriore supporto per dentro e inizio funzioni dichiarabile istanziazione del demone . Così la Mini Demone framework rimane il modo consigliato per animazioni semplici, perché Demone senza questa raccolta di metodi, ne è solo un clone.

miniidaemon.js

/*\ |*| |*| :: MiniDaemon:: |*| |*| Revisione n. 2 - 26 settembre 2014.setInterval |*| https://sito web/Utente:fusionchess |*| https://github.com/madmurphy/minidaemon.js |*| |*| Questo framework è sotto la GNU Lesser General Public License, versione 3 o successive. |*| http://www.gnu.org/licenses/lgpl-3.0.html |*| \*/ funzione MiniDaemon (oOwner, fTask, nRate, nLen) ( if (!(this && this instanceof MiniDaemon)) ( return; ) if (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); ) if (nLen > 0) ( this.length = Math.floor(nLen); ) ) MiniDaemon.prototype.owner = null; MiniDaemon.prototype.task = null; MiniDaemon.prototype.rate = 100; MiniDaemon.prototype.length = Infinito; /* Queste proprietà dovrebbero essere di sola lettura */ MiniDaemon.prototype.SESSION = -1; MiniDaemon.prototype.INDEX = 0; MiniDaemon.prototype.PAUSED = true; MiniDaemon.prototype.BACKW = true; /* Metodi globali */ MiniDaemon.forceCall = function(oDmn) (oDmn.INDEX += oDmn.BACKW ? -1: 1; if (oDmn.task.call(oDmn.owner, oDmn.INDEX, oDmn.length, oDmn . .BACKW) === false || oDmn.isAtEnd()) ( oDmn.pause()); /* Metodi delle istanze */ MiniDaemon.prototype.isAtEnd = function () ( return this.BACKW ? isFinite(this.length) && this.INDEX< 1: this.INDEX + 1 >questa.lunghezza; ); MiniDaemon.prototype.synchronize = function() ( if (this.PAUSED) ( return; ) clearInterval(this.SESSION); this.SESSION = setInterval(MiniDaemon.forceCall, this.rate, this); ); MiniDaemon.prototype.pause = funzione () ( clearInterval(this.SESSION); this.PAUSED = true; ); MiniDaemon.prototype.start = funzione (bReverse) ( var bBackw = Boolean(bReverse); if (this.BACKW === bBackw && (this.isAtEnd() || !this.PAUSED)) ( return; ) this.BACKW = bBackw;this.PAUSED = false;this.synchronize(); );

MiniDaemon passa gli argomenti alla funzione di callback. Se scegli di lavorare su qualcosa di nuovo con i browser, che naturalmente non supportano questa particolarità, scegli uno dei metodi che vengono sviluppati.

Sintassi

var myDaemon = Nuovo MiniDaemon( questo oggetto, richiama[ , Vota [, lunghezza]]);

Descrizione

Note d'uso

La funzione SetInterval(), di regola, viene utilizzata per impostare azioni per funzioni, come animazioni e così via. Puoi attivare l'ora chiamando WindowsOrWorkerGlobalScope.clearInterval() .

Se desideri che la tua funzione venga chiamata una volta dopo il ritardo specificato, utilizzare .

Restrizioni di ritardo

In alternativa, il callback per setInterval() può essere utilizzato per trasformare la chiamata setInterval() in modo che esegua un altro termine, quindi sarà il primo ad andare.Prestazioni, una volta che gli intervalli sono nidificati oltre cinque livelli di profondità, il browser imporrà automaticamente un 4 ms valore minimo per l'intervallo.

I browser potrebbero conoscere valori minimi più severi per il termine in determinate circostanze, se non vuoi essere colpevole. Si noti inoltre che la quantità di tempo effettiva che trascorre tra le chiamate alla richiamata potrebbe essere più lunga del ritardo indicato; Selezionare Motivi per ritardi più lunghi di quanto specificato in WindowOrWorkerGlobalScope.setTimeout() per esempi.

Assicurarsi che la durata dell'esecuzione sia inferiore alla frequenza dell'intervallo

Sebbene sia possibile che il tuo logico possa vincere fino a meno di un'ora dopo, è possibile che tu possa chiamare ricorsiva e la funzione setTimeout() sia stata invocata. Ad esempio, di norma, setInterval() to polo su un server remoto impiega 5 secondi, un termine, su un server non valido e l'host può, con ulteriore preavviso, richiedere il completamento entro un'ultima ora. Quindi, ti potrebbe essere mostrato che hai bisogno di XHR e che devi ripristinare in ordine.

Dzherelo: http://learn.javascript.ru/settimeout-setinterval

Possono tutte le implementazioni JavaScript avere un timer-scheduler interno, che consente di impostare la funzione settimanale attraverso il periodo delle attività.

Zocrema, la possibilità è supportata da browser e server Node.JS.

setTimeout

Sintassi:

var timerId = setTimeout(funzione/codice, ritardo[, arg1, arg2...])

Parametri:

  • funzione/codice
    • Una funzione o una riga di codice per una visualizzazione.
    • Row podtremuєtsya per summіnostі, vikoristovuvat її non raccomandato.
  • ritardo
    • Taglia in millisecondi, 1000 millisecondi equivalgono a 1 secondo.
  • arg1, arg2…
    • Argomenti che devono essere passati alla funzione. Non supportato in IE9-.
    • La funzione scadrà tra un'ora, se il parametro di ritardo ha effetto.

Ad esempio, il codice seguente chiama alert("Hello") in un secondo:

funzione()(alert("Ciao"));) setTimeout(funzione, 1000);

Poiché il primo argomento è in una riga, l'interprete crea una funzione anonima nella terza riga.

Quindi un tale record funziona in questo modo:

SetTimeout("alert("Ciao")", 1000);

Sostituiscili con funzioni anonime:

Imposta Timeout( funzione()(avviso ("Ciao")), 1000);

Parametri per la funzione e il contesto

In tutti i browser moderni, con IE10 abilitato, setTimeout consente di impostare i parametri delle funzioni.

Sedere inferiore vivede "Ciao, sono Vasya" piegato, crim IE9-:

funzione sayHi (chi)(alert("Ciao, io" + chi); ) setTimeout(sayHi, 1000, "Vasya");

…Tuttavia, per la maggior parte delle opinioni, abbiamo bisogno del supporto del vecchio IE e non permettiamo che vengano mostrate argomentazioni. A chi li passa, avvolgi il wiki in una funzione anonima:

funzione sayHi (chi)(alert("Ciao, io" + chi); ) setTimeout( funzione()(sayCiao ("Vasya")), 1000);

Wikiclick non passa questo contesto tramite setTimeout.

Zokrema, wickklix al metodo dell'oggetto tramite setTimeout al contesto globale. Potrebbe portare a risultati errati.

Ad esempio, possiamo dire user.sayHi() in un secondo:

funzione Utente (id) funzione()(avviso(questo .id); ); var utente = nuovo Utente(12345); setTimeout(utente.sayCiao, 1000); // punteggio 12345, anche se video "non definito"

Le chiavi setTimeout eseguono la funzione user.sayHi nel contesto globale, non consentirà l'accesso all'oggetto attraverso una catena.

In caso contrario, sembra che due wiki setTimeout funzionino allo stesso modo:

// (1) una riga setTimeout(user.sayHi, 1000); // (2) le stesse due righe var func = user.sayHi; setTimeout(funzione, 1000);

Fortunatamente, questo problema viene facilmente violato anche dalla creazione di funzioni intermedie:

funzione Utente (id)(questo .id = id; questo .sayHi = funzione()(avviso(questo .id); ); var utente = nuovo Utente(12345); setTimeout( funzione()(utente.sayCiao(); ), 1000);

La funzione di wrapping viene utilizzata per passare gli argomenti su più browser e salvare il contesto del wrapping.

Skasuvannya vikonannia

La funzione setTimeout trasforma l'identificatore timerId, che può essere abbinato in modo che corrisponda.

Sintassi:

ClearTimeout(timerId)

Abbiamo impostato un timeout per il calcio offensivo, e poi lo vediamo (abbiamo cambiato idea). Di conseguenza, non viene fuori nulla.

var timerId = setTimeout( funzione()(avviso(1)), 1000); clearTimeout(timerId);

setInterval

Il metodo setInterval ha una sintassi simile a setTimeout.

var timerId = setInterval(funzione/codice, ritardo[, arg1, arg2...])

Il senso dell'argomentazione è lo stesso. Ale, su vіdmіnu setTimeout , durante l'esecuzione di vikonannya funkії non una volta, ma ripetilo regolarmente a intervalli di un'ora. È possibile fare clic su Zupiniti vikonannya:

ClearInterval(timerId)

Il calcio di avvio all'avvio visualizzerà un avviso skin per due secondi, non fare clic sul pulsante "Stop":

<tipo di input ="pulsante" onclick ="clearInterval(timer)" valore ="(!LANG:(!LANG:Stop)" > !}!} <copione> variabile io = 1; var timer = setInterval( funzione()(avviso(i++)), 2000);copione>

Cherga quella sovrapposizione di vitklik_v a setInterval

Weekly setInterval (funktion, zatrymka) imposta la funzione di segnalazione tramite l'appuntamento di un intervallo di un'ora. Ale, c'è sottigliezza qui.

In realtà, la pausa tra i cicli è minore, l'intervallo è minore.

Ad esempio, prendi setInterval(function() ( func(i++) ), 100) . Ci sarà una skin func di 100 ms, così da aumentare il valore del lichnik.

Un po' più in basso, un blocco rosso: l'ora di func. Ora tra il blocco: la stessa ora tra i lanci della funzione e quella più piccola, l'inceppamento è installato sotto!

Pertanto, il browser avvia delicatamente il lancio della funzione in 100 ms senza regolare l'ora della funzione stessa.

Buvaє, scho vykonannya funktії occupa più di un'ora, anіzh zatrimka. Ad esempio, la funzione è pieghevole e il disordine è ridotto. Ma la funzione è vendicare gli operatori di allerta/conferma/prompt, come se bloccasse il flusso dell'allarme. E qui inizia tsіkavі rechі.

Se l'avvio della funzione non è possibile, il browser è occupato, si mette in linea e risulta, proprio come il browser chiama.

Le immagini sottostanti sono illustrative di quelle necessarie per la funzione, purché vittoriose.

Le funzioni settimanali, avviando setInterval , vengono aggiunte in linea e negligenza, se possiamo:

Non appena il primo sarà completato, verrà eseguito un altro avvio della funzione:

Più di una volta, non mettere un vikonnanny sulla linea.

Se l'esecuzione di una funzione richiede più di un'ora, minore è il numero di operazioni pianificate, alla fine tutto costa una volta. Inoltre, non si verifica "l'accumulo" di lanci.

Nell'immagine sottostante, setInterval serve per ritardare la funzione di 200 ms e impostare una sveglia sulla linea. A 300 ms e 400 ms, il timer passa di nuovo, ma non passa nient'altro.

SetInterval settimanale (funzione, balbuzie) non garantisce una vera balbuzie.

Fluttuazioni di Buvayut, se il blocco reale è maggiore o minore di quello dato. Vzagali non è un dato di fatto che sarà come una zatrimka.

Ripetere setTimeout nidificato

Nei vipad, se hai bisogno non solo di una ripetizione regolare, ma di un obov'azkova zatrim tra i lanci, devi reinserire setTimeout con la funzione skin viconan.

Sotto c'è un calcio, che sembra un avviso con intervalli di 2 secondi e tra di loro.

<tipo di input ="pulsante" onclick ="clearTimeout(timer)" valore ="(!LANG:(!LANG:Stop)" > !}!} <copione> variabile io = 1; var timer = setTimeout( funzione esegui()(alert(i++); timer = setTimeout(run, 2000); ), 2000);copione>

Sulla linea oraria, ci saranno correzioni tra i lanci. Illustrazione per il taglio di 100 ms:

Ritardo minimo del timer

Il timer del browser potrebbe essere minimamente balbettante. Cambia da circa zero a 4 ms nei browser moderni. Per le persone anziane, puoi averne di più e raggiungere i 15 ms.

Dietro lo standard, la balbuzie minima è di 4 ms. Non c'è differenza tra setTimeout(..,1) e setTimeout(..,4) .

I comportamenti setTimeout e setInterval con timeout zero hanno specifiche del browser.

  1. Opera, setTimeout(.., 0) sono gli stessi di setTimeout(.., 4) . Può essere confrontato con il successivo setTimeout (.. ,2). Tse sooblivist tsgo browser.
  2. In Internet Explorer, lo stutter null setInterval(.., 0) non funziona. Vale la pena impostare Interval stesso, tutto qui. setTimeout(.., 0) funziona bene.

Frequenza reale di sprattovuvannya

Spratsovuvannya può essere più ricco prima In una serie di fluttuazioni, l'assetto non può essere di 4 ms, ma di 30 ms o 1000 ms.

La maggior parte dei browser (quelli desktop in persiano) continuano a eseguire setTimeout / setInterval quando la scheda è inattiva. Quando alcuni di essi (Chrome, FF, IE10) riducono la frequenza minima del timer a 1 volta al secondo. Per venire fuori, che i depositanti "in background" hanno un timer, ma raramente.

Quando si lavora a batteria, su un laptop, i browser possono anche abbassare la frequenza, in modo che il codice sia più facile da codificare e protegga la carica della batteria. Soprattutto cym vidomy IE. La riduzione può essere raggiunta per un paio di volte a maggese in campo. Quando sei sopraffatto dal processore JavaScript, potresti non essere in grado di ignorare i timer. In tal caso, le esecuzioni di setInterval verranno saltate.

Visnovok: alla frequenza di 4 ms, varto orient, ma non varto open.

Intervalli di visualizzazione sulla console

var timemark = nuova data; setTimeout( funzione vai()(var diff = new Date - timeMark; // inserisci la zatrymka del diavolo nella console consolle. log(differenza); // ricorda ad esempio l'ora, // per ridurre la balbuzie tra i wiki timeMark = nuova Data; setTimeout(vai, 100); ), 100);

trucco setTimeout(funzione, 0).

Questo trucco andrà negli annali degli hack JavaScript.

La funzione è racchiusa con setTimeout(func, 0) in modo che tu voglia eseguirla al termine dello script di flusso.

Sulla destra c'è che setTimeout non annulla in alcun modo la funzione in primo luogo. Con meno planuє її vikonannya. Ale, l'interprete JavaScript ha maggiori probabilità di sovrascrivere le funzioni pianificate rispetto a dopo aver sovrascritto uno script di streaming.

Dietro lo standard, setTimeout in qualsiasi momento non può sovrascrivere la funzione dal timeout a 0. Come abbiamo detto prima, il timeout diventa 4ms. Ale smut qui sono proprio quelli che saranno vikonnannya in qualsiasi momento seguiranno la vikonannia del codice del flusso.

Per esempio:

risultato finale; funzione mostraRisultato()(alert(risultato); ) setTimeout(showResult, 0); risultato = 2 * 2; // vive 4

Insieme

I metodi setInterval(func, delay) e setTimeout(func, delay) consentono a func di essere eseguito regolarmente/una volta ogni millisecondo di ritardo.

Esistono due metodi per ruotare l'identificatore del timer. È possibile utilizzare il clic rapido clearInterval/clearTimeout per la cerniera.

| | intervallo di set | setTimeout | || ----------- | ---------- | | tempistica | Ide viklik rigorosamente dietro il timer. Come interprete di occupazioni, una settimana si perde nel nero. L'ora di fine della funzione non è garantita, tale intervallo dopo il completamento di un avviamento fino alla pannocchia del successivo può essere modificato. | SetTimeout settimanale ricorsivo sostituisce setInterval quando è richiesta una pausa tra i cicli. | | Taglio Taglio minimo: 4 ms. | Dissolvenza minima: 4 ms. | | caratteristiche del browser | IE non utilizza lo stutter 0. Opera ha uno stutter zero equivalente a 4 ms, gli stub vengono elaborati esattamente, inclusi 1 ms, 2 ms e 3 ms non standard. |

Quando si programma con il linguaggio di scripting, è periodicamente necessario creare una pausa per mettere in pausa il programma per una certa ora, quindi continuare il robot. Ad esempio, gli script VBS e PHP possono utilizzare i seguenti metodi:

VBS: wscript.sleep 1500 (sospensione per 1,5 secondi)

PHP: sonno(10); (Zupinka per 10 secondi)

Pіd h podіbnih mette in pausa il sistema vykonoyuchu (PHP o VBS) fare niente. Rozrobnik, dopo aver provato intuitivamente in modo vicario simile a Javascript, cinguetterà in modo inaccettabile. Un tipico perdono quando si tenta di mettere in pausa Javascript è simile al seguente:

Function badtest() ( for (var i = 1; i< 10; i++) { window.setTimeout("document.getElementById("test1").value += " + i, 900) } }

Credi che se, durante il passaggio del ciclo della cherga, raggiungi l'estrazione del numero della cherga, il tuo setTimeout entrare onestamente nel robot Javascript, controllare 0,9 sec., aggiungere un numero alla fine del campo di input, quindi procedere al robot. Ma in realtà non è così: setIntervalі setTimeout in Javascript è possibile aggiungere più di tієї dії (abo functions), come indicato dalle braccia. Il nostro esempio sarà simile a questo:

  1. io = 1;
  2. aggiungere il numero "1" al campo di immissione per 0,9 secondi;
  3. negaino dopo la formulazione di questo compito, il ciclo è andato oltre: i = 2;
  4. aggiungere la cifra "2" al campo di immissione di 0,9 secondi;

negaino significa, ad esempio, 1 ms (che è poco appariscente, pari a 900 ms): il ciclo svolgerà il tuo lavoro in modo pratico, avendo creato molti compiti nello stesso tempo. Tse significa che tutte le voci per il "dipinto" verranno completate praticamente alla stessa ora, senza pause tra l'aggiunta di nuovi numeri. Il ciclo inizia; tutto sfuma a 0,9; e shirr: tutti i numeri sono disposti in fila uno per uno.

E come zasosuvat correttamente un tale vipadka setTimeout? È complicato. Vieni a chiamare la funzione ricorsivamente(nel mezzo della funzione, la funzione stessa), e in modo che il processo non sia limitato, imposta i denti della mente (ad esempio, il valore dell'altro numero):

Funzione welltest() ( se (i< 9) { document.getElementById("test2").value += ++i window.setTimeout("welltest()", 400) } }

cambio di nuovo io accada per avviare la funzione posturale, ad esempio in questo modo:

L'asse ora funziona come dovrebbe (abbiamo cambiato l'ora del taglio da 0,9 a 0,4 s). Ma per compiti simili, è più logico non fermarsi setTimeout un setInterval(se vuoi avere bisogno di due funzioni):

Function besttest() ( window.i = 0 window.timer1 = window.setInterval("draw()", 400) ) function draw() ( document.getElementById("test3").value += ++i if (i >= 9) clearInterval(window.timer1) )

Caratteristiche del metodo Javascript setInterval per coloro che non passano il vino “da soli”, lo yoga deve essere fatto con un metodo speciale clearInterval. E quindi era chiaro che alla stessa mente, alle attività incluse nell'add-on veniva assegnato un identificatore speciale: un timer: window.timer1 = window.setInterval(...) .

Gli identificatori possono essere inseriti in questo modo per impostazione predefinita, utilizzando il metodo setTimeout. Tutti gli identificatori di timer devono essere riconosciuti uno dopo l'altro (devono essere univoci all'interno della finestra di streaming del browser). Lo stesso si può fare a fine giornata, quando vengono presi gli appuntamenti vittoriosi, e gli appuntamenti possono essere presi in parallelo (una volta alla stessa ora, poiché il computer ha molte risorse), cosa che in linea di principio è impossibile in PHP o VBS.

Asse lato testa con un gran numero di timer Javascript, che possono essere eseguiti contemporaneamente: setinterval.htm (funzioni Javascript nel file setinterval.js). Il funzionamento di tutti i timer a lato (menù menù) può essere bloccato con il tasto Esc. Tutti i timer delle applicazioni sono basati su "naturali" (e non astratti) io++) vіdlіk - ora o vіdstanі. Tutti gli "anniversari" sono sincronizzati in modo speciale (per la precisione). I timer, che si trovano in campagna, ammiccano negli "indicatori" e nel menu, che puoi vedere ("vyzhdzhaє").

Menù VIP

Il nostro menu, scho vyzhdzhaє - davvero vyzhdzhaє (z-pіd "caps"): gli spazi tra gli elementi sono riempiti in modo speciale, schob bachiti, come fuori vіїzhdzhaє. Inaspettatamente, si è scoperto che non siamo riusciti a creare una transizione graduale per elenchi di giorni diversi, anche a causa della bassa produttività del computer (AMD Athlon 999 MHz).

È ovvio che è necessario finire la bellezza di quell'armonia, in modo che gli elenchi delle diverse voci di menu cadessero proprio in quell'ora. Tobto dowshi liste di colpa vipadati z more alta velocità, Shorty - con meno swidkistyu. Sarebbe possibile implementarlo in questo modo:

  1. Installiamo l'ultima ora di "visione", ad esempio 200 ms.
  2. Anche se un elenco che cade può avere un'altezza di 20 px, ovviamente, possiamo abbassarlo di un pixel ogni 10 ms di intervallo - e anche in 200 ms, l'intero elenco si adatterà.
  3. Ad esempio, la lista che cade, può avere un'altezza di 40 px, da includere nella stessa ora, siamo colpevoli di farla cadere di un pixel ogni 5 ms.

Per questa logica, come una lista che cade, può essere alta 200 px, siamo colpevoli di far cadere lo yoga in basso di un pixel ogni 1 ms. Ma tale velocità sul nostro computer non funziona: il browser semplicemente non ottiene la nuova posizione dell'elenco in un millisecondo. Così. Javascript è buono (cosa c'è per essere buono?), ma il browser (Firefox) non lo è. Situazione tipica per Internet.

Per questo, più o meno, l'ora di visualizzazione del menu non può che essere di aiuto, e non è ancora chiaro come farlo computer svedese. Ma siamo da biasimare per il più costoso? L'algoritmo (senza aggiornare il codice del firmware del computer) funziona in questo modo:

  1. Impostare l'ora superiore alla visualizzazione elenco: tempo = 224 (ms).
  2. Impostare l'ora minima di un intervallo nel ciclo: ritardo = 3 (ms).
  3. Impostare il margine minimo per l'elenco: offset = 1 (px).
  4. Cambiamo tutto nel maggese all'altezza dell'elenco: 1) aumentare l'ora (intervallo) viene avvolta in proporzione all'altezza e in proporzione diretta all'ora alta (a quota 224, il coefficiente di efficienza è 1); 2) anche se l'altezza è maggiore per 40 px, la dimensione minima è maggiore in proporzione all'altezza. Il "40" costante è stato per lo più tolto dall'ultimo percorso computer completo. I test su un computer Pentium 4 CPU da 2,53 GHz hanno mostrato lo stesso numero: 40. Altrimenti, i timer esauriscono l'ordine, gli elenchi non sono al passo.

Axis ora elenca più mensh viїzhdzhayut. Per più o meno un'ora simile. A lato setinterval.htm.

Un asse i Bruce:

Funzione 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 } } }

La funzione stessa, che mostra le schede negli elenchi dei menu, è piuttosto semplice. È stato lasciato solo per avviare її approssimativamente in una tale riga:

ts.timer1 = setInterval(function()(slide_do(ts, maxtop, offset)), delay)

Bene, prima di iniziare, calcola tutti i valori di maxtop e offset e posiziona anche l'elenco nella posizione mintop. A cosa serve la funzione "anteriore". diapositiva() rozmirom 40 righe. E tutto in una volta - nel file setinterval.js. Quindi, questa schifezza non funziona mai senza un file di stile allegato

Estremamente importante da capire, come esercitarsi Timer JavaScript. Il più delle volte, il nostro comportamento non rompe con la nostra suscettibilità intuitiva al flusso ricco, ed è collegato ad esso, il fatto che il fetore sia davvero avvolto in un sudore. Diamo un'occhiata ad alcune delle funzioni, per l'aiuto delle quali possiamo usare i timer:

  • var id = setTimeout(fn, ritardo); - Crea un semplice timer che attivi la funzione dopo una determinata balbuzie. La funzione ruota un ID univoco, per l'aiuto del quale è possibile assegnare il timer.
  • var id = setInterval(fn, ritardo); - Simile a setTimeout, ma chiama continuamente la funzione a un determinato intervallo (fino a quando non viene chiamata).
  • clearInterval(id);clearTimeout(id); - Accetta il timer ID (attiva una delle funzioni sopra descritte) e richiama la richiamata "a.
È una buona idea, se si dà un'occhiata, sembra che l'accuratezza del periodo di ritaglio del timer non sia garantita. Per una buona ragione, il browser vicons tutti i sottotitoli JavaScript asincroni in un thread (come un clic del mouse o un timer) e solo a quell'ora, se è giunto il momento per la prossima volta. Il diagramma successivo mostra il meglio:

Per dare molte informazioni a qualche piccolo, come ottenerle, ma per darti una migliore comprensione del meccanismo di lavoro e dell'asincronia di JavaScript. su questo diagramma rappresentazioni verticali di ore e millisecondi, i blocchi blu mostrano blocchi di codice JavaScript, che è già visibile. Ad esempio, il primo blocco viene attivato in 18 ms, il clic del mouse viene bloccato in circa 11 ms.

JavaScript può sovrascrivere solo un blocco di codice (attraverso la natura a thread singolo dell'override), bloccando qualsiasi altra subroutine asincrona. Ciò significa che quando il sub asincrono (come un clic del mouse, un clic su un timer o un completamento XMLHttp completato) fallisce, verrà aggiunto alla riga e successivamente (l'implementazione, ovviamente, varia nel fallback del browser, ma parliamoci chiaro).

Innanzitutto, è chiaro che nel mezzo del blocco JavaScript iniziano due timer: setTimeout con un ritardo di 10ms e setInterval con lo stesso ritardo. A seconda del fatto che quando il timer parte, salverà l'attimo, se il primo blocco del codice non è stato ancora completato. Tieni presente, tuttavia, che il VIN non può essere utilizzato direttamente (non è possibile tramite il single-threading). La funzione Natom_st v_dkladen viene consumata al nero e vykonuєtsya al prossimo momento disponibile.

Inoltre, sotto la prima ora del primo blocco JavaScript, dai la colpa al clic del mouse. Obrobnik tsієї podії asincrono (ma è asincrono, quindi non possiamo trasmetterlo) non può essere battuto senza intervallo al momento, quindi è anche speso in linea, come un timer.

Dopodiché, come primo blocco del codice JavaScript dell'occhiolino, il browser chiede al cibo “Chi controlla la vincita?”. Allo stesso tempo, il collezionista fa clic con il mouse e il timer viene rimproverato alla stazione. Il browser ne seleziona uno (il clicker) e vince. Il timer controlla la parte disponibile dell'ora all'ora successiva.

Rispettare che mentre l'acquisizione del clic del mouse è ancora in esecuzione, utilizzare il primo intervallo di richiamata. Quindi è proprio come un richiamo del timer, ci saranno ordini dal nero. Prote, controlla che se spratsyuє intervallo di nuovo (fino a quando il timer-callback non è disponibile), la vincita verrà eliminata dalle classifiche. Yakby all interval-callback" e sperperato in coda fino a quando il grande pezzo di codice non viene controllato, avrebbe portato al fatto che sono state stabilite un sacco di funzioni, per controllare la chiamata senza periodi di ritardo tra la fine del loro chiamate prima in basso aggiungine un'altra al disegno.

In questo modo possiamo stare attenti a una caduta, se dopo questo momento si verifica la terza richiamata di intervallo, se l'errore è già stato battuto. Questa è una caratteristica importante da illustrare: gli intervalli non consentono chi vince subito, verranno aggiunti alla linea senza bilanciare il periodo di zatrim tra vikonannyami.

Nareshti, dopo che un altro intervallo di callback è stato completato, speriamo che nulla venga tralasciato, che la colpa sia del motore JavaScript. Ciò significa che il browser verificherà nuovamente la presenza di nuovi abbonati asincroni. Dovrebbe essere impostato su 50 ms, la richiamata dell'intervallo ricomincerà. In questo momento, non ci sarà nulla che bloccherebbe lo yoga, non funzionerà per quello.

Diamo un'occhiata a un esempio che illustra la differenza tra setTimeout e setInterval.
setTimeout(function()( /* Un lungo blocco di codice... */ setTimeout(arguments.callee, 10); ), 10); setInterval(function()( /* Un lungo blocco di codice... */ ), 10);
Queste due opzioni sono equivalenti a prima vista, ma in realtà non lo sono. Il codice che imposteràTimeout a setTimeout per impostare il tempo di ritardo a 10ms dopo il ciclo successivo (può essere maggiore, ma non può essere più piccolo) è lo stesso del codice che imposteràInterval a setInterval, che chiamerà automaticamente la skin 10 ms avanti, a seconda del numero di volte.

Ricapitoliamo tutto ciò che è stato detto:
- I motori JavaScript sono un middleware a thread singolo, che converte gli input asincroni in una riga, che viene ripulita,
- Le funzioni setTimeout e setInterval sono fondamentalmente diverse nel codice asincrono,
- Se il timer non può essere battuto in questo momento, verrà posato prima del punto successivo della pausa (come sarà fatto per il bagan zatrimka),
- Gli intervalli (setInterval) possono essere ciclati uno per uno senza balbuzie, poiché impiega più di un'ora, di seguito viene assegnata una balbuzie.

Tutto questo è un'informazione estremamente importante per la distribuzione. Sapere come funziona il motore JavaScript, in particolare il gran numero di sub-pod asincroni (che vengono spesso utilizzati), pone le basi per integrazioni stimolanti.

© 2022 androidas.ru - Tutto su Android