การโหลดภาพล่วงหน้าด้วย jQuery


689

ฉันกำลังมองหาวิธีที่ง่ายและรวดเร็วในการโหลดภาพด้วย JavaScript ฉันใช้ jQuery ถ้านั่นสำคัญ

ฉันเห็นสิ่งนี้ที่นี่ ( http: //nettuts.com ... ):

function complexLoad(config, fileNames) {
  for (var x = 0; x < fileNames.length; x++) {
    $("<img>").attr({
      id: fileNames[x],
      src: config.imgDir + fileNames[x] + config.imgFormat,
      title: "The " + fileNames[x] + " nebula"
    }).appendTo("#" + config.imgContainer).css({ display: "none" });
  }
};

แต่มันก็ดูดีไปหน่อยสำหรับสิ่งที่ฉันต้องการ!

ฉันรู้ว่ามีปลั๊กอิน jQuery ที่ทำเช่นนี้ แต่พวกเขาทั้งหมดดูเหมือนจะใหญ่ (ขนาด) ฉันต้องการวิธีโหลดภาพล่วงหน้าที่รวดเร็วง่ายและสั้น ๆ !


10
$.each(arguments,function(){(new Image).src=this});
เดวิดเฮลล์ซิงก์

คำตอบ:


969

ด่วนและง่าย:

function preload(arrayOfImages) {
    $(arrayOfImages).each(function(){
        $('<img/>')[0].src = this;
        // Alternatively you could use:
        // (new Image()).src = this;
    });
}

// Usage:

preload([
    'img/imageName.jpg',
    'img/anotherOne.jpg',
    'img/blahblahblah.jpg'
]);

หรือถ้าคุณต้องการปลั๊กอิน jQuery:

$.fn.preload = function() {
    this.each(function(){
        $('<img/>')[0].src = this;
    });
}

// Usage:

$(['img1.jpg','img2.jpg','img3.jpg']).preload();

25
ไม่จำเป็นต้องใส่องค์ประกอบรูปภาพลงใน DOM เพื่อให้แน่ใจว่าเบราว์เซอร์แคชหรือไม่
JoshNaro

8
ฉันเชื่อว่า$('<img />')เพียงแค่สร้างองค์ประกอบภาพในหน่วยความจำ (ดูลิงค์ ) ดูเหมือนว่า'$('<img src="' + this + '" />')จะสร้างองค์ประกอบภายใน DIV ที่ซ่อนอยู่เพราะมัน "ซับซ้อน" มากกว่า อย่างไรก็ตามฉันไม่คิดว่านี่เป็นสิ่งจำเป็นสำหรับเบราว์เซอร์ส่วนใหญ่
JoshNaro

104
นั่นเป็นวิธีแปลก ๆ ในการเขียนปลั๊กอิน jQuery ทำไม$.preload(['img1.jpg', 'img2.jpg'])ล่ะ
alex

12
ตรวจสอบให้แน่ใจว่าได้เรียกสิ่งนี้$(window).load(function(){/*preload here*/});ว่าภายในเนื่องจากวิธีการโหลดรูปภาพทั้งหมดในเอกสารก่อนเป็นไปได้ว่าพวกเขาจำเป็นต้องมีก่อน
Jasper Kennis

12
@RegionalC - อาจปลอดภัยกว่าเล็กน้อยในการตั้งค่าloadเหตุการณ์ก่อนที่จะตั้งค่าsrcในกรณีที่ภาพเสร็จสิ้นการโหลดก่อนที่เหตุการณ์โหลดจะถูกตั้งค่าหรือไม่ $('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
sparebytes

102

ต่อไปนี้เป็นเวอร์ชันแรกของการตอบกลับครั้งแรกที่โหลดภาพเข้าสู่ DOM และซ่อนไว้โดยค่าเริ่มต้น

function preload(arrayOfImages) {
    $(arrayOfImages).each(function () {
        $('<img />').attr('src',this).appendTo('body').css('display','none');
    });
}

38
hide()css('display', 'none')คือสั้นกว่า
alex

6
ประโยชน์ของการแทรกไว้ใน DOM คืออะไร
alex

ฉันต้องการทราบประโยชน์จากการสอดแทรกเข้าไปใน DOM
jedmao

11
จากประสบการณ์ของฉันการโหลดภาพลงใน DOM ทำให้เบราว์เซอร์ทราบถึงการมีอยู่และเพื่อให้แคชได้อย่างถูกต้อง มิฉะนั้นภาพจะมีอยู่ในหน่วยความจำเท่านั้นซึ่งใช้ได้กับแอปหน้าเดียวเท่านั้น
Dennis Rongo

เดนนิสรองโก การเพิ่มรูปภาพต่อท้าย DOM จะเป็นการโหลดแบบสุ่มบน Chrome อีกครั้ง ขอบคุณ!
tmorell

52

การใช้งานจาวาสคริรูปภาพวัตถุ

ฟังก์ชั่นนี้ช่วยให้คุณสามารถโทรกลับเมื่อโหลดรูปภาพทั้งหมด อย่างไรก็ตามโปรดทราบว่าจะไม่มีการทริกเกอร์การโทรกลับหากไม่ได้โหลดทรัพยากรอย่างน้อยหนึ่งรายการ สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยใช้การonerrorโทรกลับและเพิ่มloadedค่าหรือจัดการข้อผิดพลาด

var preloadPictures = function(pictureUrls, callback) {
    var i,
        j,
        loaded = 0;

    for (i = 0, j = pictureUrls.length; i < j; i++) {
        (function (img, src) {
            img.onload = function () {                               
                if (++loaded == pictureUrls.length && callback) {
                    callback();
                }
            };

            // Use the following callback methods to debug
            // in case of an unexpected behavior.
            img.onerror = function () {};
            img.onabort = function () {};

            img.src = src;
        } (new Image(), pictureUrls[i]));
    }
};

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('a');
});

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('b');
});

