You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何确定触发Foundation AlertBox关闭事件的具体按钮?

解决Foundation Alert多关闭按钮的触发源识别问题

这个场景我太熟悉了——Foundation的alert组件默认的close.fndtn.alert事件确实不会直接告诉你是哪个按钮触发的关闭,但我们完全可以在不修改框架源码的前提下搞定,还能完美保留所有原生的过渡动画和UI行为。下面给你两种可行的方案:

方案一:通过自定义数据属性+预存触发元素(最稳妥)

1. 给HTML按钮加自定义标识

我们可以给每个关闭按钮加上data-action属性来明确区分作用,相比直接用class,data属性的语义更清晰:

<div data-alert class="alert-box cookies-consent">
  <div class="informative-text"> Using cookies... </div>
  <div class="close-buttons">
    <a href="#" class="close sure" data-action="accept-cookies">Sure</a>
    <a href="#" class="close opt-out" data-action="reject-cookies">Opt Out</a>
  </div>
</div>

2. JavaScript逻辑处理

先监听按钮的点击事件,把触发按钮临时存到对应的alert容器上,再在Foundation的close事件里读取这个临时数据:

// 第一步:拦截关闭按钮点击,存储触发元素
$('.alert-box .close').on('click', function(e) {
  // 找到当前按钮所属的alert容器
  const parentAlert = $(this).closest('[data-alert]');
  // 将触发按钮存入alert的自定义数据中
  parentAlert.data('triggeredBy', $(this));
});

// 第二步:监听Foundation的close事件,获取触发源
$(document).on('close.fndtn.alert', function(event) {
  const alertElement = $(event.target);
  const triggerButton = alertElement.data('triggeredBy');

  if (triggerButton) {
    // 根据data-action判断按钮类型
    const action = triggerButton.data('action');
    switch(action) {
      case 'accept-cookies':
        console.log('用户同意了Cookie政策');
        // 这里可以添加同意后的业务逻辑,比如设置Cookie
        break;
      case 'reject-cookies':
        console.log('用户拒绝了Cookie政策');
        // 添加拒绝后的业务逻辑
        break;
    }
    // 用完清除临时数据,避免下次触发时拿到旧值
    alertElement.removeData('triggeredBy');
  }

  // 保留你原有的日志逻辑
  console.info('An alert box has been closed!');
  console.info(event);
});

方案二:通过原生事件追溯触发元素(无需修改HTML)

如果不想改动HTML,我们可以利用自定义事件的originalEvent属性,追溯到最初触发关闭的原生点击事件,从而找到对应的按钮:

$(document).on('close.fndtn.alert', function(event) {
  let triggerButton = null;

  // Foundation的close事件是自定义事件,originalEvent指向触发它的原生click事件
  if (event.originalEvent) {
    // 找到事件触发目标,若目标是按钮内部子元素,向上查找.close类元素
    triggerButton = $(event.originalEvent.target).closest('.close');
  }

  if (triggerButton.length) {
    // 通过现有class判断按钮
    if (triggerButton.hasClass('sure')) {
      console.log('点击了「Sure」按钮');
    } else if (triggerButton.hasClass('opt-out')) {
      console.log('点击了「Opt Out」按钮');
    }
  }

  console.info('An alert box has been closed!');
  console.info(event);
});

方案对比

  • 方案一:兼容性更好,即使按钮内部有嵌套元素(比如图标、span)也能准确识别,语义化更强,推荐优先使用。
  • 方案二:无需修改HTML代码,更简洁,但如果按钮内部结构复杂,可能需要额外处理元素查找逻辑。

两种方案都不会干扰Foundation的原生逻辑,完全保留alert的关闭动画和UI行为,也不用修改框架源码,完美符合你的需求~

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

火山引擎 最新活动