2009-07-06 9 views
0

Je le code suivant dans un document JavaScript jQuery en cours d'exécution sur une page (CECI EST COURANT):problème bloc de code Cyclique

$(window).resize(function(){ 
    detectscreen(); 
}); 

function windowWidth() { 
    if(!window.innerWidth) { 
     // user is being a git, using ie 
     return document.documentElement.clientWidth; 
    } else { 
     return window.innerWidth; 
}} 

gearsExists = false; 

function detectscreen() { 
    shouldExist = windowWidth() >= 1300; 
    if (shouldExist != gearsExists) { 
     if (shouldExist) { 
       $('body').append('<div id="gearsfloat"><a href="#" id="clickGoTop"></a></div>'); 
       $('#clickGoTop').fadeTo(0,0); 
       $('#clickGoTop').hover(function() { 
        $(this).stop().fadeTo(500,1); 
       }, function() { 
        $(this).stop().fadeTo(500,0); 
       }); 
     } else { 
      $('#gearsfloat').remove(); 
      $('#clickGoTop').remove(); 
     } 
     gearsExists = shouldExist; 
    } 
} 

Ce code est de mon previous question, ramifié ici simplement parce que je pense qu'il est lié.

Le problème ici est que le début est bien: il est affiché. Toutefois, si l'écran est redimensionné à moins de 1300, il disparaît; encore bon.

Maintenant, je fais à nouveau la fenêtre plus grande que 1300. Soudain, l'élément d'engrenage est doublé. Un autre écran squish et largen et BAM, il y en a trois maintenant. Faites ceci plusieurs fois et cela s'additionne rapidement.

Comment puis-je arrêter ceci?

Répondre

0

Haha! Après un moment, j'ai décidé d'ignorer tout ce que disaient tous les autres pendant un moment (désolé) et d'essayer de voir si je pouvais le comprendre moi-même, et c'est ce que j'ai fait!

Merci à SolutionYogi pour toute l'aide, mais le code qu'il m'a donné était hors de mon expertise; il était impossible de déboguer. Ma solution n'est pas aussi belle que la sienne (si vous pouvez aider à optimiser, s'il vous plaît faire), mais cela fonctionne:

function WinWidth() { 
    // check width of content 
    if(!window.innerWidth) { 
     // you git, how dare you use ie 
     return document.documentElement.clientWidth; 
    } else { 
     return window.innerWidth; 
    } 
}; 

function gearsAction() { 
    if(WinWidth() >= 1300) { 
     $('body').append(
      '<div id="gearsfloat"><a href="#" id="clickGoTop"></a></div>'); 

     $('#clickGoTop').fadeTo(0,0); 

     $('#clickGoTop').hover(
      function() {$(this).stop().fadeTo(500,1);}, 
      function() {$(this).stop().fadeTo(500,0);}); 

    }; 
}; 

$(document).ready(function() { 
    gearsAction(); 
}); 

$(window).resize(function() { 
    $('#gearsfloat').remove();   
    gearsAction(); 
}); 
+0

Pourquoi la longueur de gearsFload vérifie-t-elle si le bloc est vide? En outre, vous devriez utiliser l'opérateur == dans cette condition. En outre, comme je l'ai écrit précédemment, vous ne devez pas supprimer explicitement le lien #clickGoTop car il sera automatiquement supprimé lorsque vous supprimez gearsFloat div. – SolutionYogi

+0

Ah, des oopsies, j'ai accidentellement laissé ça là. En attendant, je suis très conscient du fait qu'il faut utiliser l'unité centrale pour l'enlever chaque fois qu'elle est redimensionnée et l'ajouter ensuite. –

+0

Tout ce que je peux faire à ce sujet ou est-ce juste le meilleur moyen? –

4

Si vous connectez du code à un événement de redimensionnement, assurez-vous que votre code ne redimensionne pas la fenêtre. Sinon, l'événement resize se déclenchera à nouveau et votre code ira en boucle infinie.

De même, dans votre code, vous n'utilisez pas la variable globale gearsExists. Supprimez le 'var' en bas de la méthode pour utiliser la variable globale.

function detectscreen() { 

     // Your original code 

     //var gearsExists = shouldExist; //This code will create new local variable. 
     gearsExists = shouldExist; 
    } 
} 

EDIT: Voici ce que je ferais:

//We will add only one variable to the global scope. 
var screenManager = function() 
{ 
    var pub = {}; 

    var inResizeHandler = false; 

    pub.getWindowWidth = function() 
         { 
          return window.innerWidth || document.documentElement.clientWidth; 
         }; 

    pub.manage = function() 
       { 
        //if we are already in the resize handler, don't do anything. 
        if(inResizeHandler) 
         return; 

        inResizeHandler = true; 

        if(pub.getWindowWidth() < 1300) 
        { 
         $('#gearsfloat').remove(); 
         //You don't have to remove clickGoTop because it is part of gearsfloat. 
         inResizeHandler = false; 
         return; 
        } 

        if($('#gearsfloat').length > 0) 
        { 
         inResizeHandler = false; 
         return false; 
        } 

        $('body').append('<div id="gearsfloat"><a href="#" id="clickGoTop"></a></div>'); 
        $('#clickGoTop').fadeTo(0,0); 
        $('#clickGoTop').hover(      
           function() {$(this).stop().fadeTo(500,1);}, 
           function() {$(this).stop().fadeTo(500,0); 
         }); 

        inResizeHandler = false; 
       }; 

    pub.init = function() 
       { 
        $(window).resize(pub.manage); 
       }; 

    return pub; 
}(); 


$(document).ready(function() { screenManager.init(); }); 

EDIT:

version finale de travail:

http://jsbin.com/ufipu

code:

http://jsbin.com/ufipu/edit

+0

Alors, comment puis-je m'assurer qu'il ne se déclenche pas à l'infini? Je l'ai changée en une variable globale, et elle ne se déclenche pas infiniment maintenant, mais chaque fois que la page est redimensionnée de plus en plus petite, elle la crée de nouveau. Après un moment de rendre la fenêtre plus grande et plus petite encore, il semble foiré. –

+0

Bonne prise sur la variable globale à redéfinir. +1 –

+0

+1, mais en mettant l'accent sur "var gearsExists", cela empêche la boucle de se refermer. – annakata

Questions connexes