如何在javascript中动态调用事件处理程序并获取其返回值

How to call an event handler dynamically and get its return value in javascript?

本文关键字:程序 获取 返回值 事件处理 调用 javascript 动态      更新时间:2023-09-26

我昨天问了一个问题,我接受了答案,但过了一段时间,我才知道解决方案并不完整。问题是:-

插入一个JQuery点击处理程序,在已经注册的点击处理程序之前执行

使用setTimeout(handler,0);立即返回,我不能使用return setTimeout(handler,0);。我怎么能同步运行这个handler,不允许父函数完成,直到这个处理程序完全执行,我得到它的返回值?

我很着急,所以我再问一遍,而不是再编辑一遍。

您不需要使用setTimeout。如果你不使用setTimeout,你的处理程序保持同步,你可以在你的函数中返回所有你想要的值。

<script>
   function f2() {
      alert('Handler declared in HTML')
   }
   buttons = document.getElementsByTagName('input');  // refine this, later
   for (i = 0, max = buttons.length; i < max; i++) {
      oldonclick = buttons[i].onclick;
      buttons[i].onclick = function() {
         alert('Prepend handler');
         oldonclick();
      }
   }
</script>

由于超时是异步的,您需要在超时内设置变量(和/或调用回调函数)。

var x = 1;
setTimeout(function() {
  x = 2;
}, 2000);

下面是一个回调函数的例子。如果你想在变量改变后立即对它做些什么,你就需要这样做。

var x = 1;
function callback(x) {
  console.log(x);
}
setTimeout(function() {
  x = 2;
  callback(x);
}, 2000);

这将log 2一旦超时执行。

根据你想要做的事情,你可能根本不需要超时,这可以避免异步性和很多麻烦。

快速回答:如何改变:

setTimeout(clickhandler, 0);

eval(clickhandler)();

eval(clickhandler);

$(document).ready(function() {
        $("input[type=button]").each(function() {
            // your button
            var btn = $(this);
            // original click handler
            var clickhandler = btn.data("events").click[0];
            btn.unbind("click", clickhandler);

            // new click handler
            btn.click(function() {
                alert('Prepended Handler');
                clickhandler();
            });
        });
    });
    function f2() {
        alert('Handler declared in HTML');
    }

现在clickhandler是一个函数,对吧?

参见:jQuery: Unbind事件处理程序,稍后再绑定它们