jQueryを使用して画像を非同期に読み込む


142

jQuery使用してページに外部画像を非同期で読み込みたいのですが、次のことを試しました。

$.ajax({ 
   url: "http://somedomain.com/image.jpg", 
   timeout:5000,
   success: function() {

   },
   error: function(r,x) {

   }
});

しかし、それは常にエラーを返します、このような画像をロードすることさえ可能ですか?

私は.loadメソッドを使用しようとしましたが、それは機能しますが、画像が利用できない場合にタイムアウトを設定する方法がわかりません(404)。これどうやってするの?


私にとってはこの作品:stackoverflow.com/questions/6150289/...
MrRhoads

回答:


199

ajaxは必要ありません。新しい画像要素を作成し、そのソース属性を設定して、読み込みが完了したらドキュメントのどこかに配置できます。

var img = $("<img />").attr('src', 'http://somedomain.com/image.jpg')
    .on('load', function() {
        if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
            alert('broken image!');
        } else {
            $("#something").append(img);
        }
    });

20
タイムアウトと404をどうするか
Arief

1
これでタイムアウトを設定する方法?私はこの方法を試しましたが、どういうわけかページはまだ画像が読み込まれるのを待っています。
Arief

7
ブラウザのタイムライン(Google Chromeの開発ツールのタイムラインなど)を確認すると、DOM要素の作成(DOMに接続しているかどうかに関係なく)があり、そのソースを設定すると、現在のドキュメントのロードに追加されます。リスト-作成された要素がロードされるまで、ページは「ロード」を完了しません。画像が読み込まれるまでwindow.load()が起動しないという意味で、実際のソリューションは非同期イベントではなく、特定のpaintまたはlayout操作を遅延させ、onloadイベントの依存関係を確実に遅延させます。
トムオージェ

2
@TomAuger:では、どうすれば実際に非同期にすることができますか?load()でコードをテストしたところ、非同期ではありません。
basZero

2
@gidzior jqueryを使用してIE8でSRC属性を設定できないため、IE8では機能しません。ここで参照してください。stackoverflow.com/questions/12107487/...
リッチ

78

AJAXを使用する必要がある場合...

onloadハンドラーが適切な選択ではなかったユースケースに遭遇しました。私の場合、JavaScript経由で印刷するとき。したがって、これには実際にAJAXスタイルを使用する2つのオプションがあります。

解決策1

Base64画像データとREST画像サービスを使用します。独自のウェブサービスがある場合は、Base64エンコーディングで画像を提供するJSP / PHP RESTスクリプトを追加できます。さて、それはどのように役立ちますか?画像エンコーディングのクールな新しい構文に出くわしました:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhE..."/>

したがって、Ajaxを使用してImage Base64データをロードし、完了時にBase64データ文字列をイメージに構築できます。とても楽しい :)。画像のエンコードには、このサイトhttp://www.freeformatter.com/base64-encoder.htmlを使用することをお勧めします。

$.ajax({ 
    url : 'BASE64_IMAGE_REST_URL', 
    processData : false,
}).always(function(b64data){
    $("#IMAGE_ID").attr("src", "data:image/png;base64,"+b64data);
});

Solution2:

ブラウザをだましてキャッシュを使用させます。これにより、リソースがブラウザーのキャッシュにあるときに、素晴らしいfadeIn()が得られます。

var url = 'IMAGE_URL';
$.ajax({ 
    url : url, 
    cache: true,
    processData : false,
}).always(function(){
    $("#IMAGE_ID").attr("src", url).fadeIn();
});   

ただし、どちらの方法にも欠点があります。最初の方法は最新のブラウザでのみ機能します。2つ目はパフォーマンスに問題があり、キャッシュの使用方法を前提としています。

乾杯、


