2012-05-08 5 views
4

ユーザーの操作に応じてJS関数を返すことは可能ですか?ユーザアクションに応じてJS関数を返すことは可能ですか?

私は関数aと関数bを持っているとしましょう。

関数bは、trueとfalseを返す2つのボタンを持つダイアログを表示します。 aからbを呼び出し、操作を続行する前にbからの戻りを待つことができますか?

例コード:

function a(){ 
    if(b()){ 
     do x 
    }else{ 
     do y 
    } 
} 

function b(){ 
$("#anElement").dialog({ 
    title: "This is a Dialog", 
    buttons:{ 
     "Yes": function(){ 
      //do some stuff 
      $(this).dialog("close"); 
      return true; 
     }, 
     Cancel: function(){ 
      //do some stuff 
      $(this).dialog("close"); 
      return false; 
     } 
    } 
}); 
} 

私は、これは多くの確認のようなものですが、私はそれの上にちょうどはい/いいえ以上のものを構築したいと思います。助言がありますか?

+0

私は、 'alert'のようなダイアログが実行を中断させるので、それがうまくいくと思いますが、このようなDOMダイアログではうまくいきません。異なるボタン条件を使用するだけではどうですか? –

答えて

2

いいえ、関数の実行を停止することはできません(まあ、ブレーク条件付きの無限のwhileループで可能ですが、それはひどい練習です)。しかし、Aを2つの関数に分割し、関数Aの残りの半分を関数Bから呼び出すことができます。関数Bに戻り関数を渡して、それを呼び出してユーザーアクションの値を渡すこともできます。

例:

function A() { 
    // do stuff 
    B(finishA); 
} 

function B(callback) { 
    if(someCondition) { 
     callback(true); 
    } else { 
     callback(false); 
    } 
} 

function finishA(userInput) { 
    if(userInput) { 
     // do something if the user clicked okay 
    } else { 
     // do something if the user clicked cancel 
    } 
} 
+0

@ŠimeVidasEh?なぜ編集? :) –

+0

あなたはそれを作成していない関数を呼び出しているので? – 472084

+0

@Jleagle:あなたが何を意味するかわかりません。それがアイデアですね。 :) –

1

一つの解決策は...だから

function a() { 
    b(function() { 
     // do x   
    }, function() { 
     // do y 
    }); 
} 

function b (fn1, fn2) { 
    $("#anElement").dialog({ 
     title: "This is a Dialog", 
     buttons: { 
      "Yes": function() { 
       //do some stuff 
       $(this).dialog("close"); 
       fn1(); 
      }, 
      "Cancel": function() { 
       //do some stuff 
       $(this).dialog("close"); 
       fn2(); 
      } 
     } 
    }); 
} 

、あなたがbに二つの機能を渡すことになります。 「はい」ボタンが有効にされている場合は最初のボタンが呼び出され、「キャンセル」ボタンが有効な場合は2番目の機能が呼び出されます。

このパターンを使用すると、b関数に追加する代わりに、a関数の内部でビヘイビアを直接定義できます。

関連する問題