用户在Chrome中工作但不在Firefox中工作

时间:2014-06-12 20:26:50

标签: javascript scroll userscripts

This script搜索并抓取集合中最近的元素,并根据您按下的键滚动到该集合。它被设置为滚动到IP.Board论坛上的下一个和前一个post_block元素。它还会通过其他键跳转页面。

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

关于什么错误的任何想法?

1 个答案:

答案 0 :(得分:0)

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

我必须使用它们才能在所有浏览器中使用它。