Как перезапустить функцию, если она не работает с первого раза? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть изображение / медиа tumblr, который загружает 12-25 изображений на первой странице, которые могут быть довольно большими.

У меня есть jQuery, делающий различные косметические вещи с макетом и изображениями, в частности, я проверяю каждый пост, чтобы увидеть, является ли это фотосет, который Tumblr использует как iframe.

Визуально можно увидеть галерею миниатюр предварительного просмотра фотосета, при нажатии на миниатюру открывается слайд-шоу лайтбокса с полноразмерной фотографией.

Мой твик ожидает загрузки iframe, удаляет галерею миниатюр и заменяет ее первым изображением в галерее с полным разрешением.

Вот мой код:

$(".post_relative").each(function () {
        var post_relative = $(this);
        var photoset = post_relative.find('.html_photoset');
        if(photoset.length){
            var myFrame = photoset.find("iframe");
            myFrame.load(function(){
                console.log("frame loaded");
                var newCover = myFrame.contents().find('.photoset').children(':first-child').children(':first-child');
                myFrame.contents().find('img').each(function(){
                    $(this).hide();
                })
                newCover.children(':first-child').remove();
                var psPre = newCover.attr("href")+ '?' + (Math.random() * 1000000);
                newCover.append("<img src='"+ psPre +"' alt='Cover Page' />");
                var psHeight = newCover.find('img');
                psHeight.load(function(){
                if (psHeight.height()>heightRef){
                    psHeight.height(heightRef);
                }
                newCover.detach();
                post_relative.append(newCover);
                myFrame.hide();
            })
            })
        }

Во всяком случае, это работает, 75% времени. Я могу только представить, что Tumblr иногда перегружен, или, может быть, на странице слишком много информации?

Что делает jQuery непоследовательным? Есть ли код jQuery, который позволяет мне дважды проверить, что код выполнен правильно?

Вы можете видеть, работает это или не работает здесь: http://syndex.me

Если он не работает, третий пост будет выглядеть так: wrong

Если все работает правильно, это будет выглядеть так: right

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Вы можете попробовать две вещи.Первое, что я хотел бы сделать, это добавить обратный вызов к вашей функции загрузки:

myFrame.load("yourUrl", function(response, status, xhr) {
  if (status == "error") {
    var msg = "Sorry but there was an error: ";

    // do whatever if there is an error

    $("#error").html(msg + xhr.status + " " + xhr.statusText);
  }
});

Если это не сработает, я бы порекомендовал в вашем коде оператор try catch .Оберните попытку блока кода, который, по вашему мнению, не работает, и добавьте оператор catch, чтобы вы знали, если вы столкнетесь с ошибкой в ​​этом конкретном блоке.Вы также можете выдавать пользовательские ошибки , чтобы дать вам представление о том, что именно не удалось.

1 голос
/ 08 декабря 2011

Я подозреваю, что фрагмент этого кода, который работает с перебоями, может быть вашим обработчиком load на iframe.Если iframe не загружен из-за кеша браузера или если существует состояние гонки, когда фрейм уже загружен до того, как был прикреплен ваш обработчик загрузки, то ваш обработчик может не сработать.

Обновить

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

  1. Если это связано с состоянием гонки, убедитесь, что вы перепроектироваливаш код, поэтому вы прикрепляете обработчики событий перед вставкой фреймов в DOM.
  2. Если это связано с кэшированием, добавьте что-нибудь в URL фреймов, чтобы они всегда были уникальными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...