Подождите, пока jQuery.html () полностью загружен?

#jquery

#jquery

Вопрос:

в jQuery я загружаю некоторый HTML-код в div, подобный этому:

 $("#test").html("Hello <img src='pic.jpg'>");
  

Есть ли способ узнать, полностью ли загружен HTML-код?
Я имею в виду, что я установил содержимое, но для загрузки изображения требуется некоторое время.. Я хотел бы подождать, пока не будет загружен весь HTML…

Я мог бы использовать $(«img»).load(… но это не работает для содержимого, загруженного с помощью $.html Есть другие идеи?

Спасибо

Комментарии:

1. Вы могли бы предварительно загрузить (в JS) изображение и onload запустить свой jQuery.

Ответ №1:

 $("#test").html("Hello <img  class='futureImg' src='pic.jpg'>");

$(".futureImg").live('load',function () { alert('lalala');});
  

Комментарии:

1. Я думаю, что ответ @Royi Namir лучше 🙂

2.jsFiddle не является чистой средой разработки. это утверждение также не работает, и оно должно $('body').load(function () { alert('lalala');}); jsfiddle.net/FPu4P/4

Ответ №2:

попробуйте:

 $('#test').html("Hello <img src='pic.jpg'>").load(function(){
 // Ur task when it loaded.
});
  

Комментарии:

1. Я получаю Uncaught TypeError: e.indexOf is not a function at w.fn.init.w.fn.load при использовании этого.

Ответ №3:

Вы могли бы использовать обработчик JS Image onload и добавить туда разметку:

 $("#btn").click(function(){
    var img = new Image();
    alert('onclick');
    img.onload = function(){
        $("#mycontent").html("<img class='futureImg' src='http://upload.wikimedia.org/wikipedia/commons/6/67/Rita_25_sept_2005_1640Z.jpg'>");
         alert('onload');
    }
    $("#mycontent").html("Image loading...");
    img.src = 'http://upload.wikimedia.org/wikipedia/commons/6/67/Rita_25_sept_2005_1640Z.jpg';
});
  

http://jsfiddle.net/FPu4P/6/

Обратите внимание, изображение будет кэшироваться после открытия в первый раз. Это довольно большое изображение, поэтому загрузка может занять минуту или две.

Редактировать

И вы действительно могли бы одновременно выполнять .html() добавление и кэш JS (насколько я могу судить):

 $("#btn").click(function(){
    // Just so the image is not cached
    var r = Math.floor(Math.random()*1111111111);
    var url = 'http://upload.wikimedia.org/wikipedia/commons/6/67/Rita_25_sept_2005_1640Z.jpg?' r;
    var img = new Image();
    alert('onclick');
    img.onload = function(){
         alert('onload');
    }
    $("#mycontent").html("<img class='futureImg' src='" url "'>");
    img.src = url;
});
  

http://jsfiddle.net/FPu4P/7/

Ответ №4:

почему вы не используете .ready() ?

Документация:http://api.jquery.com/ready /

Ответ №5:

Хитрость заключается в том, чтобы настроить прослушиватель событий, прежде чем направлять <img> на файл:

 $("#test").html ("Hello <img />");
var newImg = $("#test > img");

newImg.load( function () {
    alert ('Success!');
} ).attr ('src', 'pic.jpg');
  

Посмотрите на это в действии в jsFiddle.

Ответ №6:

 $("#test").load(function() {
    //your code after #test loaded
});
  

Ответ №7:

 $("#test").html('Hello <img src="pic.jpg">').find('img').load(...)
  

Комментарии:

1. спасибо, но он запустится, даже если img не загружен. Я имею в виду, может быть, он загружен в память, но пока не виден.

Ответ №8:

Другим решением, еще не упомянутым на этой странице, было бы использование отложенных объектов jQuery следующим образом:

 var rq_html = $.get('.../somepage.html');
var rq_img = $.get('.../img/someimg.jpg');

$.when(rq_html, rq_img).then(function() 
{
  // both requests completed, append received html into DOM
  // and either rely on cache or insert img manually
}, function()
{
  // this function is failure handler in case one of the requests fails
  // the other request may still be pending at this point,
  // you might want to cancel it or handle the situation in another way...
});