関数の中で処理した変数の値を取り出したいのですが…

[新着] Webテンプレートを仮オープンしました



0   名前: mek : 2007/02/06(火) 14:35  ID:rs.fBvgQ sub-Ke
javascriptはほとんど触ったことがなかったのですが、必要にせまられてあわてて調べております。

三日間自分なりに調べたのですがどうしてもわからないので質問させていただきます。

以下のようなソース(動きません)で関数の中で処理した変数(jss)をとりだしたいのですが、どうしたらよいのでしょうか?

------------------------------------------------------
<head>

<script language ='JavaScript'>

var jss = 1;

function control(how){
if (how=="F") jss = jss + 1;
if (how=="B") jss = jss - 1;

return jss;
}


document.write(ここで受け取ったjssの値を表示させたい);



</script>
</head>

<body>


<a class=Controls href="#" onClick="javascript:control('B');">もどる</a>
<a class=Controls href="#" onClick="javascript:control('F');">すすむ</a>
</body>

-------------------------------------------------------


つまらない質問ですみません。

よろしくお願い致します;;


1   名前: 匿名 : 2007/02/06(火) 14:35  ID:/sMf8B64 sub-kJ
・グローバル変数(大域変数)
・ローカル変数(局所変数)

の違いを調べてみては。今回の場合、jss はグローバル変数だから、どこからでも参照可能(return する必要すらない)。

なお今回の場合、document.write() は避けた方が良いと思うが。

2   名前: mek : 2007/02/06(火) 14:35  ID:1W/isGOX sub-Ds
お返事ありがとうございます。

jssはグローバル変数なのでこの場合たとえ<a class=Controls href="#" onClick="javascript:control('B');">もどる</a>
のリンクをクリックして関数controlを呼び出しても最初に入れた1でしかないのです:

return jss;
の時点でアラートなどしてjssに代入された数値を見てみると確かに処理された数値が入っているのですが関数の外からは処理した数値が受け取れません;

document.writeは使わなくても関数で処理された数値さえ受け取れたらいいです。

ただしここに分岐をいれてボタン画像のリンクの表示をしたいので単品のタグをいれるわけにもいかず。。

根本的に考え直したいところなんですが、実はphpやらデータベースやらなにやら絡んだ長いプログラムの一部で気軽に構成を変えるわけにもいかず。。。

八方ふさがりです;

3   名前: NullPo : 2007/02/06(火) 14:35  ID:yHkAvB4J sub-.G
>>2
何を言っているのかまったくわからない。

> document.write(ここで受け取ったjssの値を表示させたい);
ここではjssの値は確かに1なのだから、1が出力されるのはあたりまえですよね。
contorolを呼び出したときのjssの値を知りたいのなら、contorol関数の内部でjssの値を取り出せばいいだけの話。

> ただしここに分岐をいれてボタン画像のリンクの表示をしたいので単品のタグをいれるわけにもいかず。。
???
文章の意味がまったく理解できません。><

4   名前: 匿名 : 2007/02/06(火) 14:35  ID:/sMf8B64 sub-kJ
>>2
用語・考え方のあらゆる面で混乱しているので、まずは落ち着いて、変数と関数の解説をもう一度読んでみてはどうか。と言うより、むしろ HTML を理解していない気がするが。

・最初に HTML が読み込まれ、script 要素内も読み込まれる。このとき document.write() が実行され、この位置(head 要素内!!)にこの時点の jss の値(すなわち 1)が出力される。

・onclick の文脈は、control 関数を呼んで終了する。

onclick の文脈内からは、document.write() は見えないし、実行するきっかけもない。ならば、jss の値を表示する関数を作成して、onclick の文脈内で呼び出せば良い。

あるいは、>>3 の通り、control 関数の中で、jss の値を表示する関数を呼び出しても良い。文脈は、JavaScript を理解する上で大切な概念だ(実行コンテキスト)。


なお、onclick 内で javascript: を書く必要はない。むしろ、IE で誤作動する可能性もある有害な書き方だ。script 要素の language 属性といい、現在(理由もなく)こんな書き方をしている解説書は今すぐ焼き捨てて良い。

