人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;
}
}
||<

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Area hoge JavaScript open txt
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● y-kawaz
●23ポイント

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

this.hoge = hoge;

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

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


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

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

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

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

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

◎質問者からの返答

ありがとうございます。

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

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

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

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

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

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

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

よろしくお願いします。


2 ● seikoudoku2000
●23ポイント

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

気になった点を何点か。

---

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"と正しく名称が設定されているでしょうか?

---

◎質問者からの返答

ありがとうございます。

あっ すいません。

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);

}

}

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


3 ● seikoudoku2000
●22ポイント

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

<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>

◎質問者からの返答

ありがとうございます。


だめでした。

function displayDataArea(){

alert(hoge);

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

parseAreaCode(httpObj.responseText);

}

}

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

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


4 ● ardarim
●22ポイント

これでどうでしょうか。

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;
 }
}
◎質問者からの返答

ありがとうございます。

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