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

jQuery使用trigger触发click事件无法获取目标ID,如何指定触发源ID?

问题描述

我编写了以下jQuery代码用于触发click事件:

$(document).on('click','#button1, #button2',function(e){
     console.log(e.target.id);
    
     if (e.target.id == 'button1') {
         $( "#widgetA .closeresults" ).trigger( "click" );
     }
     else {
         $( "#widgetB .closeresults" ).trigger( "click" );
     }
 });

触发的事件对应执行以下代码,但e.target.id始终为空:

$(document).on('click','#widgetA .closeresults, #widgetB .closeresults',function(e){
      console.log(e.target.id)
      if (e.target.id == 'widgetA') {
          //执行操作A
      }
      else {
         //执行操作B
      }
 });   

问题:如何获取触发该事件的元素ID?


更新需求

若点击button1,我希望触发上述第二段代码的click事件时,返回widgetA作为target.id(这是触发事件的目标组件),该如何实现?

解决方法

1. 问题根源

  • 用trigger("click")手动触发事件时,e.target指向的是.closeresults元素,而非其父容器#widgetA/#widgetB。如果.closeresults本身未设置id,e.target.id自然为空。
  • 原代码逻辑错误:试图将父容器的id与子元素的e.target.id做对比,两者不匹配。

2. 具体实现方案

方案一:传递自定义数据

在触发事件时携带目标组件ID,事件处理函数直接读取该数据:

// 修改触发事件的代码
$(document).on('click','#button1, #button2',function(e){
     console.log(e.target.id);
    
     if (e.target.id == 'button1') {
         $( "#widgetA .closeresults" ).trigger( "click", { widgetId: 'widgetA' });
     }
     else {
         $( "#widgetB .closeresults" ).trigger( "click", { widgetId: 'widgetB' });
     }
 });

// 修改事件处理代码
$(document).on('click','#widgetA .closeresults, #widgetB .closeresults',function(e, data){
      // 优先使用传递的自定义ID,兼容手动点击场景
      const targetId = data?.widgetId || $(this).closest('#widgetA, #widgetB').attr('id');
      console.log(targetId);
      
      if (targetId == 'widgetA') {
          //执行操作A
      }
      else {
         //执行操作B
      }
 });   

方案二:向上查找父容器

无需修改触发逻辑,直接在事件处理函数中通过DOM关系定位父容器:

$(document).on('click','#widgetA .closeresults, #widgetB .closeresults',function(e){
      // 查找最近的目标父容器
      const targetId = $(this).closest('#widgetA, #widgetB').attr('id');
      console.log(targetId);
      
      if (targetId == 'widgetA') {
          //执行操作A
      }
      else {
         //执行操作B
      }
 });   

方案对比

  • 方案一:不受DOM结构影响,能精准指定目标ID,适合需要明确控制触发来源的场景;
  • 方案二:代码更简洁,依赖.closeresults与#widgetA/#widgetB的父子关系,适合页面结构稳定的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:50:22