スライドショーを作りたい

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



0   名前: aki : 2006/03/10 21:48
スライドショーをjavascriptで作ろうと思ったのですが、
行き詰まってしまいました…。
前の画像、次の画像へのボタンがあり下に画像が表示される、
というシンプルなものを作りたかったんですが、
画像が697枚と多いため、記事No.242の様に画像の名前を書きだすわけにいかず、
作ったものが以下です。


<SCRIPT type="text/javascript" language="JavaScript">
<!--
iIndexMin = 1 ; // 画像の最小番号
iIndexMax = 697 ; // 画像の最大番号
iIndex = 1 ; // 最初に表示する画像の番号
Path = '../Photo/party/org/' ; // 画像ファイルへの相対パス
strImgExtn = '.jpg' ; // 画像ファイルの拡張子
zero = "000";

// 次の画像を表示する
function NextImg( strImgName )
{
( iIndex < iIndexMax ) ? iIndex++ : iIndex = iIndexMin ;
DispImg( strImgName ) ;
if((iIndex < 10) || (iIndex == 0)){zero = "000"}
else if(iIndex < 100){ zero = "00"}
else{zero = "0"}
}

// 前の画像を表示する
function PrevImg( strImgName )
{
( iIndex > iIndexMin ) ? iIndex-- : iIndex = iIndexMax ;
DispImg( strImgName ) ;
if((iIndex < 10) || (iIndex == 0)){zero = "000"}
else if(iIndex < 100){ zero = "00"}
else{zero = "0"}
}

// 画像を表示する
function DispImg( strImgName )
{
document.images[ strImgName ].src = Path + strImgName + zero + iIndex.toString() + strImgExtn ;
}
//-->
</SCRIPT>

<INPUT Class="button" type="button" value="< 前の画像" onClick="PrevImg( 'par' )">
<INPUT Class="button" type="button" value="次の画像 >" onClick="NextImg( 'par' )">
<br>
<IMG name="par" border="0" src="../Photo/party/org/par0001.jpg" Hspace="1" Vspace="5">


//////////////////////
画像の名前が「par0001.jpg」〜「par0697.jpg」なので
if文でparの後ろの0の数を調節したつもりなんですが…
次の画像へボタンで「0009」から「0010」に移動すると
if文が適用されていないのか「00010」となってしまい、画像が表示されません。
「00010」の表示されない状態から次の画像へボタンを押すと「0011」となり画像が表示され、
そこから前の画像へボタンを押すと、今度は問題なく「0010」となる、んですが
「0010」から前の画像へボタンで「0009」へ戻ろうとすると「009」となり、画像が表示されません。
「0099」から「0100」、「0100」から「0099」の場合も同様です。

if文の書き方がおかしいのか、このjavascriptの書き方自体そもそもいけないのか…。
何となく理解している…程度の知識なので判断がつきません;
長々と書いてしまいましたが何方かご回答の程、よろしくお願いします。

1   名前: m035 : 2006/03/10 21:48  [URL
String(10000+数値).substr(1)
で開いている部分を0で埋めた文字列が作れます。
数値の部分に適当な変数を当てはめてください。

2   名前: 匿名希望 : 2006/03/10 21:48
>>1
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/ecma262r3/B_Compatibility.html
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/ecma262r3/15-5_String_Objects.html#section-15.5.4.15

3   名前: aki : 2006/03/10 21:48
m035さん回答ありがとうございます。

String(10000+数値).substr(1)
というのは、次の画面を表示するに入れる場合だと


// 次の画像を表示する
function NextImg( strImgName )
{
( iIndex < iIndexMax ) ? iIndex++ : iIndex = iIndexMin ;
DispImg( strImgName ) ;
if((iIndex < 10){zero = "「ここ」"}
else if(iIndex < 100){ zero = "「ここ」"}
else{zero = "「ここ」"}
}


「ここ」に入れるんでしょうか??
申し訳ないことにString自体をよく理解していませんorz

ひらいている部分(?ここの言い回しも理解出来てませんすいません…。)
を0で埋めるという事は、 zero を使っているところを全部無くして
zeroの役割(0の数を調節する)もiIndexでやる…という事でしょうか??
わらない事だらけですいません…。回答の程宜しくお願いします…!

4   名前: m035 : 2006/03/10 21:48  [URL
// 次の画像を表示する
function NextImg( strImgName )
{
( iIndex < iIndexMax ) ? iIndex++ : iIndex = iIndexMin ;
DispImg( strImgName ) ;
}
// 画像を表示する
function DispImg( strImgName )
{
document.images[ strImgName ].src = Path + strImgName + String(10000+iIndex).substr(1) + strImgExtn ;
}

と、すれば出来るはず。


>>2
いまいち理解できないんですが・・・どこかに不備があったのでしょうか?

5   名前: aki : 2006/03/10 21:48
m035さん回答ありがとうございます。

問題なく画像が表示されるようになりました!!
ありがとうございます!
あれから、自分なりに色々いじっていて解決はしたものの


// 次の画像を表示する
function NextImg( strImgName ){
( iIndex < iIndexMax ) ? iIndex++ : iIndex = iIndexMin ;
if((iIndex < 10) || (iIndex == 0)){
zero = "000";
DispImg( strImgName ) ;
}
else if(iIndex < 100){
zero = "00";
DispImg( strImgName ) ;
}
else{
zero = "0";
DispImg( strImgName ) ;
}
}

という長いif文になってしまいました…orz
やっぱり、浅い知識だけを組み合わせても無駄ばかり付くものですね;
思い切って掲示板に書き込みをして本当によかったです。
勉強になりました。

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

6   名前: Pid : 2006/03/10 21:48
>>4
String.prototype.substr は ECMA 262-3 で廃止されました。今のブラウザ相手ならば,String.prototype.substring か String.prototype.slice の方が良いと思います。

>>5
たとえば,
'0012345'.slice (0, 3) は '001' (0 番目から,3 番目の直前まで)
'0012345'.slice (3) は '2345'(3 番目から最後まで)
'0012345'.slice (-3) は '345'((文字列の長さ - 3) 番目から最後まで)
を返します。

7   名前: m035 : 2006/03/10 21:48  [URL
>>6
あ、そう言うことでしたか・・・了解です。
ありがとうございました。

8   名前: 神崎 : 2006/03/10 21:48
というか、if〜elseとDispImgの順番を変えるだけで良いんじゃないですか?
>>5ではifの中にDispImg()を書かれていますが、やってることは同じですね。

function NextImg( strImgName )
{
( iIndex < iIndexMax ) ? iIndex++ : iIndex = iIndexMin ;
if((iIndex < 10) || (iIndex == 0)){zero = "000"}
else if(iIndex < 100){ zero = "00"}
else{zero = "0"}
DispImg( strImgName ) ;
}

> String(10000+数値).substr(1)
なるほど、これは面白いアイデアですね。
perlやCなどのsprintf()をエミュレートする関数を自作して使っていますが、
簡単な変換ならこの方がよさそうです。
(sprintf()がJavaScriptネイティブでサポートされていない不思議、、、)

9   名前: EinLot : 2006/03/10 21:48
横から質問ですいません。

>>6
Pidさん、
String.prototype.substrのprototypeってなんですか。
オブジェクトのprototypeとおなじですか?
行為う書式でつかうのですか?

10   名前: Pid : 2006/03/10 21:48
>>9
仰る通り,オブジェクトの prototype と同じです。つまり,

  String.prototype.substring

が定義されているからこそ,

  var str = new String ('Mojiretsu'); // あるいはリテラルで 'Mojiretsu'

と String オブジェクトを作成したときに,str に substring 関数が継承され,str.substring (..) として使えるわけです。また,String.prototype.sprintf = ... のようにして,自分でメソッドを拡張することも可能です。


さらに,>>2 のリンク先を見てみると,

| substring 関数は故意に汎用的である。this 値が String オブジェクトであることを要求されない。それゆえ、他の種類のオブジェクトにメソッドとして転用可能である。

とあります。これはどういうことかと言うと,普通,

  var index = 10234;

という Number オブジェクトに substring というメソッドは存在しませんから,

  index.substring (1); // Error

という操作はできません(ですから,>>4 で m035 さんは String オブジェクトに変換なさったわけです)。ところが,

  String.prototype.substring.call (index, 1); // '0234'

のように call や apply で関数を直接呼び出せば,たとえ String オブジェクトでなくても substring を適用させることができるのです。こうした「メソッドの転用」は,たとえば「DOM の NodeList を,Array のように扱いたい」などというときに強力な武器になります。

詳しい議論は,別スレッドで行った方が良いでしょうね。

一覧へ戻る