4
ทำสิ่งที่ถูกต้องใช้วัตถุรูปภาพจาวา คุณสังเกตคนที่ทำสิ่งผิดในคำตอบเหล่านี้หรือไม่?
alex

รหัสที่ยอดเยี่ยม ฉันคิดถูกแล้วว่านี่จะทำให้onloadเหตุการณ์เกิดขึ้นแม้ว่าภาพจะถูกแคชหรือไม่ (เพราะimg.onloadมีการประกาศก่อน) นี่คือสิ่งที่การทดสอบของฉันแสดงให้เห็น
Startec

3
@alex อาจใช่ หากเป้าหมายคือการโหลดล่วงหน้า (ซึ่งแนะนำลำดับของประสิทธิภาพ) ดังนั้นฉันต้องการดูตัวเลือก JS ดิบแทนตัวเลือกที่ขึ้นอยู่กับ jQuery
Charlie Schliesser

ฉันชอบโซลูชันนี้ แต่ฉันเพิ่งค้นพบว่ามันไม่ทำงานใน Firefox ของฉัน มันเป็นแค่ฉันหรือคนอื่นมีปัญหาเดียวกันหรือไม่?
Gazillion

@Gazillion ให้รายละเอียดเพิ่มเติม คุณกำหนดอย่างไร "ไม่ทำงาน" FF เวอร์ชันคืออะไร
Gajus

35

JP, หลังจากตรวจสอบวิธีการแก้ปัญหาของคุณฉันยังคงมีปัญหาใน Firefox ที่จะไม่โหลดภาพล่วงหน้าก่อนที่จะย้ายไปพร้อมกับการโหลดหน้าเว็บ ฉันค้นพบสิ่งนี้โดยใส่sleep(5)สคริปต์สคริปต์ฝั่งเซิร์ฟเวอร์ของฉัน ฉันใช้โซลูชันต่อไปนี้โดยยึดตามของคุณซึ่งดูเหมือนจะแก้ปัญหาได้

โดยทั่วไปฉันได้เพิ่มการโทรกลับไปยังปลั๊กอินพรีโหลด jQuery ของคุณเพื่อให้มันได้รับการเรียกหลังจากภาพทั้งหมดโหลดอย่างถูกต้อง

// Helper function, used below.
// Usage: ['img1.jpg','img2.jpg'].remove('img1.jpg');
Array.prototype.remove = function(element) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == element) { this.splice(i,1); }
  }
};

