Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

timer e call function in javascript

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: archimede, Triumph Of Steel

timer e call function in javascript

Postdi miko » 21/03/19 07:58

Buongiorno,
In una pagina pdf ho inserito 2 pulsanti, START e STOP, e 2 campi testo, Text1 e Text2.
Ad ogni click su START il valore di Text1 aumenta di una unità e lo stesso valore si ritrova in Text2, fino a quando non si raggiunge un valore massimo che, qui ad esempio, ho impostato a 20.
Il codice, inserito nell’evento click di START, è il seguente:

Codice: Seleziona tutto
var v1 = this.getField("Text1");
var v2 = this.getField("Text2");
 if (v1.value >= 20)
   v1.value = 20.00;
 else 
  v1.value = v1.value + 1;
  v2.value = v1.value;


Il codice, forse non è molto ‘raffinato’, funziona.
La necessità dei pulsanti e dei campi testo sarà chiara nel seguito.
Partendo da questo codice base, ma non è detto che debba avere la stessa struttura, sto cercando di sviluppare dei codici più avanzati per poterli adattare in altre circostanze.
Ed è qui che iniziano i miei problemi.

1) Versione 1
Qualunque sia il valore numerico inserito in Text1, cliccando su START si avvia un timer che dopo un fissato intervallo di tempo, qualche secondo, esegua il codice precedente, fino a raggiungere il valore massimo;
In qualunque istante, ad un successivo click su START si ferma l’esecuzione del codice;

Variante di questa versione:

a) Il pulsante START avvia il procedimento, mentre il pulsante STOP ferma l’esecuzione;

In questa versione è quindi previsto l’inserimento solo del timer.

2) Versione 2
Il pulsante START ha la stessa funzione precedente, ma questa volta, oltre ad avviare il timer, richiama una generica funzione, in particolare la funzione di Archimede nel topic " Convertire numeri in lettere "
Variante di questa versione: come al punto a) della versione 1
In questa versione è quindi previsto l’inserimento del timer e la chiamata alla funzione

3) Versione 3, manuale
Qualunque sia il valore numerico inserito in Text1, ad ogni click su START il valore di Text1 aumenta di una unità, e contemporaneamente viene richiamata una generica funzione, in particolare la funzione di Archimede di cui sopra, mentre in Text2 compare il risultato della conversione.
Quindi in Text1 inseriamo un numero, clicchiamo su START, Text1 aumenta ed in Text2 leggiamo il risultato della funzione di conversione di Archimede.

Non riesco ad inserire il codice necessario per il timer e per la call alla funzione;
Non capisco la differenza tra set timeout e set interval, e quale dei due eventi è più appropriato in questo caso.
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 450
Iscritto il: 29/12/09 10:44

Sponsor
 

Postdi archimede » 23/03/19 11:56

