Функция огня jQuery на определенной странице с AJAX предотвращает навигацию по умолчанию

У меня есть скрипт jQuery для навигации, использующий AJAX для постепенного исчезновения на каждой странице. Я также использую imagesLoaded для отображения изображений после извлечения их из базы данных.

Каждый из них отлично работает сам по себе, и изображения прекрасно загружаются, когда страница загружается со страницы изображений изначально. Однако если я использую навигацию для перехода на страницу изображений после первоначальной загрузки с другой страницы, imagesLoaded не запускается.

imagesLoaded часть скрипта:

function portfolioImages() {
    $( function() {
        var $container = $('#container');
        var $content = $container.find('#columns');

        $(document).ready(function() {
            var items = getItems();
            console.log( items );
            $content.append( $(items) );
            $content.imagesLoaded()
            .progress( onProgress )
        });
    });

    function getItems() {
        var items = '';
        for ( var i = 0; i < 1; i++ ) {
            items += getImageItem();
        }
        return items;
    }

    function getImageItem() {
        var item;
        var src;
        $.ajax({
            async: false,
            url: "images-query.php",
            dataType: "json",
            success: function(data){
                item=" ";
                for (var i in data.images) {
                    item+="<li class=\"is-loading\"><img src=\"images/"+data.images[i].filename+"\" class=\""+data.images[i].orientation+"\" /></li>";
                }
                item+=" ";
            }
        });
        console.log(item);
        return item;
    }

    function onProgress( imgLoad, image ) {
        $( image.img ).fadeIn();
        var $item = $( image.img ).parent();
        $item.removeClass('is-loading');
        if ( !image.isLoaded ) {
            $item.addClass('is-broken');
        }
    }
}

JQuery AJAX навигационная часть:

var pgurl = window.location.href.substr(window.location.href.lastIndexOf("/")+1);
$(document).ready(function() {
    if (pgurl == 'portfolio'){
        portfolioImages();
    }
    $("#links li a.menu").each(function(){
        if($(this).attr("href") == pgurl){
            $(this).addClass("default");
            $(this).addClass("active");
        }
    });
    $('#links a.menu.default').click(function(e) {
        e.preventDefault();
        $(this).addClass("active");
        var url = $(this).attr('href');
        $.ajax({
            url: url,
            success: function(data) {
                $('#newcontent').fadeOut(function() {
                    $(this).fadeOut();    
                    $('#links a').not( ".default" ).removeClass("active");

                    $('#defaultcontent').fadeIn(function() {
                        $(this).fadeIn();    
                        window.history.pushState(null, data, "/ajaxtransition/" + url);
                    });

                });
                if(data = 'portfolio'){
                    return false;
                }
            }
        });
    });
    $('#links a').not( ".default" ).click(function(e) {
        e.preventDefault();
        $(".active").removeClass("active");
        var url = $(this).attr('href');
        $.ajax({
            url: url,
            success: function(data) {
                $('#defaultcontent').fadeOut(function() {
                    $(this).fadeOut();    

                    $('#newcontent').fadeOut(function() {
                        $(this).load(url + ' #defaultcontent').fadeIn();
                        window.history.pushState(null, data, "/ajaxtransition/" + url);
                        var pgurl = window.location.href.substr(window.location.href.lastIndexOf("/")+1);
                        $("#links li a.menu").each(function(){
                            if($(this).attr("href") == pgurl){
                                $(this).addClass("active");
                            }
                            if($(this).attr("href") == 'portfolio'){
                                $('#newcontent').html(portfolioImages());
                            }
                        });
                    });
                });
            }
        });
    });
});

И соответствующая разметка HTML:

<ul id="links">
    <li><a href="portfolio" rel="portfolio" class="menu">Portfolio</a></li>
    <li><a href="about" rel="about" class="menu">About</a></li>
    <li><a href="contact" rel="contact" class="menu">Contact</a></li>
</ul>

Я попытался подключить следующий фрагмент, найденный в конце второго $('#newcontent').fadeOut(function() { ... }) раздел, но он не дал правильных результатов. imagesLoaded запускается на исходной странице при повторном нажатии на нее, а не на странице изображений.

if($(this).attr("href") == 'portfolio'){
    $('#newcontent').html(portfolioImages());
}

Как заставить изображения загружаться на страницу с изображениями при нажатии на соответствующую ссылку?

Я также открыт для предложений по очистке кода.:)

1 ответ

Решение

JQuery-х .load ( http://api.jquery.com/load/) метод также является асинхронным и использует функцию обратного вызова. Попробуйте использовать это здесь:

$(this).load(url + ' #defaultcontent', function() {
     $(this).fadeIn(); 
     window.history.pushState(null, data, "/ajaxtransition/" + url);
     var pgurl = window.location.href.substr(window.location.href.lastIndexOf("/")+1);
     $("#links li a.menu").each(function(){
         if($(this).attr("href") == pgurl){
             $(this).addClass("active");
         }
          if($(this).attr("href") == 'portfolio'){
             $('#newcontent').html(portfolioImages());
          }
     });
});

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

$(this).load(url + ' #defaultcontent', callback);

function callback() {
     $(this).fadeIn(); 
     window.history.pushState(null, data, "/ajaxtransition/" + url);
     var pgurl = window.location.href.substr(window.location.href.lastIndexOf("/")+1);
     // and so on...
}
Другие вопросы по тегам