Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    7

    Problema div che si mostrano e nascondono

    salve a tutti, innanzitutto vi ringrazio già
    sto imparando pian piano javascript quindi non bacchettatemi se scrivo cose che non stanno nè in cielo nè in terra.
    ho creato 2 div, uno di default nascosto, l'altro no; devo riuscire, solo con javascript, quindi senza librerie, a far comparire il primo div e cambiare il testo nel secondo, quando clicco sul secondo e ovviamente ritornare allo stato iniziale al secondo click.
    Ora, sono riuscito a creare una funzione che teoricamente fa quel che deve, in pratica no; al primo click funziona solo una delle 2 istruzioni, al secondo, parte a funzionare come dovrebbe; solo che, considerato il primo click che ha funzionato a metà, il risultato viene invertito.
    non so se sono riuscito a spiegarmi ma vi posto la funzione che ho creato.
    codice:
          function mostranascondi(id) {
            
            var divhide = document.getElementById(id);
            
            if(divhide.style.display == 'none')
                divhide.style.display = 'block';
            else
                divhide.style.display = 'none';
        } 
        function cambiasegno(id) {
            var segnodac = document.getElementById(id) 
            
            if(segnodac.innerHTML == '+')
                segnodac.innerHTML = '-';
            else
                segnodac.innerHTML = '+';
                
                }
    chiedo venia per aver chiesto una cosa che in teoria è semplice ma sto ancora imparando e vi ringrazio già da subito per l'aiuto

    p.s. ho messo id perchè vorrei che funzionasse per più div la stessa funzione

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao e benvenuto.
    Puoi stare tranquillo, la maggior parte delle richieste sul forum è fatta da utenti con un livello di esperienza minimo che chiedono aiuto per problemi generalmente banali. Il forum esiste soprattutto per questo motivo

    Il codice che hai postato non basta per comprendere dove possa risiedere il problema. Personalmente posso intuirlo, ma è come tirare a caso. Sarebbe meglio che tu ci mostrassi anche il relativo html così da poterti dare delle risposte mirate.

    Se hai la pagina pubblica online puoi postare direttamente il link, altrimenti può andare bene postare giusto il codice.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    7
    grazie mille, buono a sapersi
    il codice è una semplice pagina di prova dove sto imparando e testando lo script

    codice:
    <!DOCTYPE html>
    <html>
    
    
    <head>
        <meta charset="UTF-8">
        <title>Prova</title>
        <style>
            div#nascosto {display: none}
        </style>
        <script>
        function mostranascondi(id) {
            
            var divhide = document.getElementById(id);
            
            if(divhide.style.display == 'none')
                divhide.style.display = 'block';
            else
                divhide.style.display = 'none';
        } 
        function cambiasegno(id) {
            var segnodac = document.getElementById(id) 
            
            if(segnodac.innerHTML == '+')
                segnodac.innerHTML = '-';
            else
                segnodac.innerHTML = '+';
                
                }
        </script>
    </head>
    
    
    <body>
        <div id="tasto" onclick="mostranascondi('nascosto'), cambiasegno('tasto')">+</div>
        <div id="nascosto">Testo Nascosto</div>
    </body>
    
    
    </html>
    invece di essere eseguite insieme, al primo click avviene solo la funzione cambia segno, al secondo click funzionano entrambe sono almeno 3/4 giorni che sono fermo su questo e non riesco a venirne a capo ho provato anche a controllare la console su chrome ma non dà nessun errore.
    Ultima modifica di poliurt; 04-12-2015 a 00:49

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Bene, ho visto il problema... ora, personalmente l'ho notato subito ma c'è da dire che non è così banale; potrebbe ingannare anche i meno principianti.

    Si tratta di una questione relativa alla logica di funzionamento dei CSS e di come questi siano applicabili nei differenti modi sugli elementi del DOM (elementi HTML della pagina).

    Cerco di darti un'infarinatura per spiegare dove sta il problema. Partiamo da una guida di riferimento: questa (purtroppo non c'è in italiano)

    In sostanza ci dice che la proprietà style (in JavaScript) rappresenta solo ciò che è dichiarato attraverso l'attributo style di un dato elemento DOM; ma non necessariamente coincide col CSS che invece viene calcolato per tale elemento.

    Il CSS calcolato, infatti, può essere fornito attraverso il metodo window.getComputedStyle() che restituisce il valore effettivo delle proprietà CSS dopo la loro applicazione su un dato elemento.

    Infatti, prendendo il tuo esempio, per l'elemento #nascosto non è stato dichiarato il css attraverso l'attributo style, cioè specificandolo direttamente sul relativo tag, ma è applicato attraverso le regole incluse in head nell'elemento style.

    Per questo motivo, sul tuo script, la prima volta la proprietà divhide.style.display avrà un valore non inizializzato (in realtà sarà una stringa vuota) quindi la condizione divhide.style.display == 'none' viene sfalsata, anche se di fatto l'elemento ha display:none (ma si tratta del valore calcolato e non quello dichiarato sull'attributo style).

    Spero sia chiaro.

    Puoi risolvere in vari modi a seconda di ciò che ti serve fare. Ora, capisco che il tuo scopo è puramente didattico per cui il mio consiglio è di dichiarare semplicemente la proprietà style sul tag, in questo modo:
    codice:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Prova</title>
        <style>
          div#nascosto {display: none;} /* questo chiaramente non serve se dichiari l'attributo sul tag*/
        </style>
        <script>
          function mostranascondi(id) {
            var divhide = document.getElementById(id);
            divhide.style.display = divhide.style.display == 'none' ? 'block' : 'none';
          }
          function cambiasegno(id) {
            var segnodac = document.getElementById(id);
            segnodac.innerHTML = segnodac.innerHTML == '+' ? '-' : '+';
          }
        </script>
      </head>
      <body>
        <div id="tasto" onclick="mostranascondi('nascosto'), cambiasegno('tasto')">+</div>
        <div id="nascosto" style="display: none;">Testo Nascosto</div>
      </body>
    </html>
    A parte l'attributo style ho fatto anche qualche piccola modifica per ottimizzare il codice, ma lascio a te il compito di approfondire sulla tecnica usata.

    Giusto per puntualizzare, tieni conto che, in una situazione del genere, personalmente risolverei col solo uso dei CSS senza JavaScript.

    Un esempio:
    codice:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Prova</title>
        <style>
          #tasto+label{
            display: block;
            width: 20px;
            heigth: 20px;
            line-height: 20px;
            text-align: center;
            background: silver;
            cursor: pointer;
          }
          #tasto,#nascosto{ display: none; }
          #tasto+label:after{ content:"+"; }
          #tasto:checked+label:after{ content:"-"; }
          #tasto:checked~#nascosto{ display: block; }
    
        </style>
      </head>
      <body>
        <input id="tasto" type="checkbox"><label for="tasto"></label>
        <div id="nascosto">Testo Nascosto</div>
      </body>
    </html>
    Anche qui lascio a te il compito di capirne il funzionamento.
    Chiaramente non vorrei sviarti dallo studio di JavaScript ma è giusto anche apprendere che spesso è possibile eseguire analoghe funzioni con diverse tecniche. Questo è uno di quei casi.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    7
    Grazie veramente della risposta, sei stato chiarissimo;
    Anche sull'ottimizzazione del codice infatti con una sola riga si ha praticamente lo stesso risultato.
    Insieme a Js sto studiando HTML e CSS; diciamo che sto portando avanti tutti e 3 parallelamente, in quanto dipendenti l'uno dall'altro.
    Oltretutto così in CSS sembra anche più rapido e snello però, se avessi più div da mostrare e nascondere, non converrebbe utilizzare Js avendo una sola funzione per tutti?

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    se avessi più div da mostrare e nascondere, non converrebbe utilizzare Js avendo una sola funzione per tutti?
    Beh, non è una regola fissa ma personalmente tenderei ad andare di css per quanto possibile. Si potrebbe infatti applicare la stessa regola su più di un selettore avendo quindi un css comunque snello, ma è chiaro che poi bisogna valutare da caso a caso. Tra l'altro, anche se con JavaScript hai un'unica funzione, questa dovrai richiamarla per ogni singolo elemento su cui vuoi che agisca, quindi togli da una parte ma aggiungi dall'altra.
    In tal caso si potrebbero applicare dei listener in modo automatico, ad esempio con un ciclo, o meglio magari usando delle librerie che snelliscono il tutto... ma, ripeto, una soluzione non è necessariamente meglio o peggio di un'altra. Per esaminarne pro e contro, bisognerebbe comunque valutarla all'interno di uno specifico contesto e non in linea generale.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    7
    Eh ad esempio per le librerie avevo visto che quello che volevo fare io si faceva facilmente con jquery e toogle che ho trovato in più di una soluzione solo che andare ad usare le librerie senza aver imparato ad usare JavaScript non mi sembra una grande idea anche perché non saprei come usarle, credo.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.