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

时间:2011-08-10 09:55:52

标签: javascript jquery

昨天我问了一个问题,我接受了答案,但不久之后,我才知道解决方案还没有完成。问题是: -

Insert a JQuery click handler that executes before the ones already registered

立即使用setTimeout(handler,0);返回,我无法使用return setTimeout(handler,0);。如何同步运行此handler并且不允许父函数完成,直到此处理程序完全执行并从中获取返回值?

我很着急,所以我再次问它,而不是再次编辑这个问题。

3 个答案:

答案 0 :(得分:2)

您无需使用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>

答案 1 :(得分:0)

快速回答:如何改变:

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');
    }

现在点击处理程序是一个函数,对吗?

请参阅:jQuery: Unbind event handlers to bind them again later

答案 2 :(得分:0)

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

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

根据你正在尝试做什么,你可能根本不需要超时,这可以避免异步性和很多麻烦。