1308128257 自ファイルにsubmitしたら、ループ状態になったJavaScript


Console.jsを使用しデバックした結果、ループになるケースついてです。
例】ユーザがサーバに対して、登録メールアドレスに変更をかける
(ブラウザ:Chrome11, iPhone4-Safari)
<html>
<head>
<script type="text/javascript" src="Console.js"></script>
<script type="text/javascript" src="inc.js"></script><!-- goAction()を定義 -->
<script type="text/javascript">
<!--
 function wait() {
  Console.print("Hello !");
  if ( goAction ) {
   Console.print("Hello ! goAction ");
   if(document.FRM1) {
    Console.print("Hello ! FRM1");
    return
   }
  }
  setTimeout("wait()", 200);
 }
 wait();
-->
</script>
</head>
<body>
<?php
if ($_POST['update'] != 'true') {
?>
<form name="FRM1">
<input type="hidden" name="update" value="true">
<INPUT type="button" onclick="goAction()" value="送信"><!-- 自ファイルへsubmitさせる -->
</form>
<?php
}
else
{
/* 省略:POSTデータでDBに更新をかけ、成功したら
更新結果をhtml表示する
*/
}
?>

DBのデータ更新が成功し、再び自ファイルがhtml表示された後、
Console.print()の表示結果が、
Hello !
Hello ! goAction
...
のループ状態になってしまいます。
( 500文字制限のため.皆様の返信にコメントで追記するつもりです.)

回答の条件
  • URL必須
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/15 17:57:39
  • 終了:2011/06/19 23:40:51

ベストアンサー

id:Cherenkov No.1

Cherenkov回答回数1502ベストアンサー獲得回数4922011/06/15 18:04:21

ポイント500pt

(何度も更新してすいません)

  • goActionを見ないとなんとも。
  • if(goAction)でgoAction関数を呼ぶのはおかしいような。
  • wait()はwindow.onload = function() { wait() }としたほうがいいのではないでしょうか。

(window.onloadでgoActionすればwait関数がいらない?)

  • Console.printをconsole.logに変えてもループするなら原因はConsole.jsにはありません。


ソースコードの貼り付けなら https://gist.github.com/ などにどうぞ。

id:gdwtseq

早速のご回答ありがとうございます。

goAction()ついて;

if(goAction)の部は、goAction()が定義されたかをチェックしているだけです。

==include.js==

function goChgAddr(){

var form_obj = document.FRM1;

var mailaccount_txt = form_obj.mailaccount.value;// 実際は<input type="text" name="mailaccount">が在る(質問では字数節約の為、省いていた)

//文字チェック

if( !mailaccount_txt.match(/^[0-9a-zA-Z_\-]+([0-9a-zA-Z_\.\-]+)*$/) )

{

alert("使用可能な文字は\n半角英数字・ドット・ハイフン・'_'\nです");

return;

}

if (!confirm("メールアドレスを変更します。\nよろしいですか?")) return;

form_obj.setAttribute('action', './chgaddr.html');

form_obj.submit();

}

=============

・console.logに切り替えても、ログがループ状態で表示されました。

しかし、何かの拍子で、ページを何回か更新したのが良かったのか、

ループがなくなりました。

なんだか、腑に落ちないです。

2011/06/15 22:19:04
  • id:Cherenkov
    >if(goAction)でgoAction関数を呼ぶのはおかしい
    はここで実行されちゃうものだと勘違いしていました。失礼。


    postされた場合はdocument.FRM1が見つからないので、waitのループになりますよね。

    ページ読み込み後にdocument.FRM1があるか確認するだけなら、
    window.onload = function() {
    if(document.FRM1) {
    Console.print("Hello ! FRM1");
    }
    }
  • id:Cherenkov
    上記に加え、
    > /* 省略:POSTデータでDBに更新をかけ、成功したら更新結果をhtml表示する*/
    の「html表示する」をちゃんと書いていなくて、元のページがそのまま表示されてループが起きていたとか。
  • id:Cherenkov
    >ループがなくなりました。なんだか、腑に落ちないです。
    まだなにかお困りでしょうか?
  • id:gdwtseq
    返事が送れてすみません。
    納得できました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません