Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2001
    residenza
    Milano
    Messaggi
    213

    Problema visualizzazione password con jquery

    Ho creato un form ma riscontrando problema nella visualizzazione della password nel campo conferma password; se clicco sull'occhio in conferma:_passord mi visulaizza la password ma se clicco nuovamente non la nasconde ....
    Volendo qui il link http://www.all-forevents.com/moduloutente.htm

    codice HTML:
    <html><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.3.0/font/bootstrap-icons.css" /><script src="https://code.jquery.com/jquery-3.6.2.min.js"></script><body>  <style>
        .form-group {position: relative;}
        .bi-eye-slash {      display:block;                       color: 1px solid red;                       z-index:1000;                       cursor: pointer;                       position: absolute;                        top: 4px; left:250px;        }
    #password_rules ul li {        /*font-size: 12px;        font-weight: normal;*/        color: #000000;    }
        #password_rules ul li.complete {        color: #5DB406;    }</style><h4 align=center>Modifica dati utente</h4> <form class="form-horizontal" method="POST" name="modello" action="updateutente.asp"><input type ="hidden" name="IDut" value="<%=IDdip%>"> <div class="area-form"><div class="form-group"><label class="control-label" for="pwd">Password</label><input type="password" id="password" name="password" class="form-control inputstl" value="<%=password%>"><i class="bi bi-eye-slash" id="togglePassword"></i></div>        <div class="form-group"><label class="control-label" for="conferma_password">Nuova password</label><input type="password" name="conferma_password" id="cfpwd" class="form-control inputstl"><i class="bi bi-eye-slash" id="cftogglePassword"></i></div>    
      <div id="password_rules">        <h4>La password deve avere le seguenti caratteristiche:</h4>        <ul>            <li class="password_length">Almeno 8 caratteri</li>            <li class="password_uppercase">Almeno una lettera maiuscola</li>            <li class="password_number">Almeno un numero</li>            <li class="password_match">Le password devono corrispondere</li>        </ul>    </div>   <div class="text-center">        <button type="submit" class="btn btn-primary">Salva</button>        <button type="reset" class="btn btn-primary">Annulla</button> </div>  </div>  </form>
    Il codice jquery usato è il seguente

    codice HTML:
        <script>
    
    const togglePassword = document.querySelector('#togglePassword');const password = document.querySelector('#password');togglePassword.addEventListener('click', () => {              // Toggle the type attribute using            // getAttribure() method            const type = password                .getAttribute('type') === 'password' ?                'text' : 'password';                              password.setAttribute('type', type);              // Toggle the eye and bi-eye icon            this.classList.toggle('bi-eye');        });
    
    const cftogglePassword = document.querySelector('#cftogglePassword');const password1 = document.querySelector('#cfpwd');cftogglePassword.addEventListener('click', () => {              // Toggle the type attribute using            // getAttribure() methodconst type1 = password1.getAttribute('type') === 'password' ?'text' : 'conferma_password';                                password1.setAttribute('type', type1);              // Toggle the eye and bi-eye icon            this.classList.toggle('bi-eye');        });
        </script>
    Ultima modifica di fabiodj; 20-01-2023 a 17:02

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,463
    Ciao, a parte il problema in oggetto, vedo diversi errori/pasticci, a partire dalla formattazione del codice che è male indentato e presenta errori di markup e CSS anche nella pagina di esempio (non parliamo poi di come è stato riportato sul forum ).


    Il primo consiglio che ti do, quindi, è cercare di essere il più ordinato possibile nella stesura del codice, così ti sarà anche più semplice individuare possibili errori, come in questo caso. Solitamente i code-editor, un po' più avanzati, hanno già delle funzionalità di auto indentazione, ma anche se usi il semplice blocco note puoi sempre passare il codice in un qualche formattatore online in modo da tenerlo ordinato e leggibile.


    Riguardo il problema in oggetto, controlla nello script cosa viene impostato come valore dell'attributo type.


    Questo è ciò che fai nel primo campo (quello funzionante):
    codice:
    const type = password.getAttribute('type') === 'password' ? 'text' : 'password';
    password.setAttribute('type', type);

    Mentre questo è nel secondo campo (dove hai il problema)
    codice:
    const type1 = password1.getAttribute('type') === 'password' ? 'text' : 'conferma_password';
    password1.setAttribute('type', type1);

    La stringa "conferma_password" ovviamente non è un valore valido per l'attributo type.
    Prova a correggere.


    Un altro errore è l'uso non appropriato del this dentro le funzioni-freccia:


    codice:
    togglePassword.addEventListener('click', () => {
    
    
      // ...
    
    
      // Toggle the eye and bi-eye icon
      this.classList.toggle('bi-eye');
    });

    Di fatto questa riga genera un errore di script (puoi verificare tu stesso attraverso la console del tuo browser). Infatti quella classe dovrebbe cambiare la grafica dell'occhietto (alternandola a quello con lo slash) ma questo non avviene.


    E' un errore comune pensare che le due sintassi "()=>{}" e "function(){}" siano sempre intercambiabili ma in alcuni casi non è esattamente così.


    Il problema, in questo caso, sta nell'uso della keyword "this".


    Quando si definisce una funzione come listener di un evento, usando la sintassi tradizionale "function(){}", il suo contesto (e quindi il this usato al suo interno) fa riferimento all'oggetto da cui è scaturito l'evento stesso. Riportandolo al tuo caso, quel this dovrebbe puntare all'elemento #togglePassword, ma così non è.


    Nelle funzioni-freccia, infatti, il this non viene vincolato al contesto dell'oggetto di riferimento, ma punta direttamente all'oggetto principale window che, tra l'altro, non possiede il metodo classList(), per cui viene generato un errore nell'esecuzione dello script.


    Questo punto puoi risolverlo facilmente usando la sintassi tradizionale oppure passando attraverso l'oggetto event (argomento della funzione listener) per il quale puoi accedere all'oggetto di riferimento attraverso la proprietà currentTarget.


    Quindi così:
    codice:
    togglePassword.addEventListener('click', function(){
      // ...
      this.classList.toggle('bi-eye');
    });
    oppure così:
    codice:
    togglePassword.addEventListener('click', (evt) => {
      // ...
      evt.currentTarget.classList.toggle('bi-eye');
    });

    Ovviamente devi correggere lo script per entrambe i campi.
    Tra parentesi: personalmente avrei ottimizzato la funzione definendola una sola volta per i vari campi, ed evitando quindi ridondanze; ma per ora penso sia già molto se riesci a correggere gli errori indicati, nonché risolvere il problema in oggetto


    Ancora, per convenzione e per un fattore logico, la grafica dell'occhietto dovrebbe essere senza slash quando la password è offuscata (serie di punti), perché sta ad intendere che cliccandoci deve essere mostrata la password in chiaro; e a quel punto dovrebbe apparire l'occhietto con lo slash, ad intendere che cliccando nuovamente deve essere offuscata la password.


    Nel tuo esempio invece avviene il contrario. Ovviamente devi valutare tu se ti sta bene così o se sia meglio correggere.


    Ancora, nel CSS vedo un errore (di distrazione?) in questa regola:
    codice:
    .bi-eye-slash {
      /* ... */
      color: 1px solid red;
    }

    La proprietà color ovviamente non può avere quel valore. Forse intendevi definire border.


    Prova a correggere e fai sapere.
    Ultima modifica di KillerWorm; 20-01-2023 a 20:23
    Hai già provato Forum HTML.it Toolset?
    uno script che ottimizza il layout e le funzionalità del Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2001
    residenza
    Milano
    Messaggi
    213
    Si giustamente hai ragione adesso con la correzione funziona.
    Ma se volessi racchiudere in un'unica funzione mi daresti un aiuto ?

    codice HTML:
    const togglePassword1 = document.querySelector('#cftogglePassword');
    const password1 = document.querySelector('#cfpwd');
    togglePassword1.addEventListener('click', (evt) => {  
    
    // Toggle the type attribute using getAttribure() method
    
    const type1 = password1.getAttribute('type') === 'password' ? 'text' : 'password';
    password1.setAttribute('type', type1);             
    
     // Toggle the eye and bi-eye icon  
    
    evt.currentTarget.classList.toggle('bi-eye');     
    
       });
    Ultima modifica di fabiodj; 21-01-2023 a 02:34

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,463
    Quote Originariamente inviata da fabiodj
    Ma se volessi racchiudere in un'unica funzione mi daresti un aiuto ?
    Sì, certamente, posso darti qualche consiglio su come procedere.

    Si può risolvere in vari modi ma sostanzialmente va definita la funzione a parte, attribuendole un nome, quindi puoi passare quella stessa funzione al metodo addEventListener per i vari elementi interessati, usando appunto quel nome.

    Ovviamente dentro la funzione non puoi riferirti in modo specifico ai campi (come hai fatto usando ad esempio password1) ma dovrai usare proprietà o metodi opportuni per "raggiungere" tali elementi in modo relativo rispetto all'elemento cliccato.

    Se l'elemento cliccato (cioè l'elemento <i> ) lo recuperi attraverso evt.currentTarget, potrai raggiungere il relativo campo password usando ad esempio la proprietà previousElementSibling, che appunto seleziona l'elemento antecedente quell'<i> (cioè il relativo <input>) in base a come è strutturato il tuo HTML.

    Tieni presente che per me è più semplice farlo che spiegarlo, tuttavia non è mia abitudine dare la minestra pronta, preferisco invece fornire giusto qualche spunto e lasciar provare gli utenti così che, con l'esercizio, raggiunta una soluzione, restino più impresse certe procedure utili a risolvere eventuali altre situazioni analoghe.

    Per il momento ti invito quindi a fare qualche prova con quanto ho indicato, se poi trovi difficoltà chiedi pure.

    Buon proseguimento
    Hai già provato Forum HTML.it Toolset?
    uno script che ottimizza il layout e le funzionalità del Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2023 vBulletin Solutions, Inc. All rights reserved.