// Usage: $(['img1.jpg','img2.jpg']).preloadImages(function(){ ... });
// Callback function gets called after all images are preloaded
$.fn.preloadImages = function(callback) {
  checklist = this.toArray();
  this.each(function() {
    $('<img>').attr({ src: this }).load(function() {
      checklist.remove($(this).attr('src'));
      if (checklist.length == 0) { callback(); }
    });
  });
};

จากความสนใจในบริบทของฉันฉันใช้สิ่งนี้ดังนี้:

$.post('/submit_stuff', { id: 123 }, function(response) {
  $([response.imgsrc1, response.imgsrc2]).preloadImages(function(){
    // Update page with response data
  });
});

หวังว่านี่จะช่วยให้บางคนที่มาที่หน้านี้จาก Google (อย่างที่ฉันเคย) กำลังมองหาวิธีแก้ปัญหาการโหลดภาพล่วงหน้าในการโทร Ajax


2
สำหรับผู้ที่ไม่สนใจ messing Array.prototype แทนคุณสามารถทำได้: checklist = this.lengthและในฟังก์ชั่น onload: checklist--จากนั้น:if (checklist == 0) callback();
MiniGod

3
ทุกอย่างจะดี แต่การเพิ่มใหม่หรือลบวิธีการที่มีอยู่ในวัตถุที่คุณไม่ได้เป็นหนึ่งในแนวทางปฏิบัติที่เลวร้ายที่สุดใน JavaScript
Rihards

ดีและรวดเร็ว แต่รหัสนี้จะไม่ทำการเรียกกลับถ้ารูปภาพใดภาพหนึ่งเสียหายหรือไม่สามารถโหลดได้
SammyK

.attr({ src: this }).load(function() {...})ควรเป็น.load(function() {...}).attr({ src: this })อย่างอื่นคุณจะมีปัญหาการแคช
Kevin B

25

รหัส jQuery บรรทัดเดียวนี้สร้าง (และโหลด) องค์ประกอบ DOM img โดยไม่แสดง:

$('<img src="img/1.jpg"/>');

4
@huzzah - คุณอาจจะดีกว่าถ้าใช้สไปรท์ คำขอ http น้อย :)
Alex K

22
$.fn.preload = function (callback) {
  var length = this.length;
  var iterator = 0;

  return this.each(function () {
    var self = this;
    var tmp = new Image();

    if (callback) tmp.onload = function () {
      callback.call(self, 100 * ++iterator / length, iterator === length);
    };

    tmp.src = this.src;
  });
};

การใช้งานค่อนข้างง่าย:

$('img').preload(function(perc, done) {
  console.log(this, perc, done);
});

http://jsfiddle.net/yckart/ACbTK/


นี่เป็นคำตอบที่ดีจริงๆมันควรจะเป็นคำตอบที่ได้รับการโหวตสูงสุด
sleepycal

1
คำอธิบายบางคำน่าจะดี
robsch

คำตอบที่ดี แต่ฉันแนะนำให้ใช้picsum.photosแทนที่จะเป็น lorempixel.com
Aleksandar

19

ฉันมีปลั๊กอินขนาดเล็กที่จัดการสิ่งนี้

มันเรียกว่าwaitForImagesและจะสามารถจัดการกับimgองค์ประกอบหรือองค์ประกอบใด ๆ ที่มีการอ้างอิงถึงภาพใน CSS div { background: url(img.png) }เช่น

หากคุณต้องการโหลดภาพทั้งหมดรวมถึงภาพที่อ้างอิงใน CSS ต่อไปนี้เป็นวิธีที่คุณทำได้ :)

$('body').waitForImages({
    waitForAll: true,
    finished: function() {
       // All images have loaded.
    }  
});

ปลั๊กอินนี้ทำให้รูปภาพที่ยังไม่ปรากฏบนหน้าโหลดหรือแนบเหตุการณ์ไปยังรูปภาพที่กำลังโหลดอยู่แล้วหรือไม่?
Dave Cameron

@DaveCameron มันไม่เคารพถ้าเห็นภาพหรือไม่ คุณสามารถแยกและทำการเปลี่ยนแปลงได้อย่างง่ายดายเพียงเพิ่ม:visibleไปยังตัวเลือกที่กำหนดเอง
alex

