
HTMLページで、javascriptを使ってそのページにアクセスするたびに、画像が変更させているのですが、ときどき画像が表示されません。
ソースは下記です。
画像が落ちないようにする方法はないのでしょうか?
宜しくお願いします。
<script type="text/javascript"><!--
var imglist2 = [
[ "topimg/top-e001.jpg", "http://www.~.html" , "○○○"] ,
[ "topimg/top-e002.jpg", "http://www.~.html" , "○○○"] ,
[ "topimg/top-e003.jpg", "http://www.~.html" , "○○○"] ,
];
function RandomImageLink2() {
var selectnum = Math.floor(Math.random() * imglist2.length);
var output =
'<a href="' + imglist2[selectnum][1] + '" target="_blank">' +
'<img src="' + imglist2[selectnum][0] + '"' +
' alt="' + imglist2[selectnum][2] + '">' +
'</a>';
document.write(output);
}
//--></script>
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>誤動作の原因
“imglist2.length”の戻り値を、ちゃんと複数エンジンで検証してみました。
・IE(Trident) … 4
・Gecko … 3
・Webkit … 3
以上の様な戻り値でした。自分は普段からChrome1択だったので、ちょっと盲点でした!
>スクリプトエンジンによって違いがある
確かにNo.1回答者さんの仰る様に、末尾にコンマ( , )がある場合。中身が無くてもTrident系、つまりIEは配列の要素があるとカウントして、lengthの戻り値を返してしまうみたいです。
このため、IE系では乱数値が 0~3 の範囲を取るので。“imglist2[3][n] ”という存在しない配列の要素を参照するためのバグだと思われます。
なのでNo.1回答者さんの仰る様に、
>var max_num = imglist.length -1;
~としてしまうと、逆にIE系以外では最後の配列要素が無視されてしまうので。それはそれでまた意図した動作にならないので、もし自分の例文を用いる場合は後ろの“-1”の部分を削除して使って下さい!
P.S.
自分が math.floor関数の挙動を勘違いしていました(四捨五入的な挙動だとばかり…)!
なのでNo.1回答者さんの仰る様に、math.random関数の取る値の範囲は、0~0.99999...なので。math.floor関数で、小数点以下が切り捨てられるので、配列のlength値をそのまま代入して問題無いです(配列内の末尾のコンマさえ無ければ)。
ですので、とりあえずは質問者さんの例文のまま、配列内の末尾のコンマさえ削除して置けば。一応は問題無く動作するはずです。が、不測の事態に備えて、HTMLでimgタグであらかじめ代替画像を表示しておく~という見解は、自分もNo.1回答者さんと同様です。
No.3
- 回答日時:
#1です。
>例文のスクリプトの誤動作の原因は、
>Math.random() * imglist2.length
これが問題とは思えません。
ご提示のスクリプトでは
Math.floor(Math.random() * imglist2.length)
となっていますので、配列の引数を超える可能性があるとするとMath.random()が1を返す時だけですが、基本的に 0 <= Math.random() < 1 のはずなので、そのようなことは起こりません。(もしかするとスクリプトエンジンによって違いがあるのかも知れませんが…)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
逆に、1を減じてしまうと、配列の最後のものが選択(使用)されることがなくなってしまいます。
それよりも、データ配列の最後のカンマ
var imglist2 = [
[ ・・・・・・] ,
[ ・・・・・・] ,
[ ・・・・・・] , //←ここのカンマ
];
のほうがエラーの原因となる可能性が高いと言えるでしょう(投稿時のタイポだと解釈しましたが)。
No.2
- 回答日時:
とりあえずこんな感じで処理しておけば、JavaScriptが上手く動作しなかった場合にも保険がかかります。
━ JavaScript部分 ━━━━━━━━━━━━━━━━━━━━━━━━
<script type="text/javascript"><!--
var imglist = [
['./topimg/top-e001.jpg', 'http://example.com/sample-001.html', 'あああ'],
['./topimg/top-e002.jpg', 'http://example.com/sample-001.html', 'いいい'],
['./topimg/top-e003.jpg', 'http://example.com/sample-001.html', 'ううう']
];
window.onload = function(){
if ( document.getElementById('img_change') ){
var max_num = imglist.length -1;
var rand_num = Math.floor( Math.random()*max_num );
var my_output = '<a href="'+ imglist[rand_num][1] +'"><img src="'+ imglist[rand_num][0] +'" alt="'+ imglist[rand_num][2] +'"></a>';
document.getElementById('img_change').innerHTML = my_output;
}
};
//--></script>
━ JavaScript部分 ━━━━━━━━━━━━━━━━━━━━━━━━
~上記の様なJavaScriptを記述して置いて、HTML本体の画像を表示する部分を…
<div id="img_change"><img src="./topimg/top-e001.jpg"></div>
~と言う風にして置きます。これで仮にブラウザのver.違いとかで、うまくJavaScriptが動作しなかったとしても、とりあえずはHTMLで記述された画像が表示されます。注意すべき点は、DIVタグのid属性は、必ず固有名詞というか、そのページ内で同じid名は1個だけにしないとバグります。
尚、サンプルは適当に変数名とか弄ってありますので。そちらの環境に合わせて、直して使って下さい。
P.S.
例文のスクリプトの誤動作の原因は、
Math.random() * imglist2.length
~の部分です。
“length”で配列の数を求めて、必要な乱数の上限値に設定するという考え方までは良いのですが。JavaScriptでは配列の値の数は1以上の整数値で返されるのに対し。
実際の配列の開始番号は“0”から始まるため、例文の配列の引数の範囲は 0~2 の範囲を取るのに対し。実際に生成された乱数の値は、0~3 の範囲を取るためです。この場合、乱数の値が 3 の時は、存在しない配列の値を参照するため、エラーになり何も表示されなくなります。
No.1
- 回答日時:
>ときどき画像が表示されません。
どの様なときに表示されないのか不明なので、原因がわかりませんが、
アドレス等に間違いがないのであれば…
>画像が落ちないようにする方法はないのでしょうか?
デフォルトとして、HTMLソース内にあらかじめ
<a href="~~" target="_blank"><img src="topimg/top-e001.jpg" alt="○○"></a>
のような記述をしておけば、仮にスクリプトがオフになっている場合などでも表示できます。
その上で、スクリプトで「上記のリンク先や画像のアドレスなどを入れ変える」ようにしておけばよいのではないでしょうか?
(現状はdocument.write()で直接出力していますが…)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
助けてください‼︎ javascriptで...
-
雪を降らせるみたいな、ゆらゆ...
-
jspからjavascriptの変数引継ぎ
-
同じIDで定義した要素の配列を...
-
JavaScriptで文字列の置き換え
-
IE6.0でのオブジェクト座標の動...
-
サブウインドウから親ウインド...
-
Latexに関する質問です。
-
JavaScript window.openで開く...
-
document.onkeydownについて
-
<a>タグのテキストを取得
-
複数のRSSを取得した項目を別々...
-
MFCのキャプション変更
-
Vb.netのグローバル変数の宣言...
-
XMLの空白要素をJavas...
-
ASP.NET MVCでObjectをjsに渡す
-
jQuery の each を使いたいので...
-
CSSをあとから読み込みたい。
-
WordPressのコンタクトフォーム...
-
ifreamをリロードしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
undefinedを表示させない方法は...
-
二次元配列を使って順位をだす...
-
javascriptで2つのArrayの...
-
複数のフィードの読み込みが日...
-
二次元配列の全要素の全要素を...
-
javascriptを用いて作成された...
-
("Scripting.Dictionary")につ...
-
javascriptで行を抽出したいです。
-
JavaScriptで簡単なクイズを作...
-
1から20までの整数から、重複な...
-
javascriptついてお聞きします。
-
ぷよぷよの消去アルゴリズムが...
-
配列を作って総当たりで距離を...
-
配列の数ではなく、文字列の長...
-
jQueryで文字数カウンタ(複数...
-
jQuery text()で、<br>タグも取...
おすすめ情報