javascriptについて。


下記のコードを続けて呼び出すと
最後の呼び出ししか正常に動作しなくなってしまいます。

setArea(1);
setArea(2);
setArea(3);

と続けて呼び出しても全てに成城に動作するにはどうすれば良いでしょうか?

よろしくお願いします。


>||
function setArea(hoge){
this.hoge = hoge;
loadDataFileArea("./xxxxx.txt");
}
function loadDataFileArea(fName){
httpObj = createXMLHttpRequest(displayDataArea);
if (httpObj){
httpObj.open("GET",fName,true);
httpObj.send(null);
}
}
function displayDataArea(){
if ((httpObj.readyState == 4) && (httpObj.status == 200)){
parseAreaCode(httpObj.responseText);
}
}
function parseAreaCode(areaData){
lineData = areaData.split("\n");
for (var i=0; i<lineData.length; i++){
var itemData = lineData[i].split("\t");
var xxxxx = itemData[0];
document.regist["area" + hoge].value = xxxxx;
}
}
||<

回答の条件
  • 1人2回まで
  • 登録:2008/03/04 12:09:47
  • 終了:2008/03/11 12:10:02

回答(4件)

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252008/03/04 12:38:32

ポイント23pt

setArea の以下のコード、これが問題でしょう。

this.hoge = hoge;

setAreaを連続で呼ぶことでhogeが上書きされていると思います。

根本的に setArea で this.hoge をするのは不味いので構造を変える必要がありますね。


短絡的は、loadDataFileArea 関数の以下の部分を

httpObj.open("GET",fName,true);

↓のように第3引数にfalseを与えることで

httpObj.open("GET",fName,true);

非同期アクセスだったのが同期アクセスになるので、複数の setArea が同時に実行されなくなり、結果的に正常に3つの処理がきれいに動くと思います。

id:worldtravel

ありがとうございます。

構造を変えるとはどういう事でしょうか。

httpObj.open("GET",fName,true);を

httpObj.open("GET",fName,false);に変えるだけではダメと言う事でしょうか。

(変えただけではダメだったのですが...)

http://q.hatena.ne.jp/1204541951

の質問で、最初の「hoge」を最後まで渡していきたいので

教えていただき、そのようにしています。

よろしくお願いします。

2008/03/04 12:55:26
id:seikoudoku2000 No.2

seikoudoku2000回答回数33ベストアンサー獲得回数02008/03/04 13:39:12

ポイント23pt

求める結果と現状がよくわからないのですが。。プログラムは書かれた通りに動くので、"正常"というのが何をさすかを明記したほうが回答を得やすいと思います。

気になった点を何点か。

---

for (var i=0; i<lineData.length; i++){</p>

  var itemData = lineData[i].split("\t");

  var xxxxx = itemData[0];            //for文でまわしていますが、結局"xxxxx"には最後の行の値しかはいりません。

  document.regist["area" + hoge].value = xxxxx;

}

---

---

this.hoge = hoge;

⇒thisというのがwindowオブジェクトになるので、ページ内に一つしか存在しない値になっています。

このため、

httpObj.open("GET",fName,true);を

httpObj.open("GET",fName,false);

に変えないと、レスポンスが帰ってくる前にwindowオブジェクト内のhogeという変数が上書きされてしまいます。

falseにしておくと、レスポンスが帰ってくるまで、次の処理に入らないので順に処理されます。

---

---

html内の要素のnameプロパティには"area1","area2","area3"と正しく名称が設定されているでしょうか?

---

id:worldtravel

ありがとうございます。

あっ すいません。