ปลั๊กอินนี้ดูน่าสนใจมาก อย่างไรก็ตามเอกสาร jqueryเน้นว่าloadเหตุการณ์เมื่อนำไปใช้กับภาพ: "ไม่ทำงานอย่างสม่ำเสมอหรือข้ามเบราว์เซอร์ที่เชื่อถือได้" ปลั๊กอินมีการจัดการเพื่อรับรอบที่ได้อย่างไร
EleventyOne

@EleventyOne ตรวจสอบแหล่งที่มาเกี่ยวกับตัวเลือกที่กำหนดเอง
alex

@alex ปลั๊กอินนี้โหลดรูปภาพที่ตั้งไว้ใน css บนได้อย่างไร: โฮเวอร์ขององค์ประกอบ มันใช้ไม่ได้สำหรับฉัน
Philipp Hofmann

13

คุณสามารถโหลดรูปภาพใน html ของคุณโดยใช้display:none;กฎcss จากนั้นแสดงรูปภาพเมื่อคุณต้องการด้วย js หรือ jquery

อย่าใช้ฟังก์ชัน js หรือ jquery เพื่อโหลดล่วงหน้าเป็นเพียงกฎ CSS และ js หลายบรรทัดที่จะดำเนินการ

ตัวอย่าง: Html

<img src="someimg.png" class="hide" alt=""/>

css:

.hide{
display:none;
}

jQuery:

//if want to show img 
$('.hide').show();
//if want to hide
$('.hide').hide();

การโหลดภาพล่วงหน้าด้วย jquery / javascript นั้นไม่ดีทำให้ภาพใช้เวลาไม่กี่มิลลิวินาทีในการโหลดหน้าเว็บ + คุณมีมิลลิวินาทีสำหรับสคริปต์ที่จะทำการแยกวิเคราะห์และประมวลผลโดยเฉพาะอย่างยิ่งถ้าเป็นภาพขนาดใหญ่ดังนั้นการซ่อนไว้ใน hml ทำให้ภาพถูกโหลดล่วงหน้าโดยไม่ต้องมองเห็นได้เลยจนกว่าคุณจะแสดงให้เห็น!


2
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนี้สามารถพบได้ที่นี่: perishablepress.com/…
gdelfino

3
แต่คุณต้องระวังว่าเทคนิคนี้มีข้อเสียเปรียบหลัก: หน้าของคุณจะไม่ถูกโหลดจนสมบูรณ์จนกว่าจะโหลดภาพทั้งหมด อาจใช้เวลาสักครู่ทั้งนี้ขึ้นอยู่กับจำนวนภาพที่จะโหลดล่วงหน้าและขนาดของภาพ ยิ่งไปกว่านั้นหากแท็ก <img> ไม่ได้ระบุความสูงและความกว้างเบราว์เซอร์บางตัวอาจรอจนกว่ารูปภาพจะถูกดึงออกมาก่อนที่จะแสดงผลส่วนที่เหลือของหน้า

@Alex คุณต้องโหลด img คุณมีอิสระที่จะเลือกว่าจะโหลดด้วย html และหลีกเลี่ยงการกระพริบและภาพที่โหลดครึ่งหนึ่งหรือหากคุณต้องการความเร็วที่เพิ่มขึ้นสำหรับโซลูชันที่ไม่เสถียร
itme

ฉันยังคิดว่าการสร้างแท็ก html ด้วย javascript นั้นไม่สามารถอ่านได้เลยแค่ 2 cents ของฉัน
itsme

1
ฉันต้องการทางออกที่รวดเร็วมากสำหรับโครงการที่ซับซ้อนมากและนี่ก็เป็นเช่นนั้น
Germstorm

13

ปลั๊กอินimageLoader jquery นี้มีขนาดเพียง 1.39kb

การใช้งาน:

$({}).imageLoader({
    images: [src1,src2,src3...],
    allcomplete:function(e,ui){
        //images are ready here
        //your code - site.fadeIn() or something like that
    }
});

นอกจากนี้ยังมีตัวเลือกอื่น ๆ เช่นคุณต้องการโหลดภาพแบบซิงโครนัสหรือแบบอะซิงโครนัสและเป็นเหตุการณ์ที่สมบูรณ์สำหรับภาพแต่ละภาพ


