javascript初心者です。
数日前にこちらで教えていただきまして、
画像をプリロードをして、画像がsetTimeoutで切り替わる動きをするスクリプト(任意の引数を与えた場所を処理する関数)ができたのですが、
IEで見たときにsetTimeoutのタイミングで毎回、画像読み込みがされているようなのですが(ブラウザの左下に文字が出てきます)
これを解消するにはどうすればいいでしょうか?
二箇所を同じ関数を使ってそれぞれ違う引数の付与でsetTimeoutのタイミングや読み込む画像や場所を変えています。
サンプル↓こちらに上げてあります。
http://foofoo77.web.fc2.com/imagechange/index6g. …
ソースは下記になります(上記と同一のものです)。
<!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 animeImg = {};
//画像プリロード
function preLoad(ch) {
var img;
for (var i = 0; i < 4; i++) {
img = new Image();
img.src = "images/" + ch + i + ".gif"; // 0 ~ 3.gif
}
// 与えられた引数を使いカウンタ用プロパティを設定
animeImg[ch] = { j: 0, fnum: 0 };
}
//時間制御
var wait = new Array( 3000, 500, 3000, 3000);
var wait2 = new Array( 500, 500, 500, 500);
//表示画像制御
function change(ch, time, number) {
var obj = document.getElementById(ch);
var data = animeImg[ch];
obj.src = "images/" + ch + data.j + ".gif";
data.j++;
var Num = number;
if (data.j > Num) {
data.j = 0;
}
if (data.fnum < Num) {
data.fnum++;
} else {
data.fnum = 0;
}
var wtime = time[data.fnum];
setTimeout(function() { change(ch, time, Num); }, wtime);
}
</script>
</head>
<body>
<img src="images/image0.gif" id="image">
<script type="text/javascript">
preLoad('image');
change('image',wait,3);
</script>
<img src="images/imageb0.gif" id="imageb">
<script type="text/javascript">
preLoad('imageb');
change('imageb',wait2,2);
</script>
</body>
</html>
No.2ベストアンサー
- 回答日時:
<!DOCTYPE html>
<title>一定時間で変わる画像</title>
<p><img src="images/image0.gif" id="image"></p>
<p><img src="images/imageb0.gif" id="imageb"></p>
<script>
var makeFileList = function (start, end, path, name, imgType) {
var result = [];
for (; start <= end; start += 1)
result.push (path + '/' + name + start + '.' + imgType);
return result;
};
var imageLoader = function (imageList) {
var result = [];
var i = 0;
var I = imageList.length;
var img;
for (; i < I; i += 1) {
img = new Image;
img.src = imageList[i];
result.push (img);
}
return result;
};
var Changer = function (target, image, interval) {
var max = image.length;
var cnt = 0;
var view = target.ownerDocument./*@cc_on @if (1) parentWindow @else@*/ defaultView /*@end@*/;
view.setTimeout (function () {
target.src = image[cnt].src;
cnt = (cnt + 1) % max;
view.setTimeout (arguments.callee, interval[cnt] || 500);
}, interval [0]);
};
//_______________
Changer (
document.getElementById ('image'),
imageLoader (makeFileList (0, 3, 'images', 'image', 'gif')),
[ 3000, 500, 3000, 3000 ]
);
Changer (
document.getElementById ('imageb'),
imageLoader (makeFileList (0, 2, 'images', 'imageb', 'gif')),
[ 500, 500, 500 ]
);
</script>
みじかく かけるものを ながくしてかいてみた。
Changer のなかが、いわゆるくろーじゃーになっているので、へんすうのほぞんがゆうこうです
data.j とか data.form とかがいらない。
こうやってかけば、つぎのひとが、おぶじぇくとしこうでかくかも?
と、ふってみる。
No.5
- 回答日時:
ローカル環境でしかテストしてませんが…
確かにIE(6)では毎回読んでるみたい。「ページのバージョンを確認しない」にしてもダメみたいですね。(他に設定があったかなぁ…)
srcを書換えるから読みに行くのかと、nodeをcloneして要素ごと入替える方法にしてみたけれどダメ。
#1様の提案に近いけど、preloadの替わりにHTMLにpresetして、display属性で制御する方法にしてみたら、さずがに読みにはいかないみたい。
でも、こんなことする意味があるのかないのか…
多少、オブジェクトっぽくしてみましたが、長くなるばかり?(入力値のチェックは一切省略の手抜き。全角空白は半角に)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head><title>sample</title>
<style>
img { width:400px; height:400px; }
</style>
</head>
<body>
<div>
<img src="images/image0.gif" id="image" alt="">
<img src="images/imageb0.gif" id="imageb" alt="">
</div>
<script type="text/javascript">
<!--
var Changer = function(){
this.init.apply(this, arguments);
}
Changer.prototype = {
start: function(){
if(this.max && !this.timerId) this.changer();
},
stop: function(){
if(this.timerId){
clearTimeout(this.timerId);
this.timerId = null;
}
},
changer: function(){
var obj = this, fn = arguments.callee;
obj.images[obj.counter++].style.display = "none";
obj.counter %= obj.max;
obj.images[obj.counter].style.display = "";
obj.timerId = setTimeout(function(){
fn.call(obj);
}, obj.parameter.intervals[obj.counter]);
},
preSet: function(e, p){
var i, o, pnt = e.parentNode, img = e.cloneNode(false);
img.removeAttribute("id");
img.style.display = "none";
this.images = [];
for (i=p.start; i<=p.end; i++){
o = img.cloneNode(false);
o.src = encodeURI(p.path + i + "." + p.extention);
if (i != p.start) pnt.insertBefore(o, e);
this.images.push(o);
}
e.src = this.images[0].src;
this.images[0] = e;
this.max = this.images.length;
img = null;
},
init: function(p){
if(!p || !p.id) return;
var e = document.getElementById(p.id);
if(!e || e.nodeName != "IMG") return
this.parameter = p;
// this.preLoad(p);
this.preSet(e, p);
this.counter = this.max -1;
this.timerId = null;
this.start();
}
}
new Changer({
id:"image",
path:"images/image",
extention:"gif",
start:0,
end:3,
intervals:[3000, 500, 3000, 3000]
});
//-->
</script>
</body>
</html>
No.4
- 回答日時:
No.3の回答者です。
IEで毎回、画像読み込みがされているように見えたのは思い違いでした。
ちゃんと画像が存在すれば、何回もロードしません。
前のコードをもうちょっと整理して、オレオレの自動ファイル名リスト生成機能を使わなくても使えるようにして、さらにアニメーション効果もつけられるようにしたjQuery用プラグインにしました。↓に置いておきました。
https://gist.github.com/777400#comments
※動作のためには、途、jQuery本体
http://jquery.com/
と「jquery.timers.js」が必要です。
http://plugins.jquery.com/node/547/release
※イージング効果を使う場合は
「jquery.easing.1.3.js」も必要です。
http://gsgd.co.uk/sandbox/jquery/easing/
No.3
- 回答日時:
おぶじぇくとしこうというより、jQueryのプラグインにしてみた。
※イージング処理(jQuery)も後から追加できるかも
(function($){
var methods = {
init : function(options){
var settings = {
start:0,
end:0,
path:null,
name:null,
imgType:null
};
var imageSrcList = [];
var imageList = [];
if(options) $.extend(settings,options);
for (; settings.start <= settings.end; settings.start += 1)
imageSrcList.push (settings.path + '/'
+ settings.name
+ settings.start + '.'
+ settings.imgType);
var I = imageSrcList.length;
var img;
for(var i=0;i<I;i+=1){
imageList.push($('<img src="' + imageSrcList[i] +'">'));
}
var $this = $(this);
$(this).data("imageList",{
list:imageList
});
},
change : function(interval,easing){
var max = this.data("imageList").list.length;
var cnt = 0;
var easing = easing;
var $this = $(this);
if(!easing){
window.setTimeout(function(){
$this.attr("src",$this.data("imageList").list[cnt].attr("src"));
cnt = (cnt + 1) % max;
window.setTimeout(arguments.callee,interval[cnt] || 500);
},interval[0]);
}else{
window.setTimeout(function(){
$this.attr("src",$this.data("imageList").list[cnt].attr("src")).animate(
{opacity:"toggle"},"slow",easing);
cnt = (cnt + 1) % max;
window.setTimeout(arguments.callee,interval[cnt] || 500);
},interval[0]);
}
}
};
$.fn.Changer = function(method){
if(methods[method]){
return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
}else if(typeof method === 'object' || ! method){
return methods.init.apply(this,arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.Changer' );
}
};
})(jQuery);
$(function(){
$('#image').Changer({start:0,end:3,path:'images',name:'image',imgType:'gif'});
$('#image').Changer("change",[3000,500,3000,3000]);
});
※おや!肝心のイメージプレロードが効いてないぞ。毎回、画像読み込みがされている。
だめだめだあ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jQueryで画像を重ねる
-
window.openで値の渡し方を教え...
-
HPB_SCRIPT_ROV_50
-
戻り読みの代わりとなる正規表...
-
画像と文字を同時に切り替えたい
-
商品回転画像の作成方法
-
画像の入れ替え
-
【javascript】ロールオーバー...
-
アンケート型のホームページの...
-
一定時間で画像を変更するスク...
-
スマートな外部javaでロールオ...
-
画像の座標位置取得
-
MAX関数を使ってからLEFT JOIN...
-
JSPでの画像ファイル表示
-
jqueryのsortableで一部ソート...
-
c++std::string型をTCHARに変換...
-
jspでcssが読み込めない
-
javascriptテキストBOX色を元に...
-
JavaScriptで、?マークとコロ...
-
画像ランダム表示、しかしダブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.openで値の渡し方を教え...
-
jQueryでサーバー上のファイル...
-
【jQuery】複数の画像の読み込...
-
複数のバナーをリロードする度...
-
jQueryで画像を重ねる
-
一定時間ごとにgif画像の切...
-
画像をクリックすると別ウイン...
-
JavaScriptで画面サイズによっ...
-
HTMLページ内のタグに対しての...
-
HPに複数の画像をクリックで切...
-
【javascript】ロールオーバー...
-
画像の入れ替え
-
javascriptによるランダム画像...
-
画像と文字を同時に切り替えたい
-
JavaScriptで画像置換えてクリ...
-
連続したURLへのwindow.openの...
-
リンク切の場合リンクしない
-
戻り読みの代わりとなる正規表...
-
複数のボールの落下、バウンド...
-
<img>タグの alt= の値をキャプ...
おすすめ情報