私はやってみたいです:
$("img").bind('load', function() {
// do stuff
});
ただし、イメージがキャッシュから読み込まれると、loadイベントは発生しません。jQueryドキュメントはこれを修正するプラグインを提案していますが、機能しません
私はやってみたいです:
$("img").bind('load', function() {
// do stuff
});
ただし、イメージがキャッシュから読み込まれると、loadイベントは発生しません。jQueryドキュメントはこれを修正するプラグインを提案していますが、機能しません
回答:
場合はsrc
、すでに設定されているあなたも、バインドイベントハンドラを取得する前に、そのイベントは、キャッシュされた場合には、発射されます。これを修正するには、次の.complete
ように、off に基づいてイベントのチェックとトリガーをループすることができます。
$("img").one("load", function() {
// do stuff
}).each(function() {
if(this.complete) {
$(this).load(); // For jQuery < 3.0
// $(this).trigger('load'); // For jQuery >= 3.0
}
});
setTimeout(function(){//do stuff},0)
'load'関数内にを追加します。0を指定すると、ブラウザーシステム(DOM)に1ティックが追加され、すべてが適切に更新されるようになります。
.load()
はイベントをトリガーせず、1つの必須引数があるため、.trigger("load")
代わりに使用します
DOM以外の画像オブジェクトに再読み込みすることを提案できますか?キャッシュされている場合、これにはまったく時間がかからず、onloadは引き続き起動します。キャッシュされていない場合は、画像が読み込まれるときにonloadを起動します。これは、画像のDOMバージョンの読み込みが完了するのと同時に行う必要があります。
JavaScript:
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.src = $('#img').attr('src') ;
tmpImg.onload = function() {
// Run onload code.
} ;
}) ;
更新(複数の画像を処理し、正しい順序でonload添付ファイルを添付):
$(document).ready(function() {
var imageLoaded = function() {
// Run onload code.
}
$('#img').each(function() {
var tmpImg = new Image() ;
tmpImg.onload = imageLoaded ;
tmpImg.src = $(this).attr('src') ;
}) ;
}) ;
load
ハンドラーをアタッチするようにしてください。これも機能しませんが、1つのイメージの場合、OPsコードは多くの場合に機能します:)
#img
要素セレクターではないIDです:)また、this.src
機能します。不要な場所でjQueryを使用する必要はありません。
imageLoaded
tmp.onload = imageLoaded.bind(this)
私の簡単な解決策は、外部プラグインを必要とせず、一般的なケースでは十分です:
/**
* Trigger a callback when the selected images are loaded:
* @param {String} selector
* @param {Function} callback
*/
var onImgLoad = function(selector, callback){
$(selector).each(function(){
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
});
};
次のように使用します。
onImgLoad('img', function(){
// do stuff
});
たとえば、ロード時に画像をフェードインするには、次のようにします。
$('img').hide();
onImgLoad('img', function(){
$(this).fadeIn(700);
});
あるいは、jqueryプラグインのようなアプローチを好む場合:
/**
* Trigger a callback when 'this' image is loaded:
* @param {Function} callback
*/
(function($){
$.fn.imgLoad = function(callback) {
return this.each(function() {
if (callback) {
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
}
});
};
})(jQuery);
次のように使用します。
$('img').imgLoad(function(){
// do stuff
});
例えば:
$('img').hide().imgLoad(function(){
$(this).fadeIn(700);
});
width
、のmax-height
ままheight:auto
にします。多くの場合、画像をストレッチする必要がある場合にのみ、幅と高さの両方を設定する必要があります。より堅牢なソリューションを実現するには、ImagesLoadedの
あなたは本当にそれをjQueryで行う必要がありますか?onload
イベントを画像に直接添付することもできます。
<img src="/path/to/image.jpg" onload="doStuff(this);" />
キャッシュからであってもなくても、画像が読み込まれるたびに起動します。
onload
画像がキャッシュから2回目に読み込まれたときにハンドラーが起動しますか?
読み込みエラーをサポートするこのコードを使用することもできます:
$("img").on('load', function() {
// do stuff on success
})
.on('error', function() {
// do stuff on smth wrong (error 404, etc.)
})
.each(function() {
if(this.complete) {
$(this).load();
} else if(this.error) {
$(this).error();
}
});
load
最初にハンドラを設定してから、後でeach
関数でそれを呼び出すことが重要だと思います。
私は自分自身でこの問題を抱えていて、キャッシュを殺したりプラグインをダウンロードしたりすることを含まない解決策をどこでも探しました。
私はこのスレッドをすぐには見ていなかったので、代わりに興味深い修正である何かを見つけました(ここに投稿する価値があると思います)。
$('.image').load(function(){
// stuff
}).attr('src', 'new_src');
私は実際にここのコメントからこのアイデアを得ました:http : //www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
なぜ機能するのかはわかりませんが、IE7でテストしたところ、機能する前にどこで問題が発生しましたか。
それが役に立てば幸い、
受け入れられた答えは実際に理由を説明しています:
srcがすでに設定されている場合、イベントハンドラーがバインドされる前に、ケース内のキャッシュでイベントが発生しています。
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
元のソースをリセットするために使用しました。
jQueryを使用して画像のsrcで新しい画像を生成し、それにロードメソッドを直接割り当てることにより、jQueryが新しい画像の生成を完了したときにloadメソッドが正常に呼び出されます。これはIE 8、9、10で私のために働いています
$('<img />', {
"src": $("#img").attr("src")
}).load(function(){
// Do something
});
私が見つけた解決策https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (このコードはコメントから直接取得されました)
var photo = document.getElementById('image_id');
var img = new Image();
img.addEventListener('load', myFunction, false);
img.src = 'http://newimgsource.jpg';
photo.src = img.src;
GUSの例の変更:
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.onload = function() {
// Run onload code.
} ;
tmpImg.src = $('#img').attr('src');
})
onloadの前後にソースを設定します。
src
アタッチする前にを設定する必要onload
はありません。その後で十分です。
imgオブジェクトが定義された後、src引数を別の行に再度追加するだけです。これはIEをだましてlad-eventをトリガーさせます。醜いですが、これは私がこれまでに見つけた最も簡単な回避策です。
jQuery('<img/>', {
src: url,
id: 'whatever'
})
.load(function() {
})
.appendTo('#someelement');
$('#whatever').attr('src', url); // trigger .load on IE
あなたがこのようにしたいのであれば、私はあなたに小さなヒントを与えることができます:
<div style="position:relative;width:100px;height:100px">
<img src="loading.jpg" style='position:absolute;width:100px;height:100px;z-index:0'/>
<img onLoad="$(this).fadeIn('normal').siblings('img').fadeOut('normal')" src="picture.jpg" style="display:none;position:absolute;width:100px;height:100px;z-index:1"/>
</div>
ブラウザが画像をキャッシュするときにこれを行うと、常にimgが表示されますが、実際の画像の下でimgをロードすることは問題ありません。
純粋なCSSソリューションが必要な場合、このトリックは非常にうまく機能します。変換オブジェクトを使用してください。これは、画像がキャッシュされているかどうかに関係なく機能します。
CSS:
.main_container{
position: relative;
width: 500px;
height: 300px;
background-color: #cccccc;
}
.center_horizontally{
position: absolute;
width: 100px;
height: 100px;
background-color: green;
left: 50%;
top: 0;
transform: translate(-50%,0);
}
.center_vertically{
position: absolute;
top: 50%;
left: 0;
width: 100px;
height: 100px;
background-color: blue;
transform: translate(0,-50%);
}
.center{
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
background-color: red;
transform: translate(-50%,-50%);
}
HTML:
<div class="main_container">
<div class="center_horizontally"></div>
<div class="center_vertically"></div>
<div class="center"></div>
</div>
</div