【问题标题】:How to run a callback function on a jQuery trigger("click")?如何在 jQuery 触发器(“点击”)上运行回调函数?
【发布时间】:2021-10-29 05:02:03
【问题描述】:

我需要在trigger 调用的回调中触发一个自定义事件,但我无法让它工作。

我试过了:

var $input = $( ".ui-popup-container" ).find( "input" ).eq(2);

function runtests () {
    console.log("clicked the input");
};
$input.trigger('click', runtests()); 

还有这个:

var $input = $( ".ui-popup-container" ).find( "input" ).eq(2);
$input.trigger('click', function(){
    console.log("clicked the input");
}

两者都不起作用。

问题:
触发元素点击时如何让回调函数运行?

【问题讨论】:

  • 为什么要添加 undefined 作为第二个参数来触发?第二个参数应该做什么?您是否混淆了触发器和绑定?
  • 这是我对回调函数的尝试...我还尝试按照jquery API 将其包装在[] 中,但也不起作用
  • .trigger 不接受任何回调。 $input.trigger('click')$input 元素上触发click 事件,即它将执行绑定到这些元素的click 事件处理程序。看起来您已将 runtest 绑定到 $input,但我不确定您到底想要什么。
  • 但是这个回调应该怎么用呢?
  • @FelixKling:我需要点击输入,在它执行了它自己的处理程序之后,我需要运行一组 qunit 测试(检查输入是否符合预期)

标签: javascript jquery events triggers callback


【解决方案1】:

当您调用trigger 时,绑定的事件处理程序会立即执行,因此您不需要任何回调。只需使用

$input.trigger('click');
runtests();

【讨论】:

  • @frequent,当然,您对回调和处理程序感到困惑。如果没有与动作关联的异步活动,它是一个您触发的处理程序,而如果有异步活动,则分配一个回调来处理它发生时的响应(或按状态)。
  • 这对我不起作用。除非我在示例中的 runtests() 函数上使用 setTimeout,否则我会遇到竞争条件。
  • 当您在代码的第二部分中有很长的 js 代码并在结束 ajax 调用时,这不起作用。唯一一个丑陋的解决方案,但 settimeout 似乎有效
【解决方案2】:

是的 - 触发器确实不接受回调,但我们可以将回调作为参数传递。

//.trigger( eventType [, extraParameters ] )

$("#element").bind("customCall", function(e, callback){
   callback();
}
var callback = function(){alert("Hello");}
$("#element").trigger("customCall",[callback]);

希望对你有帮助

【讨论】:

  • 如果您已经熟悉在为 DOM 元素定义绑定事件时分配回调函数的约定,那么这个答案实际上会告诉您如何在事件被触发。对我来说,这使它成为此页面上最有价值的答案之一。
  • 同意@tobylaroni。不知道为什么这不是公认的答案!可能问题是特定于“触发”而不是自定义调用。
  • 阅读更多关于.trigger( eventType [, extraParameters ] )的信息。
【解决方案3】:

首先需要绑定点击事件,然后才能触发点击事件。

$input.bind('click', function() {

     console.log("clicked the input");
});

$input.trigger('click');

【讨论】:

  • 是的。那是一种方式。谢谢。
  • 使用.on() 而不是.bind()
  • 问题是关于$input.trigger('click', function(){//code when the click function has been completed});
【解决方案4】:

触发器没有回调函数。

.trigger( eventType [, extraParameters ] )

Official Document

你能做什么

var $input = $( ".ui-popup-container" ).find( "input" ).eq(2);

$input.on('click',function(){
   console.log("clicked the input");
});

【讨论】:

    【解决方案5】:

    您需要使用bindon 添加回调。在您的情况下,它应该如下所示:

    var $input = $( ".ui-popup-container" ).find( "input" ).eq(2);
    
    function runtests () {
        console.log("clicked the input");
    };
    
    $input.bind('click', runtests);
    

    绑定点击的更短版本是$input.click(runtests)

    然后它会在点击时被调用,或者您可以使用$input.trigger('click') 或简单地使用$input.click() 手动触发它。

    【讨论】:

      【解决方案6】:

      触发器没有回调函数 - 您可以更好地重写代码以使用 .on 方法。

      $("body").on("click", "#click", function() {
         alert("Clicked!"); 
      });
      

      JSFiddle.

      【讨论】:

        【解决方案7】:

        如果您对每个输入都有一个点击处理程序,但想对特定元素执行一些操作:

        var $container = $(".ui-popup-container"),
            special = 2;
        
        $container.on('click', 'input', function() {
            // do something for every input
        
            if($(this).index() == special) {
                // your "callback", e.g. the function you want to execute on input:eq2 click
                myfunction();
            }
        }).find('input').eq(special).trigger('click');
        

        【讨论】:

          【解决方案8】:

          .trigger() 不接受任何回调。大多数情况下您不需要它,因为绑定的事件处理程序会立即执行。但是,如果您在触发事件处理程序中有 AJAX 调用,则接受答案中的代码将不起作用:

          $input.trigger('click');
          runtests();
          

          你必须像这样使用setTimeout()

          $input.trigger('click');
          setTimeout(function () {
              runtests();
          }, 250);
          

          或者考虑在.trigger() 事件处理程序中对.ajax() 调用使用successerror 回调。

          【讨论】:

            【解决方案9】:

            Denys Séguret 的逻辑是正确的。但是当触发函数后需要回调函数时,$.when 是可用的:

            $.when($input.trigger("click"))
             .done(function () { runtests(); });
            

            【讨论】:

              【解决方案10】:

              请试试这个:

              $('#inputTxt1').change(function(e, callback1, data) {
              
                  /*  other statement ...   */  
                  
                 if(typeof(callback1)==='function'){
                     callback1(data);
                 } 
              });
              
              $('#button2').click(function(e){
                  $('#button1').trigger('change', [secondCallback, 'data to callback']);
              });
              
              function secondCallback(data){
                  var result = data;
              } 
              

              【讨论】:

              • 您能否提供更多关于代码的作用以及它如何帮助 OP 的详细信息?
              • 糟糕!我误解了问题。其实我只是想展示一些嵌套触发。希望这是送给正在寻找此解决方案的人的礼物。非常抱歉,感谢您的提醒。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-15
              • 2018-12-14
              • 1970-01-01
              • 2023-02-17
              • 2016-02-04
              • 2023-03-19
              相关资源
              最近更新 更多