Visualizzazione risultati 1 fino 9 di 9

Discussione: Condizioni annidate: saltano di palo in frasca!

  1. #1
    Guest

    Predefinito Condizioni annidate: saltano di palo in frasca!

    Ciao, ho un picccolo problema con una funzioncina che sto costruendo, vi posto il codice:
    Codice:
    function textInput() {
    	var k = $('#account').val();
    	if (k.length >= 3) {
    		var v = verifica('account');
             	if (v.indexOf('si') > 0) {
    			$('#accountExplanation').text = 'Il nickname esiste già, cortesemente scrivine un altro.';
    		} else {
    			$('#accountExplanation').text = '<strong>Ok!</strong>';
    		}
    	}
    };
    è un po' un misto di javascript e jquery ma non è questo il problema; in pratica la funzione dovrebbe fare da wrapper ad un'altra funzione che è verifica().
    Quando inserisco del testo in un campo di input HTML ad ogni pressione di tasto viene richiamata la textInput e quando k.length >= 3 viene fatta la verifica, se va a buon fine scrive Ok! se no una frase che indica come il nickname è già in uso.
    Semplice? Sì però qui iniziano i problemi, in pratica la prima condizione è vera e salta la seconda condizione ma entra nella terza!
    E' questo che non capisco, perché lo fa; in pratica appena premo un tasto mi va a finire qui: $('#accountExplanation').text = '<strong>Ok!</strong>'; non ha senso, deve proprio saltare quel blocco.
    Chi mi sa aiutare?

  2. #2
    Guest

    Predefinito

    Quando dico che bisogna debuggare e vedere i valori che prendono le variabili, debugga con firefox o con strumenti di sviluppo di firefox e vedi come mai non entra mai nella seconda condizione, ma oltre a questo a vista d'occhio non capisco questo
    Codice:
    	var k = $('#account').val();
    	if (k.length >= 3) {
    		var v = verifica('account');
             	if (v.indexOf('si') > 0) {
    Per prima cosa gli stai passando una stringa "account" che non si capisce da dove lo prende e cosa fa se è una variabile devia togliere gli apici e comunque non lo stai passando alla funzione
    textInput(account), secondo me già lì si pianta e non ci entra mai perchè v non si sa cosa ritorna, stai dando a V il valore che ritorna la funzione verifica con questa stringa "account" e quindi entra nell'else, poi indexOf cosa fa?
    Ritorna la posizione di si , si non lo trova mai perchè v non è definito se non ritorna un valore e non capisco la logica a dire il vero ma sarà una condizione che hai dentro la funzione verifica...sicuramente...Comunque debugga o con firebug o con strumenti->sviluppo web->attiva strumenti di firefox.

    Stai dicendo, se il valore della input text con id = account >= 3 cioè ha lunghezza maggiore di 3 allora entra nell'if definisci una variabile v = a funzione, quindi si presuppone che verifica abbia un return a fine funzione o blocco di condizione, poi dici se la posizione di SI al ritorno di V è maggiore di 0 allora l'utente esiste altrimeni OK...il punto è che lui SI non lo trova mai quindi v non prende mai il valore SI quell'if è FALSE, e non è mai maggiore di 0, ovviamente ci sarebbe da vedere quello che fa la funzione verifica, ma hai scritto questo nel codice...Ciao

    PS:ma anche se prendesse il valore SI cioè la funzione verifica ritorna SI o NO la condizione IF scritta in quel modo è sbagliata non ti direbbe mai che si è maggiore di zero, cioè da come hai scritto per essere verificata la tua condizione di IndexOf la funzione verifica deve ritornare una stringa dove SI non è la prima parola...Non so se mi riesco a spiegare.dovrebbe ritornare account si o account no....allora se ritorna v= "account si" allora v.indexOf('si')>0 == true
    Non so se mi sono spiegato...Ciao
    Ultima modifica di fractalcosmo : 09-05-2015 alle ore 22.44.53

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,175

    Predefinito

    Il problema di quel codice, non è quello che pensi, ma .text:
    Invece di:
    Codice:
    $('#accountExplanation').text = 'Il nickname esiste già, cortesemente scrivine un altro.';
    Va usato:
    Codice:
    $('#accountExplanation').text('Il nickname esiste già, cortesemente scrivine un altro.');
    Anche se nella seconda espressione analoga immetti del codice HTML, quindi ti suggerirei di usare .html().

    Sistemato questa cosa su, ancora noterai che il codice si comporta nel modo da te indicato. Ma come potrai testare facilmente, quel codice è perfettamente funzionante.

    Semplicemente, stai debuggando con firebug o con gli strumenti di sviluppo di firefox: in quel codice specifico firebug si incasina e dichiara quel comportamento insensato. Prova ad utilizzare il debugger di chrome e vedrai che sarà tutto a posto!

    Ciao!
    Ultima modifica di alemoppo : 10-05-2015 alle ore 00.23.17

  4. #4
    Guest

    Predefinito

    Oltre a quello che dice Alemoppo che non avevo notato, controlla il valore di V....Perchè io mi attengo a quello che dici nel messaggio, hai detto che entra sempre nel terzo IF quindi presuppongo che tu già sappia che entra nel terzo, se scrivi text o text() (che comunque devi scrivere text() ) comunque entrerebbe nel secondo if e non ti farebbe vedere nulla...Ciao...

  5. #5
    Guest

    Predefinito

    Oltre a quello che dice Alemoppo che non avevo notato, controlla il valore di V....Perchè io mi attengo a quello che dici nel messaggio, hai detto che entra sempre nel terzo IF quindi presuppongo che tu già sappia che entra nel terzo, se scrivi text o text() (che comunque devi scrivere text() ) comunque entrerebbe nel secondo if e non ti farebbe vedere nulla...Ciao...

    Ps: è comunque Jquery non si impalla, il problema non è quello, il problema è che entra nel terzo if, come dice l'utente, se per esempio scrivi

    $("#dialogAggUtente").dialog("open").text="user Obbligatorio"

    Jquery apre lo stesso la dialog ma non la valorizza, quindi il problema dell'utente è conoscere la logica non la grammatica del codice.Ahh un 'altra cosa se vuoi inserire il valore del utente già presente o ok dentro l'input con id #accountExplanation ovviamente devi usare il .val('Il nickname esiste già, cortesemente scrivine un altro.'), detto ciò rimane sempre la logica delle condizioni.Il .text è questo:

    The .text() method cannot be used on form inputs or scripts. To set or get the text value of input or textarea elements, use the .val() method. To get the value of a script element, use the .html() method.
    Ultima modifica di fractalcosmo : 10-05-2015 alle ore 01.03.22

  6. #6
    Guest

    Predefinito

    Allora: buona la dritta su .text() è stato un refuso di stampa, capita quando sei concentrato su una cosa, ma corretto, ovviamente, non cambia il risultato la terza condizione viene comunque presa in considerazione, anche se non ha senso farlo.
    E non è colpa di firebug che fa comunque il suo lavoro, infatti mi evidenzia comunque un bug, cioè che v è indefinita!
    E' normale, v viene definita dalla funzione verifica() quando k è di minimo tre caratteri; anzi come si doveva capire guardando lo script tutta la verifica deve avvenire solo e soltanto quando k è di almeno tre caratteri.
    Ma non va, nemmeno correggendo l'errore jquery evidenziato da fractalcosmo mi pare.
    E no non devo usare .val() ma .text() perché #accountExplanation come dice il nome dell'id, è spiegazione account, cioè in questo aso uno span :)

  7. #7
    Guest

    Predefinito

    L'ha anche riscritta usando il solo javascript, è sciocco usare la potenza di jquery per una cosa così semplice ma il risultato non è cambiato affatto.
    Codice:
    function textInput(id) {
    	var k = document.getElementById(id).value;
    	if (k.length >= 3) {
    		var v = verifica(id);
    		if (v.indexOf('si') > 0) {
    			document.getElementById(id + 'Explanation').innerHTML = 'Il nickname esiste già, cortesemente scrivine un altro.';
    		} 
    		if (v.indexOf('no') > 0) {
    			document.getElementById(id + 'Explanation').innerHTML = 'Ok!';
    		}
    	}
    };
    L'ho anche resa più generica, ma non funziona o meglio funziona esattamente come prima :(
    Per chi l'ha chiesto prima, la funzione viene richiata così:
    Codice HTML:
    <input type="text" id="account" name="account" value="" onkyup="textInput(this.id)">
    ma non è importante per la funzione.
    La variabile K comunque ora si comprende che è solo il valore del campo di testo passato, mentre V rimane il risultato di un'altra funzione che verifica se account esiste o meno e risponde sì o no (potrei usare true o false ma ho i miei motivi per non farlo ora).
    E' chiaro che entrando direttamente nella terza condizione, accanto al campo 'account' mi scrive Ok! anche se ho inserito solo un carattere, ma non ha senso logico ne ha senso per me, account deve essere di almeno 3 caratteri.
    Ultima modifica di cibicaldi : 10-05-2015 alle ore 08.58.38

  8. #8
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,175

    Predefinito

    Se fai come ti ho detto, dovresti avere una cosa simile, e a me funziona sia su IE, su firefox che su chrome (ma non con firebug).

    Ciao!
    Ultima modifica di alemoppo : 10-05-2015 alle ore 12.57.45

  9. #9
    Guest

    Predefinito

    Cicalidi certo che frebug fa il suo lavoro, è il miglior debug in commercio, ;) partiamo per punti, analizziamo quello che hai fatto, il problema è che quel v.indexOf('SI') non è mai maggiore di 0, altrimenti entrerebbe quando deve nella condizione, hai letto quello che ti ho scritto come primo messaggio? tu stai dicendo v.indexOf('si'), mi potresti mettere la funzione verifica?o anche solamente il ritorno della funzione....Cmq se hai firebug metti un punto di controllo nella terza condizione e spostati con il puntatore del mouse su V e vedi cosa ritorna, anzi meglio ancora metti un punto di controllo su k.length e poi premi F10 e guardi che valore prende V quando entra nell'IF....

    Ps:Senza la funzione verifica non ti posso aiutare...Stai facendo una verifica di account?dovresti mettermi il codice completo se non è segreto... Ciau
    Ultima modifica di fractalcosmo : 10-05-2015 alle ore 20.35.19

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •