You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal:打开模态框时阻止页面滚动的问题

解决Drupal中AJAX模态框打开时页面自动滚动到顶部的问题

以下是几个经过验证的可行解决方案,针对多区块AJAX按钮触发模态框后页面跳顶的问题:

方案1:锁定页面滚动位置并禁用背景滚动

通过监听模态框的打开/关闭事件,保存当前滚动位置并锁定页面,避免跳顶:

步骤1:修改按钮的PHP属性

为按钮添加模态框配置选项,确保模态框初始化时不触发自动滚动:

// 订阅按钮配置
$form['btn_actions']['subscribe_for_free_btn'] = [
  '#type' => 'link',
  '#title' => $btnJoin,
  '#url' => $subscribeLink,
  '#attributes' => [
    'class' => ['btn-subscribe', 'use-ajax'],
    'data-dialog-type' => 'modal',
    'data-dialog-options' => json_encode([
      'autoResize' => FALSE,
      'modal' => TRUE,
    ]),
  ],
];

// 登录按钮配置
if (!$isAuthenticated) {
  $form['btn_actions']['login_btn'] = [
    '#type' => 'link',
    '#title' => $btnLogin,
    '#url' => $loginLink,
    '#attributes' => [
      'class' => ['btn-login', 'use-ajax'],
      'data-dialog-type' => 'modal',
      'data-dialog-options' => json_encode([
        'autoResize' => FALSE,
        'modal' => TRUE,
      ]),
    ],
  ];
}

步骤2:添加自定义JavaScript

创建一个自定义JS文件(或添加到现有主题/模块的JS中):

(function ($, Drupal) {
  let savedScroll = 0;

  // 模态框打开时锁定滚动
  $(document).on('drupalModalOpen', () => {
    savedScroll = $(window).scrollTop();
    $('body').css({
      overflow: 'hidden',
      position: 'fixed',
      top: `-${savedScroll}px`,
      width: '100%'
    });
  });

  // 模态框关闭时恢复滚动
  $(document).on('drupalModalClose', () => {
    $('body').css({ overflow: '', position: '', top: '' });
    $(window).scrollTop(savedScroll);
  });
})(jQuery, Drupal);

方案2:禁用AJAX自动聚焦行为

Drupal的AJAX默认会聚焦到模态框内的第一个可交互元素,这是导致页面跳顶的常见原因。通过以下JS阻止这一行为:

(function ($, Drupal) {
  // 点击AJAX按钮时提前保存滚动位置
  $(document).on('click', '.use-ajax[data-dialog-type="modal"]', () => {
    Drupal.ajaxScrollPos = $(window).scrollTop();
  });

  // 内容加载完成后阻止自动聚焦并恢复滚动
  $(document).on('drupalContentLoaded', (event, data) => {
    if (data.$element.closest('.ui-dialog').length) {
      data.$element.find(':tabbable').first().blur();
      $(window).scrollTop(Drupal.ajaxScrollPos || 0);
    }
  });
})(jQuery, Drupal);

方案3:清理链接中的无效锚点

检查你的$loginLink和$subscribeLink是否包含空锚点(如#)或指向页面顶部的锚点,这类锚点会触发页面滚动。确保链接使用正确的路由生成:

// 示例:生成登录页面的正确链接,无多余锚点
$loginLink = \Drupal\Core\Url::fromRoute('user.login', [], ['absolute' => TRUE]);

内容的提问来源于stack exchange,提问作者hamdi ben henda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:47:35