@AamirAfridi ทำไมถึงเป็นเช่นนั้น
Ian

1
@Ian เนื่องจากเอกสารพร้อมใช้งานแล้วตามเวลาที่มีการเรียกกลับ $ (เอกสาร). ready ใช้เพื่อให้แน่ใจว่าโหลด DOM ของคุณแล้ว เมื่อพูดถึงการโทรกลับนั่นหมายถึงโหลดรูปภาพทั้งหมดซึ่งหมายความว่า yoru DOM ถูกโหลดดังนั้นไม่จำเป็นต้องใช้เอกสารเลยภายในการโทรกลับ
Aamir Afridi

1
@AamirAfridi ไม่รับประกันว่าเอกสารจะพร้อมใช้งานในการโทรกลับ ... คุณอนุมานจากที่ใด ไม่มีสิ่งใดในหน้าปลั๊กอินที่ระบุว่าallcompleteมีการดำเนินการติดต่อกลับหลังจากที่ DOM พร้อมใช้งาน มีโอกาสที่ดีมากที่ภาพจะโหลดเสร็จหลังจากที่ DOM พร้อมใช้งาน แต่ไม่มีเหตุผลที่จะถือว่า ฉันไม่รู้ว่าทำไมคุณคิดว่าการโทรกลับนั้นน่าอัศจรรย์และถูกดำเนินการหลังจาก DOM พร้อม ... คุณสามารถอธิบายได้ว่าคุณได้รับจากที่ใด เพียงเพราะภาพที่โหลดไม่ได้หมายความว่า DOM พร้อมแล้ว
Ian

@AamirAfridi และเอกสารประกอบสำหรับปลั๊กอินยังพูดว่า: NB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!... มันแนะนำสิ่งที่คำตอบนี้แสดงโดยตรง
Ian

5
@AamirAfridi ที่ไม่เหมาะสมกับสถานการณ์นี้ ปลั๊กอินเป็นตัวโหลดล่วงหน้า คุณต้องการที่จะดำเนินการโดยเร็วที่สุด และมีหลายสิ่งหลายอย่างที่ไม่ขึ้นอยู่กับ DOM ที่คุณต้องการยิงโดยเร็วที่สุดจากนั้นเมื่อ DOM พร้อมแล้วให้ทำอะไรสักอย่าง
Ian

9

วิธีที่รวดเร็วและไม่มีปลั๊กอินในการโหลดภาพล่วงหน้าใน jQuery และรับฟังก์ชั่นการโทรกลับคือการสร้างimgแท็กหลายแท็กในครั้งเดียวและนับการตอบสนองเช่น

