如何在 JQuery 内部检查哪个控件触发了它

Posted

技术标签:

【中文标题】如何在 JQuery 内部检查哪个控件触发了它【英文标题】:How to Check inside JQuery which control has trigger it 【发布时间】:2021-07-06 15:01:43 【问题描述】:

假设 TWO asp.net 控件触发 SAME JQuery 功能。 我们如何在JQuery 内部检查哪个控件触发了它:

asp.net

<asp:CheckBox ID="R1" runat="server" AutoPostBack="True" OnClick="return Discount(this);"/>
<asp:CheckBox ID="R2" runat="server" AutoPostBack="True" OnClick="return Discount(this);"/>

JQuery

function Discount(chk) 
  $(function () 
    if ( chk.id== $("#R1") )
      alert("Hi R1");

    if (chk.id == $('#R2')) 
      alert("Hi R2");
   );    
  

【问题讨论】:

【参考方案1】:

有很多问题:

chk.id 将是一个字符串,但 $("#R1") 将是一个 jquery 对象 - 它们永远不会相同。 ID="R1" runat="server" 表示 id 不会是 R1,因为 asp.net “有用地”尝试通过添加上下文来使 ID 唯一。

所以

$("#R1").length 将始终 ==0,因为 asp.net 已为您破坏了您的 ID=(再次“有帮助”)。

这已在 OP 评论中得到确认 它显示 "Hi contentBody_R1"

alert("Hi R1")永远 提供 "Hi contentBody_R1" - 所以这不是 OP 正在运行的代码,可能它们正在运行 alert("Hi " + chk.id)

所以你不能使用$("#R1"),除非你使用$("#contentBody_R1")的完整ID - 然后假设你不会将它移动到不同的内容中以获得不同的id

最简单的选择是在通话中传递您想要的信息,例如:

<asp:CheckBox ID="R1" runat="server" AutoPostBack="True" OnClick="return Discount(this, 15.0);"/>
<asp:CheckBox ID="R2" runat="server" AutoPostBack="True" OnClick="return Discount(this, 17.5);"/>
function Discount(chk, discount)  

或将信息存储在复选框上(如果使用服务器端控件,可能需要做一些额外的工作,但对于输入来说是这样):

<input type="checkbox" id="r1" data-discount="15" onclick="return Discount(this);">
<input type="checkbox" id="r2" data-discount="17.5" onclick="return Discount(this);">
function Discount(chk) 
    var discount = $(chk).data("discount") * 1.0;

另一种选择,除非您真的需要在复选框上自动回发(提示:您可能不需要)是使用 html 而不是服务器端控件,即:

<input type="checkbox" id="r1" data-discount="15" onclick="return Discount(this);">
<input type="checkbox" id="r2" data-discount="17.5" onclick="return Discount(this);">
function Discount(chk) 
    if (chk.id == "r1")

在这种情况下,您可以使用chk.id == $("#r1").attr("id"),但如果您通过id 查找,那么您已经知道id,因此无需查找。

【讨论】:

【参考方案2】:

你的测试是假的,你必须这样写:

   function Discount(chk) 
      $(function () 
        if ( chk.id== "R1") 
          alert("Hi R1");
    
        if (chk.id == 'R2') 
          alert("Hi R2");
       );    
      

你可以不用 if 语句来简化:

   function Discount(chk) 
      $(function () 
          alert("Hi " + chk.id);
       );    
      

【讨论】:

什么也没发生。如果我删除“if statemnet”,它会显示“Hi contentBody_R1”和“Hi contentBody_R2” 正常,我不明白,你想删除 if 吗?你想做什么..不清楚 没有。我不想删除 if.. 我只是告诉你正在打印什么 使用:alert(chk.id)(在原始代码中)-chk.id != "R1"(或“R2”)因为 asp.net 与您的 ID 密不可分

以上是关于如何在 JQuery 内部检查哪个控件触发了它的主要内容,如果未能解决你的问题,请参考以下文章

如何检查加载了哪个版本的 jQuery?

以编程方式检查控件时如何防止触发 CheckedChanged 事件?

如何在函数内部触发 $.post?

Angular2:当jquery插件附加到ng-form对象时如何触发ng-valid?

iOS - 如何检测哪个按钮触发了 segue,以及如何根据按钮显示其内容

如何在 firemonkey 中知道焦点在控件内?