Newsgroup: it.comp.lang.javascript
Titolo: Trigger

Salve a tutti,
  questa mattina mi sono svegliato con un quesito.
e' possibile associare un evento ad un input quando questo input ha un certo valore?
 
Nel senso posso associare l'evento onchange e testare il valore del campo, ma e' possibile associare l'evento direttamente al valore?
 
Per esempio posso fare qualcosa del genere
 
....
jQuery("#myInput").change(function(){
    if (jQuery(this).val() == "Dica") {
        console.log("33");
    }
})
....
 
E' possibile fare in modo di lanciare l'evento solo quando #myInput ha valore "Dica"?
 
 
J.
 


Il tutto nasce dall'esigenza di capire quando il contenuto dell'input e' settato ad un certo valore.
 
Il problema e' che l'input puo' venire cambiato da diverse sorgenti.
 
Vorrei evitare di dover mettere il codice di controllo in ogni sorgente perche':
 -1 un domani che cambia la cosa che devo controllare voglio cambiarla in un solo posto
 -2 un domani potrebbe essere necessario aggiungere altre "cose" che possano modificare questo valore e quindi vorrei mettere in questi elementi solo la logica di cambio del valore non il controllo sul valore stesso, idem non vorrei dover chiamare la funzione per il check del controllo
 
Spero di essere stato chiaro.
Magari l'approccio e' sbagliato, se e' questo il problema, che tipo di approccio mi consigliate?
 
Lo scopo e' eseguire determinate azioni al variare del valore di un campo (input per esempio) e questo puo' essere modificato da sorgenti esterne, dall'utente, da ajax o da altre diavolerie che mi verranno in mente :)
 
J.

 Lo scopo e' eseguire determinate azioni al variare del valore di un campo (input per esempio) e questo puo' essere modificato da sorgenti esterne, dall'utente, da ajax o da altre diavolerie che mi verranno in mente :)
 
Se il valore � cambiato da (per esempio) un altro script l'evento change 
non va gi� bene (giusto settimana scorsa l'ho notato).
Io sul momento brutalmente farei un poller che legge il valore ad 
intervalli, lo testa e agisce (come quello scritto da te ma non dentro 
ad un change()).
 
Sicuramente esister� qualcosa di meno grezzo, e aspetto anche io di 
sentirlo per apprenderlo :P
 
-- 
Z.

 E' possibile fare in modo di lanciare l'evento solo quando #myInput ha valore "Dica"?
 
Non sei tu che lanci l'evento, l'evento viene lanciato sempre e comunque
dal browser; tu al limite decidi se vi � un listener associato a tale
evento, e come deve reagire. Ovvero, l'evento "onchange" viene comunque
scatenato, anche se tu non hai associato alcun codice ad esso.
 
Quindi la domanda in senso stretto mi sfugge. Puoi ovviamente avere:
 
    function Dica() {
        if (this.value === "Dica")
            console.log("33")
    }
 
E poi a zonzo nel tuo codice:
 
    jQuery("#myInput").change(Dica);
 
Senza dover duplicare il tuo codice nel caso in cui tu debba associare
pi� eventi simili.
 
Mi sfugge onestamente il senso / contesto della domanda.

 Magari l'approccio e' sbagliato, se e' questo il problema, che tipo di approccio mi consigliate?
 
Strutturare bene il codice, con funzioni fatte a modo, � la cosa migliore.
 
Se invece non hai assolutamente alcun controllo sul codice che potrebbe
modificare il valore del campo, allora il discorso � diverso. Ma rischi
il ginepraio, non � cross-browser (o comunque per farlo cross-browser
devi fare un bordello), e secondo me non ne vale assolutamente la pena.
 
Di solito un codice, anche librerie di terzi se son ben fatte, ti danno
sempre un "entry point" per poter capire quando modificano dei valori.
Se non lo fanno, allora ti suggerisco di trovare altre librerie fatte
meglio.
 
P.S.
Non so che newsreader usi, ma i tuoi messaggi in editing vengono sempre
"spalmati" in orizzontale. Potresti verificare i settaggi? Tipo, il
punto 2 mi viene tutto su una riga invece che su diverse righe, e
diventa difficile seguire il discorso.

 sentirlo per apprenderlo :P
 
C'�, ma lo sconsiglio perch� rischi i discorsi di cui sopra, in pi� non
� cross-browser e ha impatti sulle performance.
 
Si potrebbero usare i Mutation Events (che comunque sono deprecated in
favore degli observer, e nessuno delle due cose possono essere usate su
web a livello cross-browser); se si usa sempre jQuery e `val`, si
potrebbe sovrascrivere tale metodo (o crearne uno nuovo) che emette un
evento quando il valore cambia da codice; si potrebbe fare la stessa
cosa sui browser che supportano i prototype e creare un setter per
`value` magari, ma sono tutte cose che, a mio avviso, non andrebbero
fatte e porterebbero pi� danni che benefici.
 
Strutturando il codice in modo corretto, non ce ne � bisogno. Ad
esempio, optando per un canonico approccio MVC potreste optare per
essere notificati quando il modello cambia (M) prima di essere applicato
all'interfaccia (V, Vista), indipendentemente da chi cambia il modello.
Certo, qui si torna al discorso che se uno script di terzi su cui non
avete affatto controllo, modifica direttamente il valore della Vista
senza passare dal Modello, e non mette a disposizione alcun entry-point,
siete punto e da capo. Ma nessuno script su cui non avete controllo
dovrebbe poter fare una cosa del genere, ovvero modificare i dati del
vostro applicativo direttamente dall'interfaccia, senza che voi possiate
esserne avvisati (a livello di codice).
 
 

 "spalmati" in orizzontale. Potresti verificare i settaggi?
 
mhn non so se ggroups mi permetta di settare qualcosa

 Z.

 mhn non so se ggroups mi permetta di settare qualcosa
 
Allora magari vedr� di risolvere la cosa sul mio newsreader forzando il
testo ad andare a capo. ;)