function preload(files, cb) {
    var len = files.length;
    $(files.map(function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}

preload(["one.jpg", "two.png", "three.png"], function() {
    /* Code here is called once all files are loaded. */
});
    

โปรดทราบว่าหากคุณต้องการรองรับ IE7 คุณจะต้องใช้เวอร์ชั่นที่ค่อนข้างน้อยกว่านี้ (ซึ่งใช้ได้กับเบราว์เซอร์อื่นด้วย):

function preload(files, cb) {
    var len = files.length;
    $($.map(files, function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}

7

ขอบคุณสำหรับสิ่งนี้! ฉันอยากจะเพิ่มคำตอบของ JP เล็กน้อย - ฉันไม่รู้ว่าจะช่วยใครได้ไหม แต่วิธีนี้คุณไม่ต้องสร้างภาพมากมายและคุณสามารถโหลดรูปภาพขนาดใหญ่ของคุณได้หากคุณ ตั้งชื่อนิ้วหัวแม่มือให้ถูกต้อง สิ่งนี้มีประโยชน์เพราะฉันมีใครบางคนที่กำลังเขียนหน้าทั้งหมดในรูปแบบ html และช่วยให้มั่นใจได้ว่าขั้นตอนน้อยกว่าสำหรับพวกเขาในการทำ - ไม่จำเป็นต้องสร้างอาเรย์ภาพและอีกขั้นหนึ่งที่สิ่งต่าง ๆ

$("img").each(function(){
    var imgsrc = $(this).attr('src');
    if(imgsrc.match('_th.jpg') || imgsrc.match('_home.jpg')){
      imgsrc = thumbToLarge(imgsrc);
      (new Image()).src = imgsrc;   
    }
});

โดยทั่วไปสำหรับแต่ละภาพในหน้ามันคว้า src ของแต่ละภาพถ้ามันตรงกับเกณฑ์บางอย่าง (เป็นนิ้วหัวแม่มือหรือภาพหน้าแรก) มันเปลี่ยนชื่อ (สตริงพื้นฐานแทนที่ในภาพ src) จากนั้นโหลดภาพ .

ในกรณีของฉันหน้านี้เต็มไปด้วยภาพนิ้วหัวแม่มือทุกคนตั้งชื่อบางอย่างเช่น image_th.jpg และภาพขนาดใหญ่ที่เกี่ยวข้องทั้งหมดมีชื่อว่า image_lg.jpg นิ้วโป้งถึงใหญ่แทนที่ _th.jpg ด้วย _lg.jpg จากนั้นโหลดภาพขนาดใหญ่ทั้งหมดไว้ล่วงหน้า

หวังว่านี่จะช่วยใครซักคน


3
    jQuery.preloadImage=function(src,onSuccess,onError)
    {
        var img = new Image()
        img.src=src;
        var error=false;
        img.onerror=function(){
            error=true;
            if(onError)onError.call(img);
        }
        if(error==false)    
        setTimeout(function(){
            if(img.height>0&&img.width>0){ 
                if(onSuccess)onSuccess.call(img);
                return img;
            }   else {
                setTimeout(arguments.callee,5);
            }   
        },0);
        return img; 
    }

    jQuery.preloadImages=function(arrayOfImages){
        jQuery.each(arrayOfImages,function(){
            jQuery.preloadImage(this);
        })
    }
 // example   
    jQuery.preloadImage(
        'img/someimage.jpg',
        function(){
            /*complete
            this.width!=0 == true
            */
        },
        function(){
            /*error*/
        }
    )

7
ยินดีต้อนรับสู่ Stack Overflow! แทนที่จะโพสต์บล็อกรหัสเท่านั้นโปรดอธิบายว่าเพราะเหตุใดโค้ดนี้จึงแก้ปัญหาที่เกิดขึ้น หากไม่มีคำอธิบายนี่ไม่ใช่คำตอบ
Martijn Pieters

3

ฉันใช้รหัสต่อไปนี้:

$("#myImage").attr("src","img/spinner.gif");

var img = new Image();
$(img).load(function() {
    $("#myImage").attr("src",img.src);
});
img.src = "http://example.com/imageToPreload.jpg";

เชื่อมโยงกับเหตุการณ์โหลดก่อนจากนั้นตั้งค่า src
Kevin B

1

ฉันจะใช้ไฟล์ Manifest เพื่อบอกเว็บเบราเซอร์ (สมัยใหม่) เพื่อโหลดรูปภาพที่เกี่ยวข้องทั้งหมดและแคชพวกเขา ใช้ Grunt และ Grunt-Manifest เพื่อทำสิ่งนี้โดยอัตโนมัติและไม่ต้องกังวลอีกครั้งเกี่ยวกับสคริปต์ที่โหลดไว้ล่วงหน้าตัวตรวจสอบแคชที่ไม่ถูกต้อง CDN ฯลฯ

https://github.com/gunta/grunt-manifest


0

มันใช้งานได้สำหรับฉันแม้ใน IE9:

$('<img src="' + imgURL + '"/>').on('load', function(){ doOnLoadStuff(); });

1
สิ่งนี้จะล้มเหลวในที่สุดเนื่องจากการแคชเสมอผูกเหตุการณ์โหลดก่อนที่จะตั้งค่าคุณลักษณะ src
Kevin B

0

ฉันต้องการทำสิ่งนี้ด้วยการซ้อนทับที่กำหนดเองของ Google Maps API โค้ดตัวอย่างของพวกเขาใช้ JS เพื่อแทรกองค์ประกอบ IMG และกล่องตัวยึดตำแหน่งรูปภาพจะปรากฏขึ้นจนกว่าจะโหลดรูปภาพ ผมพบคำตอบได้ที่นี่ที่ทำงานสำหรับฉัน: https://stackoverflow.com/a/10863680/2095698

$('<img src="'+ imgPaht +'">').load(function() {
$(this).width(some).height(some).appendTo('#some_target');
});

โหลดภาพล่วงหน้าตามที่แนะนำไว้ก่อนหน้านี้จากนั้นใช้ตัวจัดการเพื่อผนวกวัตถุ img หลังจากโหลด URL URL แล้ว เอกสารของ jQuery เตือนว่ารูปภาพที่เก็บไว้ไม่ทำงานกับโค้ด eventing / handler นี้ แต่มันใช้ได้กับฉันใน FireFox และ Chrome และฉันไม่ต้องกังวลเกี่ยวกับ IE


สิ่งนี้จะทำงานได้ไม่ดีกับรูปภาพที่แคชไว้ในขณะที่คุณค้นพบ วิธีแก้ปัญหาคือผูกเหตุการณ์โหลดก่อนจากนั้นตั้งค่าแอตทริบิวต์ src
Kevin B

-1
function preload(imgs) {
    $(imgs).each(function(index, value) {
        $('<img />').attr('src', value).appendTo('body').css('display', 'none');
    });
}

.attr('src',value) ไม่ .attr('src',this)

เพียงเพื่อชี้ให้เห็น :)


ขอบเขตthisภายในการโทรกลับที่ส่งไปยัง$.eachถูกกำหนดให้กับค่าที่ถูกทำซ้ำ
Oybek

? $ (['img1.jpg', 'img2.jpg', 'img3.jpg']) แต่ละอัน (ฟังก์ชั่น (ดัชนีค่า) {console.log (ค่า); // img1.jpg console.log (นี่) ; // String {0 = "i", 1 = "m", 2 = "g", มากกว่า ... } $ ('<img />'). attr ('src', นี้) .appendTo (' body '). css (' display ',' none ');});
Whisher

ฮึ่ม ฉันเดาว่าคุณอยู่ตรงนี้ ยกตัวอย่างเช่น$("div").each(function(i, el){ console.log(el == this);});สร้างทั้งหมดtrues; การวนซ้ำของอาร์เรย์ดูเหมือนว่าจะทำงานแตกต่างกัน
Oybek

-2

5 บรรทัดในกาแฟ

array = ['/img/movie1.png','/img/movie2.png','/img/movie3.png']

$(document).ready ->
  for index, image of array
    img[index] = new Image()
    img[index].src = image

2
คุณสามารถขยายวิธีแก้ปัญหาการทำงานเพื่อแก้ไขคำถามใน OP หรือไม่ และอาจแสดงความคิดเห็นรหัสของคุณเพื่อให้ผู้อื่นสามารถเข้าใจได้ง่ายขึ้น?
Ro Yo Mi

-4

สำหรับผู้ที่รู้ actioncript นิดหน่อยคุณสามารถตรวจสอบ flash player ได้โดยใช้ความพยายามน้อยที่สุดและทำ flash preloader ที่คุณสามารถส่งออกไปยัง html5 / Javascript / Jquery วิธีใช้หากไม่พบตัวเล่นแฟลชให้ตรวจสอบตัวอย่างว่าทำอย่างไรกับบทบาทของ youtube กลับไปที่ html5 player :) และสร้างของคุณเอง ฉันยังไม่มีรายละเอียดเพราะฉันยังไม่ได้เริ่มถ้าฉันไม่ลืมฉันจะโพสต์ในภายหลังและจะลองใช้รหัส Jquery standerd กับฉัน


นี่ไม่ใช่วิธีแก้ปัญหา เบราว์เซอร์ไม่รองรับ Flash Player ตามค่าเริ่มต้น สามารถทำได้อย่างง่ายดายด้วย JavaScript ซึ่งเป็นภาษาเบราว์เซอร์ดั้งเดิม
Usman Ahmed

ฉันจำได้ว่าเกลียดชัง Flash ตั้งแต่ปี 2012 ... มันไม่ปกติ ... ทุกที่ที่ฉันไปฉันถูกโจมตีเมื่อฉันใช้คำว่า Flash แม้กระทั่ง
Peter Gruppelaar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.