1
ブラウザーサポートの現在の状態が受け入れられる場合(caniuse.com/#search=Blob)、データURIの代わりにBlobを使用できます。これは、base64でエンコードされたデータURIを使用するよりもハッキングが少なく感じられ、メモリの無駄も少なくなります(base64はメモリ効率の良い形式ではないため)。後者はおそらく現実の世界ではほとんど問題ではありません。
Mark Amery 2015

11

jQueryを使用すると、「src」属性を「data-src」に変更できます。画像は読み込まれません。ただし、場所はタグとともに保存されます。どちらがいいですか。

<img class="loadlater" data-src="path/to/image.ext"/>

jQueryの単純な部分がdata-srcをsrcにコピーし、必要なときにイメージのロードを開始します。私の場合、ページの読み込みが完了したとき。

$(document).ready(function(){
    $(".loadlater").each(function(index, element){
        $(element).attr("src", $(element).attr("data-src"));
    });
});

jQueryコードは省略できるかもしれませんが、この方法で理解できます。


4
ヒント:あなたが使用している場合はdata-、タグを、それが公正だ経由してアクセスしやすくビット$(element).data('src')の代わりに$(element).attr('data-src')
マキシムKumpan

実際、今日私はjQueryをもう使用しません。しかし、それは個人的な好みの問題であり、構築しているWebサイトの規模によって異なります。しかし、今話題のトピックは「プログレッシブ画像」です。smashingmagazine.com/2018/02/...
htho

8
$(<img />).attr('src','http://somedomain.com/image.jpg');

ギャラリーで写真のリストをループしている場合、画像がすでにキャッシュにある場合、サーバーに別のリクエストを送信しないため、ajaxよりも優れているはずです。jQuery / ajaxの場合はリクエストし、HTTP 304(変更されていない)を返し、キャッシュにある元の画像がすでに存在する場合はそれを使用します。上記の方法は、ギャラリー内の画像の最初のループの後、サーバーへの空のリクエストを減らします。


4

ASYNCのロードにDeferredオブジェクトを使用できます。

function load_img_async(source) {
    return $.Deferred (function (task) {
        var image = new Image();
        image.onload = function () {task.resolve(image);}
        image.onerror = function () {task.reject();}
        image.src=source;
    }).promise();
}

$.when(load_img_async(IMAGE_URL)).done(function (image) {
    $(#id).empty().append(image);
});

注意してください:キャッシュの問題を防ぐために、image.onloadはimage.srcの前になければなりません。


3

画像のソースを設定したいだけならこれを使うことができます。

$("img").attr('src','http://somedomain.com/image.jpg');

3

これも動作します。

var image = new Image();
image.src = 'image url';
image.onload = function(e){
  // functionalities on load
}
$("#img-container").append(image);

2

私の知る限り、ここでは.ajax()のように.load()関数を実行する必要がありますが、jQuery setTimeoutを使用してそれをライブに保つことができます(ish)

<script>
 $(document).ready(function() {
 $.ajaxSetup({
    cache: false
});
 $("#placeholder").load("PATH TO IMAGE");
   var refreshId = setInterval(function() {
      $("#placeholder").load("PATH TO IMAGE");
   }, 500);
});
</script>

2
申し訳ありませんが、Qを少し誤解しました。変更中の画像または何か(つまりajaxビット)をロードしていると思いました
benhowdle89

2

.loadを使用してイメージをロードします。エラー(404としましょう)が発生するかどうかをテストするには、次のようにします。

$("#img_id").error(function(){
  //$(this).hide();
  //alert("img not loaded");
  //some action you whant here
});

注意-画像のsrc属性が空の場合、.error()イベントはトリガーされません。


0

$(関数(){

    if ($('#hdnFromGLMS')[0].value == 'MB9262') {
        $('.clr').append('<img src="~/Images/CDAB_london.jpg">');
    }
    else
    {
        $('.clr').css("display", "none");
        $('#imgIreland').css("display", "block");
        $('.clrIrland').append('<img src="~/Images/Ireland-v1.jpg">');
    }
});

そのロードホームページは、我々は異なる画像を設定することができながら、perfectely作業-ポラリスから
MadhaviLatha Bathiniを

質問への回答とは関係なく、乱雑すぎます。
Maxim Kumpan 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.