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

如何通过AJAX编程为select下拉列表添加spinner加载动画

问题根因

你的select使用了Chosen自定义选择插件(从js-dop-chosen类可判断),这类插件会隐藏原生select元素,替换为自定义DOM结构,Drupal默认AJAX throbber默认挂载在原生表单元素旁,因此会随原生select一起隐藏,或是找不到挂载位置无法渲染。


解决方案

1. 修改表单配置代码

$form['select_choice'] = [
  '#type' => 'select',
  '#title' => t('Choice'),
  // 新增包裹容器,方便指定throbber挂载位置
  '#prefix' => '<div class="select-choice-wrapper">',
  '#suffix' => '</div>',
  '#attributes' => [
    'class' => ['js-dop-chosen'],
  ],
  '#options' => [
    '---' => t('None'),
    t('choice 1'),
    t('choice 2'),
  ],
  '#ajax' => [
    'event' => 'change',
    'wrapper' => 'form-wrapper',
    'callback' => [$this, 'ajaxCallback'],
    'progress' => [
      'type' => 'throbber',
      'message' => 'fetching content.....',
      // 新增:指定throbber挂载到我们新增的包裹容器上
      'selector' => '.select-choice-wrapper',
      // 新增:指定throbber放在容器的尾部,可根据需求改为before放在前面
      'placement' => 'after',
    ],
  ],
];

注意:请确认wrapper参数对应的页面元素ID真实存在,否则AJAX回调渲染也会失效

2. 兼容Chosen事件触发

部分场景下Chosen的选择变更事件不会触发Drupal原生AJAX监听,需要添加以下JS适配:

(function ($, Drupal) {
  Drupal.behaviors.chosenAjaxThrobberFix = {
    attach: function (context) {
      $('.js-dop-chosen', context).once('chosen-ajax-fix').each(function () {
        // 监听Chosen的选择变更事件,同步触发原生表单更新事件
        $(this).on('change', function () {
          $(this).trigger('formUpdated');
        });
      });
    }
  };
})(jQuery, Drupal);

3. 可选样式调整

如果throbber位置不符合预期,添加以下CSS调整样式即可:

.select-choice-wrapper + .ajax-progress-throbber {
  display: inline-flex;
  align-items: center;
  margin-left: 8px;
  vertical-align: middle;
}

内容的提问来源于stack exchange,提问作者user66981

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:45:04