Premesso che non ho alcuna esperienza di Javascript all'interno di un pdf (quindi la mia soluzione quasi sicuramente non funzionera'), se salvi questo in un file html e lo apri con un browser (e sei connesso a internet) dovresti vedere qualcosa che assomiglia a quanto richiesto:
Codice: Seleziona tutto
<html>
<head>
<script src="https://unpkg.com/vue"></script>
<script type="text/javascript">
window.onload=function()
{
   new Vue({
      el: '#app',
      data: {
         titolo: 'Test',
         running: false,
         messaggi: [],
         numero: null,
         current: null,
         stopWatch: null
      },
      methods: {
         ConvertToHundreds(num)
         {
            aTens = ["venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"]
            aOnes = ["zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove",
                     "dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove"]

            var cNum, nNum
            var cWords = ""

            num %= 1000
            if (num > 99)
            {
               /* Hundreds. */
               cNum = String(num)
               nNum = Number(cNum.charAt(0))
               if (nNum > 1) cWords += aOnes[nNum]
               cWords += "cento"
               num %= 100
            }

            if (num > 19)
            {
               /* Tens. */
               cNum = String(num)
               nNum = Number(cNum.charAt(0))
               cWords += aTens[nNum - 2]
               num %= 10
            }

            if (num > 0)
            {
               /* Ones and teens. */
               nNum = Math.floor(num)
               cWords += aOnes[nNum]
            }

            return cWords
         },
         ConvertToWords(num)
         {
            var aUnit = ["mille", "unmilione", "unmiliardo", "trillione", "quadrillione"]
            var aUnits = ["mila", "milioni", "miliardi", "trillioni", "quadrillioni"]
            var cWords = ""
            var nLeft = Math.floor(num)

            for (var i = 0; nLeft > 0; i++)
            {
               if (nLeft % 1000 > 0)
               {
                  if (i != 0)
                  {
                     if (this.ConvertToHundreds(nLeft) === 'uno')
                        cWords = aUnit[i - 1] + cWords
                     else
                        cWords = this.ConvertToHundreds(nLeft) + aUnits[i - 1] + cWords
                  }
                  else
                     cWords = this.ConvertToHundreds(nLeft) + cWords
               }
               nLeft = Math.floor(nLeft / 1000)
            }

            cWords = cWords.charAt(0).toUpperCase() + cWords.slice(1)
            if (cWords.trim()) cWords += " Euro"

            num = Math.round(num * 100) % 100
            if (num > 0)
            {
               if (cWords.trim())
                  cWords += " e " + this.ConvertToHundreds(num) + " Centesimi"
               else
               {
                  cWords = this.ConvertToHundreds(num)
                  cWords = cWords.charAt(0).toUpperCase() + cWords.slice(1) + " Centesimi"
               }
            }

            var regex = /(nt[a|i])([u|o])/gi
            if (cWords.match(regex)) cWords = cWords.replace(regex, 'nt$2')

            if (!cWords.trim()) cWords = "Zero Euro e zero Centesimi"

            return cWords
         },
         elabora: function () {
            if (this.current < this.numero)
            {
               this.current++
               this.messaggi.push(this.current + ' = ' + this.ConvertToWords(this.current))
            }
            else
               this.fine()
         },
         inizia: function () {
            this.messaggi = []
            this.running = true
            if (!this.numero || isNaN(this.numero) || this.numero > 10000)
            {
               alert('Numero non valido')
               this.fine()
               return
            }
            this.current = 0
            this.stopWatch = setInterval(this.elabora, 1000);
         },
         fine: function () {
            this.running = false
            clearInterval(this.stopWatch)
         }
      }
   })
}
</script>
</head>
<body>
<div id="app">
   <p>{{titolo}}</p>
   <input v-model="numero">
   <span v-if="running">Numero corrente {{current}}</span>
   <button :disabled="running" v-on:click="inizia">Start</button>
   <button v-on:click="fine">Stop</button>
   <p v-for="msg in messaggi">{{msg}}</p>
</div>
</body>
</html>
Attenzione a non esagerare col numero che inserisci: io ho messo un limite di 10000 ma non l'ho provato in pratica e potrebbe saturare la memoria del browser.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2834
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi miko » 29/03/19 08:36

Buongiorno,
apprezzo ed ammiro il tuo impegno, nonostante..
Premesso che non ho alcuna esperienza di Javascript all'interno di un pdf..

sviluppando un codice che non può funzionare nel pdf, come nel mio caso, ma fornendo una base da cui partire,
e forse utile a qualche altro utente.
purtroppo non conosco nulla del javascript html, ed anche seguendo le tue indicazioni non ho ottenuto
alcun risultato.
ho fatto in questo modo:
ho copiato il codice in word, salvato come html, aperto nel browser;
ottengo un listato, come fosse un file di testo, e non capisco dove inserire i dati
Attenzione a non esagerare col numero che inserisci..

sicuramente causa della mia incompetenza in questo linguaggio.
grazie per questo tuo ulteriore contributo.
leggendo qualcosa del javascript forse sono riuscito a risolvere, parzialmente, il problema di questo topic;
vi descrivo come precedere;
nel javascript generale del documento, cioè del file pdf, dove dice nome dello script, inserire CONVERTI
e poi inserire il seguente codice:
FASE 1:

