アプリ版:「スタンプのみでお礼する」機能のリリースについて

javascript初心者です。

↓下記のように画像がsetTimeoutで切り替わるスクリプトを書いているのですが、
http://foofoo77.web.fc2.com/imagechange/index6b. …
このページの記述では、後読みの方の右側は動いているのですが、左側は動きません。
この処理を同一ページ内の二箇所でしたいのですが、どのようにすればいいでしょうか?


制約としては
二箇所を同じ関数を使ってそれぞれ違う引数を与えるのみで動かさなければなりません。
画像を変更する要素のidの値を引数としています。


同一関数を使って二箇所を処理するのは無理なのでしょうか?
ソースは下記のようになります(上部URLと同じものです)。
お分かりになる方いらっしゃいましたら、ご回答よろしくお願いいたします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>一定時間で変わる画像</title>

<script type="text/javascript">
<!--
//画像プリロード
var j=1;


function preLoad(ch) {
c = ch;
animeImg = new Array();
for (i=1;i<6;i++){
animeImg[i]=new Image();
animeImg[i].src="images/"+c + i + ".gif";
};
}





//時間制御
wait = new Array(
3000,
3000,
3000,
500,
500,
500,
500,
500,
3000
);

var fnum=0;

//表示画像制御
function change(ch) {


var obj = document.getElementById(ch);
obj.src=animeImg[j].src;

j++;

if (j>5){
j=1;
}



if(fnum<4){
fnum++;
}
else {
fnum=0;
}

wtime=wait[fnum];
//console.log(wtime);

setTimeout("change(b)",wtime);

b = ch;
}



//-->
</script>

</head>

<body>
<img src="images/image1.gif" name="animation" height="500" width="500" id="bb">
<script type="text/javascript">

preLoad('image');
change('bb');

</script>


<img src="images/imageb1.gif" name="animation" height="500" width="500" id="cc">
<script type="text/javascript">

preLoad('imageb');
change('cc');

</script>

</body>
</html>

A 回答 (2件)

質問のソースコードがなぜ動かないのかはコードを比較して判断頂くとして。



この場合、カウンタ変数(j, fnum)を共有する、とちと面倒なことになりますよね。
与えられた引数(id)を使って各々にカウンタ変数(プロパティ)を持たせてやればいいんじゃないでしょうか。


var animeImg = {};
//画像プリロード
function preLoad(ch) {
 var img;
 for (var i = 0; i < 5; i++) {
  img = new Image();
  img.src = "images/" + ch + i + ".gif"; // 0 ~ 4.gif(0 から始まる数値に変更しています)
 }
 // 与えられた引数を使いカウンタ用プロパティを設定
 animeImg[ch] = { j: 0, fnum: 0 };
}

//時間制御
var wait = new Array( 3000, 3000, 3000, 500, 500, 500, 500, 500, 3000 );

//表示画像制御
function change(ch) {
 var obj = document.getElementById(ch);
 var data = animeImg[ch];
 obj.src = "images/" + ch + data.j + ".gif";
 data.j++;
 if (data.j > 4) {
  data.j = 0;
 }
 if (data.fnum < 4) {
  data.fnum++;
 } else {
  data.fnum = 0;
 }
 var wtime = wait[data.fnum];
 //console.log(wtime);
 setTimeout(function() { change(ch); }, wtime);
}


<img src="images/image0.gif" id="image">
<script type="text/javascript">
preLoad('image');
change('image');
</script>

<img src="images/imageb0.gif" id="imageb">
<script type="text/javascript">
preLoad('imageb');
change('imageb');
</script>
    • good
    • 0
この回答へのお礼

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

教えていただいたソースを元にして書いてみましたら、ばっちり希望通りの挙動をしました。
与えた引数の各々に対してカウンタ変数を持たせなければいけなかったのですね。
書き方などを含め、大変参考になりました。

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

お礼日時:2010/12/31 16:10

getElementByIdを使われていますが、全てのDOMの読み込みが終わらない段階で実行されているため、期待した順番通りに処理がされていないのだと思います。


onload後に実行すれば動きませんか?

window.onload=function(){
preLoad('image');
change('bb');
preLoad('imageb');
change('cc');
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
window.onloadで試してみたのですがうまくいきませんでした。
でも参考になりました。
ありがとうございます。

お礼日時:2010/12/31 16:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!