我在同时使用onScroll和scrollTo时遇到了麻烦。
我将两个DIV彼此相邻放置并在它们之间同步滚动。意思是当其中一个滚动时,另一个滚动到正确的位置。像这样制作:

function syncCompareScroll(e) {
var $other;
var $this = $(this);
if ($(this).hasClass('left-doc')) {
    $other = $(".right-doc");
} else {
    $other = $(".left-doc");
}
console.log("scroll called " + $(this).attr("class"));

clearTimeout(compareScrollTimer);
compareScrollTimer = setTimeout(function () {
    $this.off('scroll');
    $other.off('scroll');

    var cutoff = $this.scrollTop();
    var elemOffset;
    var $currElement = $this.children().first();

    $this.find("[name ^= 'sect']").each(function () {
        elemOffset = $(this).offset().top;
        if ((elemOffset + cutoff - 100 - 30) > cutoff) {
            $currElement = $(this);
            return false;
        }
    });
    var elemToScroll = $other.find($("[name = '" + $currElement.attr("name") + "']"));
    $other.scrollTo(elemToScroll, 0, {axis: 'y'});

    setTimeout(function () {
        $this.on("scroll", syncCompareScroll);
        $other.on("scroll", syncCompareScroll);
    }, 50);
}, 200);}


我也有将两个DIV滚动到所需位置的按钮:

$(".next-change").click(function () {
                if (index < changedSectionsNames.length) {
                    index++;
                    var name = changedSectionsNames[index];
                    var $leftChange = $(".left-doc [name = '" + name + "']");
                    var $rightChange = $(".right-doc [name = '" + name + "']");
                    if ($leftChange.hasClass("added")) {
                        $rightChange = $(".right-doc [name = '" + $leftChange.find("del").attr("name") + "']");
                    }
                    if ($rightChange.hasClass("added")) {
                        $leftChange = $(".left-doc [name = '" + $rightChange.find("del").attr("name") + "']");
                    }
                    $(".left-doc").off('scroll', syncCompareScroll);
                    $(".right-doc").off('scroll', syncCompareScroll);
                    $(".diff .content .left-doc").scrollTo($leftChange, 200, {axis: 'y'});
                    $(".diff .content .right-doc").scrollTo($rightChange, 200, {axis: 'y'});
                    setTimeout(function () {
                        $(".left-doc").on("scroll", syncCompareScroll);
                        $(".right-doc").on("scroll", syncCompareScroll);
                    }, 50);
                }
            });


问题是按钮onClick完成时还调用了syncCompareScroll。如何防止其单击按钮?

更新
html只是2个DIV,其结构如下:

<div>
    <div class='left-doc>
        <p name='sect1'>text</p>
        .... so on
    </div>
    <div class='right-doc'>
        <p name='sect1>another text</p>
        .... so on
    </div>
</div>


这是jsfiddle示例。如您所见,在按下下一个DIV滚动到所需的p之后。但是,在scrollto完成之后,syncCompareScroll开始启动,并且它中断了左侧的位置。

http://jsfiddle.net/m7ad36ju/

最佳答案

您可以在全局范围内设置一个名为noSyncCompareScroll的变量。默认情况下将其设置为false。当您调用.next-change onClick事件时,请将noSyncCompareScroll设置为true。在syncCompareScroll中,检查noSyncCompareScroll的值。如果为true,请将其设置为false并退出函数;否则像往常一样运行syncCompareScroll。

关于javascript - 如何防止jQuery onScroll在scrollTo之后触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32331998/

10-13 00:38