Codice: Seleziona tutto
function CONVERTI() {

var v3 = this.getField("Text3"); // <<< eventualmente cambiare il nome del campo testo

// commentare 1 delle 2 linee seguenti

 v3.value = v3.value + 1;  // VALIDO PER LE UNITA', PARTE INTERA DEL NUMERO

// v3.value = v3.value + 0.01;  // VALIDO PER I DECIMALI, CENTESIMI

//----------------------------------------------------------------------------------

in questa zona inserire integralmente il codice di archimede, che non riporto per brevità;

                             CODICE DI ARCHIMEDE

//-----------------------------------------------------------------------------
alla fine aggiungere queste linee di codice:

var v5 = this.getField("Text5"); // <<< eventualmente cambiare il nome del campo testo

v5.value = ConvertToWords(v3.value);

}

chiudere la finestra e salvare il codice.

FASE 2:
Per il pulsante START in >>> Azioni >> mouse premuto >> esegui javacript, inserire questa linea:

Codice: Seleziona tutto
run = app.setInterval("CONVERTI()", 2000);

il numero 2000 rappresenta il tempo espresso in millesimi di secondo
1000 = 1 secondo
quindi all'aumentare del numero l'esecuzione del codice è più lenta.

Per il pulsante STOP in >>> Azioni >> mouse premuto >> esegui javacript, inserire queste linee:

Codice: Seleziona tutto
try {

app.clearInterval(run);

//app.clearTimeOut(stoprun);

}

catch (e) {}

con questo listato si risolve il quesito delle varianti a) delle versioni 1) e 2).

per la 3) Versione 3, manuale, la fase 1 rimane identica, il pulsante STOP non esiste, mentre per il pulsante
START sostituire il codice precedente con questa semplice linea:
Codice: Seleziona tutto
CONVERTI();

non riesco a realizzare la versione 1.
date le mie limitatissime conoscenze del javascript di più e meglio non riesco a produrre.
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 450
Iscritto il: 29/12/09 10:44

Postdi archimede » 30/03/19 11:01

miko ha scritto:ho copiato il codice in word
Forse e' questo il problema: prova a usare un editor di testo "normale" tipo Notepad. Inoltre assicurati di essere connesso a Internet quando apri la pagina col browser.

Se non hai motivi specifici per farlo, ti assicuro che e' molto piu' semplice e "naturale" usare Javascript in un browser piuttosto che in un pdf.

Alessandro
archimede
Moderatore
 
Post: 2834
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi archimede » 30/03/19 11:48

