【问题标题】:How can I get the new offset of a moved element using Javascript?如何使用 Javascript 获取移动元素的新偏移量?
【发布时间】:2015-12-28 22:53:22
【问题描述】:

我有一个 html 数据表,一行中的每个项目都有一个 list_position 字段,可以更改该字段,然后所有项目都将重新排序以匹配该项目的更改。

如果我有一个很长的列表,并且我将一个项目从 list_position 值从 1 更改为 1000,我希望浏览器在重新排序列表后自动向下滚动到该项目。

目前,使用此代码,我滚动到项目的 initial 位置,而不是当前位置。

reorder: function (item, order, e) {

    // reorder stuff ...

    target = $(e.target).closest('tr');

    this.scrollTo(target);
},


scrollTo: function (target) {

    $('html,body').animate({
        scrollTop: target.offset().top - 60
    }, 1000);

    return false;
}

【问题讨论】:

    标签: javascript jquery vue.js


    【解决方案1】:

    如果您只是移动了元素,它的位置可能还没有反映在 DOM 中。您可以使用的一个技巧是等待浏览器的布局通过使用setTimeout0 超时重新计算。

    所以不要使用this.scrollTo(target);,而是尝试使用:

    setTimeout(function() {
        this.scrollTo(target);
    }, 0);
    

    有关此功能为何有效以及何时有用的更多信息,请参阅this Stack Overflow question


    编辑:感谢 Bill Criswell 指出 Vue.nextTick function,这是一种更符合语义的等待 DOM 更新的方式(因为您已经在使用 Vue.js 库了)。使用Vue.nextTick,您的代码将变为:

    Vue.nextTick(function() {
        this.scrollTo(target);
    });
    

    【讨论】:

    • 谢谢!我只需要将它绑定到上下文 setTimeout(function() { this.scrollTo(target); }.bind(this), 0); 但现在它可以工作了!
    • Vue 有一个 nextTick 函数,它可能比这更可靠,因为它等待 Vue 说所有 DOM 更新都已完成(因为它是异步更新的)。你可以像this.$nextTick();Vue.nextTick(..) 一样使用它,而不是setTimeout()vuejs.org/guide/best-practices.html#Understanding_Async_Updates
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2021-03-15
    • 2021-04-21
    • 1970-01-01
    • 2011-03-03
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多