微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内容可以通过 Ajax 更新给最终用户,而不会因更新/刷新而丢失滚动位置吗?

如何解决内容可以通过 Ajax 更新给最终用户,而不会因更新/刷新而丢失滚动位置吗?

问这个问题是为了检查是否有可能做我想做的事,而不是一个如何做的问题(尽管如果有人想写一些东西也总是好的)。由于我还处于网络开发学习的初级阶段,我认为在投入大量时间来实现它之前,先确定是否有希望的结果是可能的。我从网络上的各种参考资料中阅读了相互矛盾的内容,并认为这是询问他人意见的地方,以确定一种或另一种方式。

我正在运行 Drupal 8(撰写本文时为 8.9.13)。该页面使用视图。为了简单起见,页面有 3 个部分;顶部、中间和底部(这是页面/内容本身,这不是页眉、正文、页脚)。底部部分/视图由多个 div/部分组成。所有 3 个部分的内容主要是链接

我正在使用/试用模块“视图自动刷新 D8”。安装和设置后,它会完美地更新页面,除了在内容更新后,而且在每次 Ajax 检查/间隔后页面返回到页面顶部,导致用户体验不可接受。换句话说,如果阅读页面底部,一旦页面通过 Ajax 自动检查更新,页面会突然返回页面顶部。

研究这个我得到的印象是 Ajax 的正常行为。我也觉得这种行为可以被覆盖,但是,其他来源让它听起来好像不能。因此,这个问题的目的在这里

“视图自动刷新 D8”模块的 Javascript 如下所示:

(function ($,Drupal,drupalSettings) {
    // START jQuery

    Drupal.behaviors.views_autorefresh = {
        attach: function(context,settings) {
            for(var view_name in settings.views_autorefresh) {
                for(var view_display in settings.views_autorefresh[view_name]) {

                    var interval = settings.views_autorefresh[view_name][view_display];
                    var execution_setting = '.view-'+view_name.replace(new RegExp('_','g'),'-')+'.view-display-id-'+view_display;
                    if($(context).find(execution_setting).once(execution_setting).length > 0) {
                        // Delete timeOut before reset it
                        if(settings.views_autorefresh[view_name][view_display].timer) {
                            clearTimeout(settings.views_autorefresh[view_name][view_display].timer);
                        }
                        settings.views_autorefresh[view_name][view_display].timer = setInterval(
                            function() {
                                Drupal.behaviors.views_autorefresh.refresh(execution_setting)
                            },interval
                        );
                    }
                }
            }
        },refresh: function(execution_setting) {
            $(execution_setting).trigger('RefreshView');
        }

    }

通过研究这个问题,我发现密切相关的问题说可以通过添加一个 javascript 函数来绕过/阻止页面刷新,例如:

preventDefault() / event.preventDefault()

但是我不完全确定这个事件方法是否可以达到我所追求的结果?或者,以下是否是更好的探索途径?

我想出并很好奇的另一个可能的解决方法/想法是,我使用了一个名为“Geysir”的模块,它允许我直接从前端在页面上更新我的内容内容可以直接在页面上移动、删除,甚至可以在模态叠加中修改,然后更新内容而无需“视图自动刷新 D8”正在执行的页面刷新/滚动回顶部。我想知道 Geysir 模块的逻辑是否可以应用于 Views Auto-Refresh D8 模块?以我中等的 javascript 知识,Geysir 模块中的相关 js/Ajax 逻辑看起来是:

            $.each(Drupal.ajax.instances,function (index,event) {
              var element = $(event.element);
              if (element.hasClass('geysir-paste')) {
                if (href === event.element_settings.url) {
                  event.options.url = event.options.url.replace('/' + paragraph_id + '/','/' + parent_id + '/');
                }
              }
            });
          });
        });

        return false;
      });
    }
  };

  Drupal.AjaxCommands.prototype.geysirReattachBehaviors = function() {
      Drupal.ajax.instances = Drupal.ajax.instances.filter(function(el) {
        return el;
    });

    Drupal.attachBehaviors();
  };

})(jQuery,drupalSettings);

(第 40-64 行)

在继续前进之前,这几乎就是我所处的位置。所以:

  1. 是否可以在进行 Ajax 调用以及通过 Ajax 更新内容时保持最终用户的滚动/页面位置?

如果是这样,

  1. 以上哪条路最好走,或者,还有我还没有走过的路吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。