Questo dovrebbe risolvere i problemi riscontrati nell'altro post:
Codice: Seleziona tutto
<html>
<head>
<script src="https://unpkg.com/vue"></script>
<script type="text/javascript">
window.onload=function()
{
   new Vue({
      el: '#app',
      data: {
         titolo: 'Test',
         running: false,
         messaggi: [],
         numero: null,
         inizio: null,
         fine: null,
         current: null,
         stopWatch: null
      },
      methods: {
         ConvertToHundreds(num)
         {
            aTens = ["venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"]
            aOnes = ["zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove",
                     "dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove"]

            var cNum, nNum
            var cWords = ""

            num %= 1000
            if (num > 99)
            {
               /* Hundreds. */
               cNum = String(num)
               nNum = Number(cNum.charAt(0))
               if (nNum > 1) cWords += aOnes[nNum]
               cWords += "cento"
               num %= 100
            }

            if (num > 19)
            {
               /* Tens. */
               cNum = String(num)
               nNum = Number(cNum.charAt(0))
               cWords += aTens[nNum - 2]
               num %= 10
            }

            if (num > 0)
            {
               /* Ones and teens. */
               nNum = Math.floor(num)
               cWords += aOnes[nNum]
            }

            return cWords
         },
         ConvertToWords(num)
         {
            var aUnit = ["mille", "unmilione", "unmiliardo", "trillione", "quadrillione"]
            var aUnits = ["mila", "milioni", "miliardi", "trillioni", "quadrillioni"]
            var cWords = ""
            var nLeft = Math.floor(num)

            for (var i = 0; nLeft > 0; i++)
            {
               if (nLeft % 1000 > 0)
               {
                  if (i != 0)
                  {
                     if (this.ConvertToHundreds(nLeft) === 'uno')
                        cWords = aUnit[i - 1] + cWords
                     else
                        cWords = this.ConvertToHundreds(nLeft) + aUnits[i - 1] + cWords
                  }
                  else
                     cWords = this.ConvertToHundreds(nLeft) + cWords
               }
               nLeft = Math.floor(nLeft / 1000)
            }

            if (cWords === 'uno') cWords = 'un'
            cWords = cWords.charAt(0).toUpperCase() + cWords.slice(1)
            if (cWords.trim()) cWords += ' Euro e '
            else cWords = 'Zero Euro e '

            num = Math.round(num * 100) % 100
            if (num > 0)
            {
               if (num === 1) cWords += 'un Centesimo'
               else cWords += this.ConvertToHundreds(num) + " Centesimi"
            }
            else cWords += 'zero Centesimi'

            var regex = /(nt[a|i])([u|o])/gi
            if (cWords.match(regex)) cWords = cWords.replace(regex, 'nt$2')
            cWords = cWords.replace('oo', 'o')

            if (!cWords.trim()) cWords = "Zero Euro e zero Centesimi"

            return cWords
         },
         elabora: function () {
            if (this.current < this.fine)
            {
               this.messaggi.push(this.current + ' = ' + this.ConvertToWords(this.current))
               this.current++
            }
            else
               this.finisci()
         },
         inizia: function () {
            this.messaggi = []
            this.running = true
            if (!this.inizio || isNaN(this.inizio) || !this.fine || isNaN(this.fine) || (this.fine - this.inizio) > 10000)
            {
               alert('Numeri non validi')
               this.finisci()
               return
            }
            this.current = Number.parseFloat(this.inizio).toFixed(2)
            this.stopWatch = setInterval(this.elabora, 1000);
         },
         finisci: function () {
            this.running = false
            clearInterval(this.stopWatch)
         }
      }
   })
}
</script>
</head>
<body>
<div id="app">
   <p>{{titolo}}</p>
   <input v-model="inizio">
   <input v-model="fine">
   <span v-if="running">Numero corrente {{current}}</span>
   <button :disabled="running" v-on:click="inizia">Start</button>
   <button :disabled="!running" v-on:click="finisci">Stop</button>
   <p v-for="msg in messaggi">{{msg}}</p>
</div>
</body>
</html>
HTH.

Alessandro
archimede
Moderatore
 
Post: 2834
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi miko » 07/04/19 13:53

buongiorno,
Ho seguito le tue indicazioni, usando notepad, di cui non conoscevo le potenzialità.
Ho copiato il codice in notepad, salvato in formato html, stranamente non mi aggiunge l’estensione del file,
ho provveduto manualmente ad inserire l’estensione; mi conetto in internet
con internet explorer vedo qualcosa ma non funziona nulla;
invece con chrome e Microsoft Edge ottengo questo risultato

Immagine

inserisco un numero, premo su start e compare questo messaggio

Immagine

cliccando su ok non succede nulla, anche se inserisco altri numeri compare lo stesso messaggio .
Penso di non sia questo che dovrei ottenere, ma come scrivevo non conosco l' html e quindi non so cosa devo fare o modificare.
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 450
Iscritto il: 29/12/09 10:44

Postdi archimede » 10/04/19 12:21

Internet Explorer è morto da tempo: lasciatelo riposare in pace.

Quanto al resto, i due campi rappresentano il valore iniziale e quello finale su cui si vuole fare il test: vanno compilati entrambi, quello finale deve essere maggiore di quello iniziale e, come dicevo, è meglio che la differenza tra i due non sia eccessiva per evitare di saturare la memoria del browser.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2834
Iscritto il: 07/11/02 12:41
Località: Genova


Torna a Programmazione


Topic correlati a "timer e call function in javascript":


Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti