2017-05-13 1 views
1

J'utilise une technique où j'ai une table dans un div afin de limiter l'espace couvert par la table et faire défiler à la place. Dans le tableau sont des cases à cocher. Ces cases à cocher affectent le rendu de la table. Quand on est cliqué, la table est re-rendue dans la div. Cela provoque toujours le retour de la barre de défilement vers le haut ce qui est gênant. Donc, après avoir rendu la table en javascript, je fais un appel à setTimeout pour appeler de manière asynchrone une fonction qui redéfinit la valeur scrollTop à l'endroit où elle était avant le rendu. est ici le code snipit en question:javascript scrollTop ne semble pas fonctionner

Note: (ge() == geMaybe() == document.getElementById())

o.renderAndScroll = function() { 
    var eTestSection = geMaybe(o.id + '-testSection'); 
    var scrollTop = 0; 
    if (eTestSection) { 
     scrollTop = eTestSection.scrollTop; 
    } 

    o.render(); 

    if (eTestSection) { 
     setTimeout(
      function() { 
       console.log('Scrolling from ' + ge(o.id).scrollTop + ' to ' + scrollTop); 
       ge(o.id).scrollTop = scrollTop; 
       console.log('Scrolled to ' + ge(o.id).scrollTop); 
      }, 
      1000); 
    }    
} 

Ma sortie du journal de la console est ce chaque fois que je change une case à cocher état:

Scrolling from 0 to 1357 
Scrolled to 0 

Toute autre façon de faire ce travail? Notez que j'ai fait le timeout une seconde entière juste pour m'assurer que le rendu a été déplacé vers le DOM au moment où mon code de défilement est appelé. J'utilise principalement le chrome, mais j'en ai besoin pour travailler avec plusieurs navigateurs. Je n'utilise pas jQuery. Si j'essaie d'intercepter l'événement onscroll dans le débogueur ou même de consigner des événements à partir d'un gestionnaire d'onscroll, le débogueur chrome se bloque lorsque la barre de défilement est déplacée avec la souris.

+0

Vous ne définissez pas l'scrollTop sur l'élément que vous avez obtenu. Est-ce que 'o' est défilable? – Kaiido

+0

Cela a apparemment été causé par un autre bug - je n'obtenais pas le même élément dans la fonction timeout que j'étais à l'origine !!! Je dois enlever cette question de la DB. –

+0

Vous pouvez supprimer votre question – Kaiido

Répondre

0

Le code est correct:

o.renderAndScroll = function(fForce) { 
     var scrollTop = 0; 
     var eTestSection = geMaybe(o.id + '-testSection'); 
     if (eTestSection) { 
      scrollTop = eTestSection.scrollTop; 
     } 
     o.render(fForce); 
     setTimeout(
      function() { 
       // re-lookup element after being rendered 
       var eNewTestSection = ge(o.id + '-testSection'); 
       eNewTestSection.scrollTop = scrollTop; 
      }, 
      1); 
    };