5   名前: mek : 2007/02/06(火) 14:35  ID:rs.fBvgQ sub-Ke
language 属性が古いのとはわかってます。
ソース自体は古くからあるものをコピペしただけのものなのでそこはおいておいて下さい。


phpで言えば

<?php
$query = pg_exec($con, "SELECT * FROM master_table where id = $_GET[id] ");
$max = pg_numrows($query);
$array = pg_fetch_array($query);

$shop_query = pg_exec($con, "SELECT * FROM master_table where cmpnyid = $array[cmpnyid]");
$shop_array = pg_fetch_array($shop_query);

$pic = explode("<>",$array[list]);
$count_pic =count($pic);



if($_GET[page] == "" ){
$page = 1;
}else{
$page = $_GET[page];
}

$pic_max = 0;
for($ppp=0 ;$ppp < $count_pic; $ppp ++){

if($pic[$ppp]=="1"){$pic_max += 1;}
}

$pic_max --;

$ch_pick = 0;
for($cnt_pic=1;$cnt_pic<=$pic_max;$cnt_pic++){

if($pic[$cnt_pic] == "1"){
$ch_pick ++;

$picture[$ch_pick] = "/".$shop_array[cmpny_dir]."/".$array[goodsname_alph]."/list".$cnt_pic.".jpg";


}
}


?>
のような形でデータをひきだして画像を見せるページに




if($_GET[page] == "" ){
$page = 1;
}else{
$page = $_GET[page];
}

$pic_max = 0;
for($ppp=0 ;$ppp < $count_pic; $ppp ++){

if($pic[$ppp]=="1"){$pic_max += 1;}
}

$pic_max --;

$ch_pick = 0;
for($cnt_pic=1;$cnt_pic<=$pic_max;$cnt_pic++){

if($pic[$cnt_pic] == "1"){
$ch_pick ++;

$picture[$ch_pick] = "/".$shop_array[cmpny_dir]."/".$array[goodsname_alph]."/list".$cnt_pic.".jpg";


}
}


?>
ように商品画像を見せる「次へ」「前へ」というボタンの制御をしたとすると
一枚目の時はボタンを消すというようなことが容易に可能です。

これをjavscriptでするにはどうすればいいかという質問だったのですが…
javascriptに関しては始めてまだ数日ですので混乱しているところは多々あるとは思いますが、htmlのほうは大丈夫だと思います。



6   名前: m035 ◆Wpzr1YKOiq : 2007/02/06(火) 14:35  [URL]  ID:oKLCBUv2 sub-1h
>>5
この場合はカウンタが1スタートのようなのでjss>1の時だけ戻ればいいと思います。
(これは>>0の関数controlのif文に条件を付加すればいいでしょう)
表示/非表示に関してはCSSにクラスを用意してclassNameを変更か、styleプロパティから直接値を変更して制御すればよろしいかと。

#以下余談
この場合ですと、たとえばページをリロードorブックマークから参照すると何ページ目を表示していたかの情報は保持されません(urlに何らかの方法で付加すれば再現できますけれど)。
それと、画像のurlをDBから引き出すのなら、直接CGIで叩いたほうが早そうです。
どのみち、商業的なページの重要な部分にJavaScriptを使うのはお粗末でしょうから、CGIが使えるなら、それに越したことはないと思います……。

7   名前: mek : 2007/02/06(火) 14:35  ID:1W/isGOX sub-Ds
ありがとうございます

何か糸口が見えてきた感じがします。

もう少しがんばってみます!

画像のURLは画像に番号をふるだけでID名を画像名にしています。
都合によりどうしてもIEで見たときのみIEでしか使えないような画像変更時の特殊効果をつけたかったのでこのような形になってしまいました。


8   名前: mek : 2007/02/06(火) 14:35  ID:rs.fBvgQ sub-Ke
動きました!!


結局
document.getElementById('idname').innerHTML
を使うことで簡単に関数の中からhtmlのほうを制御できました。


ご意見ありがとうございました。


一覧へ戻る