- 締切済み
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どちらかが、入力された時点で処理を実行させているつもりなのですが。 どこが悪いのでしょうか?よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
while(true) でなくて単にsetIntervalやsetTimeoutで再帰的に処理を すればいいのでは?
- nda23
- ベストアンサー率54% (777/1415)
同期式で良いなら何故、confirmを使わず、独自処理にしているので しょう? dojoDialogConfirmの中が分からないので何とも言えませんが、 処理内容が単純ならdojoDialogConfirmの方で始末しては? いずれにしても応答を待たずに制御が返ってくる以上、戻り値は 使えません。
補足
ありがとうございます。 申し訳ありません。dojoDialogConfirmについて書いてませんでしたが、Dojo1.3のUIライブラリのDialogを使って、画面ファイルを取得して(Ajax)、レイアウトの自由度を持ちたいのが理由です(Flashでやるのが一番良いかもしれませんが)。また、confirmの機能に限らず、選択ボックス・テキストなど自由に追加できるようにするのが最終的な狙いです。 現在、callbackにて、一応動作はできていますが、ロジックが煩雑になるのと、親画面の変数を取得しなおさなければいけないという事で、同期の方法を探っています。 window.confirmはユーザがはい、いいえどっちを選んだかをwaitしてくれるのですが、そのような動作をScriptOnlyで何とか実現できないかと悩んでおります。
- nda23
- ベストアンサー率54% (777/1415)
まず、ポーリング的に変数内容を確かめる行為が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が応答を受け取った時、どうやって呼び出し元に 伝えるつもりなんでしょう?(勿論、非同期では戻り値で伝える ことはできません)
補足
ありがとうございます。 何とか同期でdojoDialogConfirm("ログアウトしてよろしいですか?"); の返却値を取得したいのですが、無理なのでしょうか? 現在callbackで動いてますが、グローバル変数等event取得の処理もあり、何とか同期で取得したいのですが・・。
補足
ありがとうございます。 こんな感じになるのでしょうか? 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; }