2014-06-12 3 views
0

This script recherche et récupère l'élément le plus proche d'une collection et défile en fonction de la touche sur laquelle vous appuyez. Il est configuré pour faire défiler les éléments post_block suivants sur les forums IP.Board. Il saute également à travers la page avec d'autres touches.Un script utilisateur fonctionnant sous Chrome mais pas dans Firefox

Cela fonctionne exactement comme prévu dans Chrome, mais le défilement ne fonctionne pas dans Firefox. Le saut de page fait. Il ne jette aucune erreur, ça ne marche pas.

Code pertinent:

// Questionable functions 
function getPosition(element) { 
    var xPosition = 0, 
    yPosition = 0; 

    while (element) { 
     xPosition += (element.offsetLeft 
      + element.clientLeft); 
     yPosition += (element.offsetTop 
      + element.clientTop); 
     element = element.offsetParent; 
    } 
    return {x: xPosition, y: yPosition}; 
} 

Math.easeInOutQuad = function (time, start, change, duration) { 
    time /= duration/2; 
    if (time < 1) { 
     return change/2 * time * time + start; 
    } 
    time--; 
    return -change/2 * (time * (time - 2) - 1) + start; 
}; 

function scrollTo(element, to, duration) { 
    var start = element.scrollTop, 
    change = to - start, 
    currentTime = 0, 
    increment = 1; 

    var animateScroll = function() { 
     var val = Math.easeInOutQuad(currentTime, start, change, duration); 
     element.scrollTop = val; 
     currentTime += increment; 
     if (currentTime <= duration) { 
      setTimeout(animateScroll, increment); 
     } 
    }; 

    animateScroll(); 
} 

function scrollToNext(context, collection, dir) { 
    var item, 
    i = 0; 

    switch (dir) { 
     case 'up': 
      for (i = collection.length - 1; i >= 0; i--) { 
       item = collection[i]; 

       if (getPosition(item).y < context.scrollTop - 2) { 
        scrollTo(context, getPosition(item).y, 30); 
        break; 
       } 
      } 
     break; 
     case 'down': 
     default: 
      for (i = 0; i < collection.length; i++) { 
       item = collection[i]; 

       if (getPosition(item).y > context.scrollTop + 2) { 
        scrollTo(context, getPosition(item).y, 30); 
        break; 
       } 
      } 
     break; 
    } 
} 

// Trigger in keydown handler 
if (event.keyCode === shortcuts['next_post'] && checkModifiers('next_post', event, shortcuts)) { 
    event.preventDefault(); 
    scrollToNext(document.body, document.getElementsByClassName('post_block'), 'down'); 
} else if (event.keyCode === shortcuts['previous_post'] && checkModifiers('previous_post', event, shortcuts)) { 
    event.preventDefault(); 
    scrollToNext(document.body, document.getElementsByClassName('post_block'), 'up'); 
} 

Des idées sur ce qui ne va pas?

+0

_StackOverflow_ n'est pas destiné à examiner des scripts entiers, essayez de restreindre la fonction ou les combinaisons de fonctions spécifiquement ne fonctionnent pas, alors postez le code ici –

+0

Je vais essayer, mais j'ai le sentiment qu'il a quelque chose à faire avec l'ordre dans lequel les fonctions sont déclarées. Nous verrons. – Makaze

Répondre

0

Trouvé. Firefox utilise document.documentElement pour son défilement tandis que Chrome utilise document.body.

Je devais utiliser les deux pour le faire fonctionner dans tous les navigateurs.

Questions connexes