• 締切済み

Javascriptでconfirmの戻り値を取得したい

こんにちは。 Javascriptで独自confirmを表示し「はい・いいえ」で、後の処理を実行させたいのですが、無限ループに陥ってブラウザでscriptを停止するよう求められてしまいます。 var bb = dojoDialogConfirm("ログアウトしてよろしいですか?"); while(true) {  inv = setInterval("", 1000);  if (bb && bb == true) {   window.location = 'logout.action';   clearInterval(inv);   break;  } else if (bb = false) {   clearInterval(inv);   break;  } } window.confirmのようにJavascriptは待たないので、bbの戻り値(true or false)を取得する前にScriptは走り、bbにtrue falseどちらかが、入力された時点で処理を実行させているつもりなのですが。 どこが悪いのでしょうか?よろしくお願いします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

while(true) でなくて単にsetIntervalやsetTimeoutで再帰的に処理を すればいいのでは?

bobo39
質問者

補足

ありがとうございます。 こんな感じになるのでしょうか? callbackfunctionにすると、インスタンスを再取得しなければいけない為、何とか同期を取りたいのですが・・。 var ret = null; function dojoDialogConfirm(_msg) {  if (ret) {   window.location = 'logout.action';   clearInterval(ret);   ret = null;  } else if(ret == "false") {   clearInterval(ret);   ret = null;  } else {   画面.show();   setInterval(dojoDialogConfirm("ログアウトしてよろしいですか?"), 1000)  } } dojoDialogConfirm_onClick(val) {  // val = true or false  ret = val; }

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

同期式で良いなら何故、confirmを使わず、独自処理にしているので しょう? dojoDialogConfirmの中が分からないので何とも言えませんが、 処理内容が単純ならdojoDialogConfirmの方で始末しては? いずれにしても応答を待たずに制御が返ってくる以上、戻り値は 使えません。

bobo39
質問者

補足

ありがとうございます。 申し訳ありません。dojoDialogConfirmについて書いてませんでしたが、Dojo1.3のUIライブラリのDialogを使って、画面ファイルを取得して(Ajax)、レイアウトの自由度を持ちたいのが理由です(Flashでやるのが一番良いかもしれませんが)。また、confirmの機能に限らず、選択ボックス・テキストなど自由に追加できるようにするのが最終的な狙いです。 現在、callbackにて、一応動作はできていますが、ロジックが煩雑になるのと、親画面の変数を取得しなおさなければいけないという事で、同期の方法を探っています。 window.confirmはユーザがはい、いいえどっちを選んだかをwaitしてくれるのですが、そのような動作をScriptOnlyで何とか実現できないかと悩んでおります。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

まず、ポーリング的に変数内容を確かめる行為がWindowsにマッチ していません。while(true)以下のループがタイムスライスを独占 しているので、ブラウザは何も出来ません。Confirmへの応答も イベントを受け付けるためのタイムスライスが得られないため、 動作しないでしょう。(処理内容が不明なので想像ですが) setIntervalはタイマを仕掛けるだけで、Sleepしません。と言って Sleepしたとしてもタイムスライスは解放しないので、同じですが・・・ 変数bbは共通変数になっているのですか?(だとすると、定義が おかしい気がします。)dojoDialogConfirmから見えない変数なら 変更のしようがありません。最初の戻り値のままです。 >if (bb && bb == true) { 意味が良く分かりません。 if ( bb ) なのでは? dojoDialogConfirm("ログアウトしてよろしいですか?"); inv = setInterval("tmOut", 1000); //★ここで処理は終了(タイムスライスを解放する) function tmOut() {   clearInterval(inv); //ここでタイムアウトの処理 } dojoDialogConfirmが応答を受け取った時、どうやって呼び出し元に 伝えるつもりなんでしょう?(勿論、非同期では戻り値で伝える ことはできません)

bobo39
質問者

補足

ありがとうございます。 何とか同期でdojoDialogConfirm("ログアウトしてよろしいですか?"); の返却値を取得したいのですが、無理なのでしょうか? 現在callbackで動いてますが、グローバル変数等event取得の処理もあり、何とか同期で取得したいのですが・・。

関連するQ&A