for (var i=0; i<lineData.length; i++){.....</p>

の部分は本当は<select>になっています。

質問用にちょっと変えています。


やはりだめです...

"area1","area2","area3"

はもちろん書いてあります。

何とかできないでしょうか...



上記のコードにこだわってはいません。

ファイルを読み込んで表示する処理を複数同時にできればOKです。

(ファイルの内容を同一フォーム内の複数のselectタグの内容にしたいのです)

よろしくお願いします。

function setArea(hoge){

ファイルを読み込んで処理...

?????????????

lineData = fileData.split("\n");

for (var i=0; i<lineData.length; i++){</p>

var xxxxx = lineData[i].split("\t");

var yyyyy = itemData[0];

document.form["foo" + hoge].options[i] = new Option(xxxxx,yyyyy);

}

}

と言う様にできれば良いのですが...

2008/03/04 16:39:36
id:seikoudoku2000 No.3

seikoudoku2000回答回数33ベストアンサー獲得回数02008/03/04 18:00:09

ポイント22pt

こんな感じでどうでしょう。

<html>
<head>

<title>test</title>
<script type="text/javascript">

function setArea(hoge){
	this.hoge = hoge;
	var fileName = "./" + hoge + ".txt";
	loadDataFileArea(fileName);
}
function loadDataFileArea(fName){
	httpObj = createXMLHttpRequest(displayDataArea);
	if (httpObj){
		httpObj.open("GET",fName,false);
		httpObj.send(null);
	}
}


function displayDataArea(){
	if ((httpObj.readyState == 4) && (httpObj.status == 200)){
		parseAreaCode(httpObj.responseText);
	}
}


function parseAreaCode(areaData){
	lineData = areaData.split("\n");
	var disp = "";
	for (var i=0; i<lineData.length; i++){
		disp += lineData[i];
		document.regist["area" + hoge].options[i] = new Option(lineData[i],i);
	}
	
	
	
}


function createXMLHttpRequest(cbFunc)
{
	var XMLhttpObject = null;
	try{
		XMLhttpObject = new XMLHttpRequest();
	}catch(e){
		try{
			XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
			}catch(e){
				return null;
			}
		}
	}
	if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;

	return XMLhttpObject;

}



function initPage(){
	setArea(1);
	setArea(2);
	setArea(3);
}
</script>
</head>

<body onload="initPage();">


<form name="regist">
	<select name="area1" ></select>
	<select name="area2" ></select>
	<select name="area3" ></select>
</form>


</body>
</html>

id:worldtravel

ありがとうございます。


だめでした。

function displayDataArea(){

alert(hoge);

if ((httpObj.readyState == 4) && (httpObj.status == 200)){

parseAreaCode(httpObj.responseText);

}

}

試しにこうするとアラートが出ませんでした。

どこかで切れているような...

2008/03/04 20:11:45
id:ardarim No.4

ardarim回答回数892ベストアンサー獲得回数1422008/03/05 04:44:34

ポイント22pt

これでどうでしょうか。

function setArea(hoge){
    loadDataFileArea("./xxxxx.txt", hoge);
}
function loadDataFileArea(fName, hoge){
    httpObj = createXMLHttpRequest(displayDataArea);
    if (httpObj){
        httpObj.open("GET",fName,true);
        httpObj.send(null);
    }

    // hogeの値を共有するためdisplayDataArea()の定義をloadDataFileArea()内に移動
    function displayDataArea(){
        if ((httpObj.readyState == 4) && (httpObj.status == 200)){
            parseAreaCode(httpObj.responseText, hoge);
        }
    }
}
function parseAreaCode(areaData, hoge){
    lineData = areaData.split("\n");
    for (var i=0; i<lineData.length; i++){
        var itemData = lineData[i].split("\t");
        var xxxxx = itemData[0];
        document.regist["area" + hoge].value = xxxxx;
    }
}
id:worldtravel

ありがとうございます。

私の環境では動かないのですが...

どの環境で動きますでしょうか?

2008/03/05 08:21:22
  • id:worldtravel
    質問文の「成城」は「正常」の誤りです。



    ついでですが
    なぜうまく行かないのでしょうか...!?

    入力したコードやはてな記法をそのまま表示する(スーパーpre記法)


    >||
    あああああ
    ||<

  • id:tukihatu
    回答できないのでこっちで
    this.hoge = hoge;というのはjavascriptでしか動かないような書き方なので、不味い、という意味だと思います。この書き方だと最初の「hoge」を外の変数としているので、数値飛ばしで最後まで渡している、ということにはなっていません。
    …とはいえ、createXMLHttpRequestのファンクションの中で別のファンクションを読んでいるところで、普通では数値の受け渡しができないかもしれません。
    parseAreaCodeの文を if (httpObj){の中に移したらhttpObj.open("GET",fName,false);でうまくいくかもしれません。
    displayDataでループになっているので不具合が起こってる気もします。
  • id:seikoudoku2000
    私の環境では、apache + IE,Firefox,operaいずれのブラウザでも動作しました。同じ位置にalertを入れてもhogeが更新されていきます。
    一体、どのような環境で開発されているのでしょうか?firebugで、何らかのエラーが表示されていませんか?
    あと、取得にいくテキストファイル(1.txt,2.txt,3.txt)がhtmlと同フォルダに存在することも確認してみてください。
  • id:worldtravel
    すいません。
    Mac+Firefoxで見ていました。

    opera、safariは見れました。

    Firefox、netscapeはダメなようです。

    何かわかりましたらお願いします。
  • id:ardarim
    Win+IE6では上の修正で動いています。
    parseAreaCode()はそのままでは動かないので alert(hoge); で置き換えているのと、URLを変更している以外は上記の赤字の変更だけです。

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

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

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

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