2011-08-10 11 views
1

私は昨日質問しましたが、私は答えを受け入れましたが、後でいつか解決策が完了していないことを知りました。すぐsetTimeout(handler,0);リターンを使用してイベントハンドラを動的に呼び出す方法とjavascriptでその戻り値を取得する方法は?

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

と私はreturn setTimeout(handler,0);を使用することはできません - :質問です。これをhandlerと同期して実行するにはどうしたらいいですか?このハンドラが完全に実行され、戻り値が返されるまで、親関数が完了することを許可しないでください。

私は急いでいるので、もう一度その質問を編集するのではなく、もう一度質問しています。

+1

イベントドリブンプログラミングの仕組みを理解する必要があります。 ハンドラを設定するコード内の任意の種類のイベントハンドラからの戻り値を取得することはできません。ハンドラが実行される前にその呼び出しコードが継続または終了しているためです。ハンドラ自体は、返された情報を処理して表示するか、別の非同期タスクがどこでそれを見つけることができる場所に置く必要があります。 –

答えて

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> 
+0

私はそれを試していません。しかし私は別の解決策を得ました、私の元の質問を参照してください。 – teenup

0

クイックanswar:

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 event handlers to bind them again later

+0

これは動作しません。 – teenup

+0

eval(クリックハンドラー)はどうですか?または他の例? – andlrc

+0

私はそれらをすべて試しました。彼らは働かない。 – teenup

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

この意志とすぐにタイムアウトが実行されるようlog2

正確に何をしようとしているのかによっては、タイムアウトがまったく必要ない場合があります。非同期性と多くのトラブルを避けることができます。

関連する問題