7
votes

Pourquoi mon bouton doit-il être cliqué deux fois pour que le gestionnaire d'événements fonctionne la première fois, mais par la suite une fois?

Je veux que le visiteur puisse développer / effondrer certaines sections et utiliser: xxx

et dans la fonction J'ai la fonction: xxx

La première fois qu'un bouton est cliqué, il ne fonctionne pas, les clics suivants (sur l'un des boutons) fonctionnent correctement.

Il y a une conversation connexe ici: doit être cliqué deux fois pour déclencher la fonction < / p>

mais je ne comprends pas la réponse (trop technique ;-), Quelqu'un pourrait-il aider à l'expliquer s'il vous plaît?


3 commentaires

Quelle est la définition / style du xx 'div?


La première chose que je ferais est d'ouvrir Firebug (outil de Device de Firefox JavaScript), définissez un point d'arrêt iside toggledive et passez à travers, en vous assurant que tout est comme je pense que c'est. Si vous ne voulez pas faire face à cela, vous pouvez définir faire une alerte (e.style.display) dans votre fonction. Cela pourrait éclairer une lumière sur les choses.


Juste après la première instruction IF, ajoutez cette ligne: alerte ("Affichage est '" + e.style.display + "'"); Puis exécutez le code à nouveau. Cela devrait vous aider à comprendre ce qui se passe.


7 Réponses :


11
votes

Le style initial sur votre "xx" div peut causer des problèmes ...

Explication h3>

Dites une règle de la feuille de style configurée pour rendre votre div code> s initialement caché. Quelque chose comme: p> xxx pré>

(... où bien sûr le sélecteur ( div code>) sera probablement un peu moins large) p>

Cela semblerait fonctionner correctement, dans la mesure où la page se chargera avec tous vos éléments code> div (code> masqué ("effondré"). Cependant, il n'y a pas de valeur réelle pour la propriété Style.Display sur les éléments eux-mêmes em> - ils hérimentent simplement de la valeur de la feuille de style. Donc, dans votre code, le test que vous utilisez pour vérifier si l'élément est masqué: p>

function getStyle(el, name)
{
  // the way of the DOM
  if ( document.defaultView && document.defaultView.getComputedStyle )
  {
    var style = document.defaultView.getComputedStyle(el, null);
    if ( style )
      return style[name];
  }
  // IE-specific
  else if ( el.currentStyle )
    return el.currentStyle[name];
  
  return null;
}

function toggleDiv(a){
  var e=document.getElementById(a);
  if(!e)return true;
  if(getStyle(e, "display") == "none"){
    e.style.display="block"
  } else {
    e.style.display="none"
  }
  return true;
}


2 commentaires

Info supplémentaire: La page Validate et le même double clic de double clic est nécessaire dans Chrome, c'est-à-dire Firefox


Réponse: Merci d'avoir pris le temps de l'expliquer si clairement Jaime. J'ai maintenant compris et j'ai travaillé. Vous pouvez voir votre pratique pratique ici: www.alan arnoldguitars.co.uk/guitar_repairs.ht m merci encore



0
votes

quelque chose comme ça pourrait fonctionner pour vous. Mais mettez-le dans la tête du document. La fonction Window Onload est importante car le DOM doit être chargé avant de pouvoir vous désordre avec le champ d'entrée

window.onload = function(){
            //  get input field from html
            var myInput = document.getElementById('divOpener');
            // add onclick handler
            myInput.onclick = function(){
               // if you really need to say which div in the document body, you can
               // add it to the rel or ref etc. attributes then get the value with
               // get attribute
               var myDiv = document.getElementById(this.getAttribute('rel'));
               if(!myDiv) return;
               if(myDiv.style.display=="none"){
                  myDiv.style.display="block";
               } else {
                 myDiv.style.display="none";
               }
            }
        }


1 commentaires

Et si cela ne fonctionne pas, indiquez quelles sont vos exigences et nous pouvons aller de là ...



2
votes

Pour enregistrer tout le code JavaScript supplémentaire pour obtenir le style, etc., une solution simple pour cela serait d'ajouter la peau CSS à l'élément lui-même.

<div class="yourclass" style="display:none;">content</div>


0 commentaires

1
votes

Implémentation plus facile, comment

var a=1;
function toggleDiv(xx){
  var e=document.getElementById(xx);

  if(a==1){
    e.style.display="block";a=0;
  } else {
    e.style.display="none";
  a=1;
  }

}


0 commentaires

1
votes

La réponse simple que vous recherchez est d'ajouter l'affichage : aucun; au style en ligne. De cette façon, lorsque vous regardez xxx

il retournera true!


0 commentaires

0
votes

La réponse de Shog9 m'a sauvé d'une frustration de soirée. Merci.

Cependant, il y a une solution beaucoup plus simple que celle qu'il présente. Le secret consiste simplement à changer autour de l'ordre du conditionnel. IE P>

if(e.style.display == "block"){
    e.style.display="none"
} else {
    e.style.display="block"
}


0 commentaires

0
votes

Je sais que c'est un vieux fil, mais pour être un peu utile (pour un changement), vous pouvez toujours appeler l'affichage actuel dans la fonction. Sinon, vous pouvez définir une charge en cours, mais étant donné que le bouton peut ne pas être cliqué, je préférerais faire via un AddeventListener ().

document.getElementById("someID1").addEventListener("click", hideOpen);

function hideOpen() {
  var x = document.getElementById("someID2");
  x.style.display = window.getComputedStyle(document.getElementById("someID2")).display;
  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";
  }
}


0 commentaires