2014-06-12 98 views
0

This script搜索并抓取集合中最接近的元素,并根据您按下的键来滚动。它被设置为在IP.Board论坛上滚动到下一个和前一个post_block元素。它也通过其他键跳过页面。在Chrome中工作但不在Firefox中的Userscript

它的工作原理与Chrome中预期的完全相同,但滚动功能在Firefox中不起作用。页面跳转确实。它不会抛出任何错误,它只是不起作用。

相关代码:

// 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'); 
} 

什么地方不对劲任何想法?

+0

_StackOverflow_并不是要审查整个脚本,尝试缩小到哪些功能或功能的组合特别不工作,然后张贴代码在这里 –

+0

我会尝试,但我有一种感觉,它有一些东西处理函数声明的顺序。 我们将会看到。 – Makaze

回答

0

找到它。 Firefox使用document.documentElement进行滚动,而Chrome使用document.body。

我不得不使用它们才能在所有浏览器中使用它。

相关问题