1

私はdivを追加するのではなく、レンダリングされた部分を追加して、Masonryに無限のスクロールを実装しようとしています。 divを追加すると、それはポールアイルランドの作品Infinite Scroll jQuery pluginとまったく同じです。私はそれを使用していましたが、代わりに部分的なものを追加したいので、私には役に立たないです。おそらく、混乱しているが、私はコードとの混乱をクリアしようとするでしょう:石積みの無限スクロール(部分的に追加)? [Rails]

masonry.js

var $container = $('.postindex'); 

    $container.imagesLoaded(function(){ 

    $container.masonry({ 
     itemSelector: '.posts-wrapper', 
     isFitWidth: true, 
     percentPosition: true 
    }); 
    }); 

pagination.js

$(document).ready(function() { 

    if ($('#infinite-scrolling').size() > 0) { 

    $(window).on('scroll', function() { 
     var more_posts_url; 
     more_posts_url = $('.pagination a.next_page').attr('href'); 
     if (more_posts_url && $(window).scrollTop() > $(document).height() - $(window).height() - 60) { 
     $('.pagination').html('<img src="/assets/ajax-loader.gif" alt="Loading..." title="Loading..."/>'); 
     $.getScript(more_posts_url); 
     } 
    }); 
    } 

}); 

index.htmlを.haml

.postindex.transitions-enabled.infinite-scroll.page 
    .postin 
    [email protected] do |post| 
     = render 'posts/post', post: post 
#infinite-scrolling 
    = will_paginate @posts 

_post.html.haml(抽出物)

.posts-wrapper 
    .post 
    .image.center-block 
     %a{id: "imageurl_#{post.id}", href: "/", "data-gallery": ""} 
     = cl_image_tag(post.image.full_public_id, quality:"auto", fetch_format:"auto", width:640, crop: "scale", class: "img-responsive") 

ので、この場合には、代わりにposts-wrapperのdivを追加し、私は全体post部分を追加します。もちろんこれは、フリーメーソン(追加項目は、既存のものをオーバーラップでは動作しません

$('.postin').append('<%= j render @posts %>'); 
<% if @posts.next_page %> 
    $('.pagination').replaceWith('<%= j will_paginate @posts %>'); 
<% else %> 
    $(window).off('scroll'); 
    $('.pagination').remove(); 
<% end %> 

index.js.erb:これは私がフリーメーソンを実装する前に、無限スクロールコードが書かれた正確にどのようです)。今、私はこれをどのように機能させるのですか?


私が代わりにdiv要素の部分を追加する必要がありますなぜあなたは迷っている場合は、私は必ず実行にポストがロードされるたびに確認する必要があり_post.html.hamlの最後にスクリプトの一部を持っています。 (フル)

_post.html.haml_imageurl800.html.hamlがある

.posts-wrapper 
    .post 
    .image.center-block 
     %a{id: "imageurl_#{post.id}", href: "/", "data-gallery": ""} 
     = cl_image_tag(post.image.full_public_id, quality:"auto", fetch_format:"auto", width:640, crop: "scale", class: "img-responsive") 


:javascript 
    if ($(window).width() <= 800){ 
    $("#imageurl_#{post.id}").attr("href", '#{escape_javascript(render :partial => 'posts/imageurl800', :locals => {:post => post })}'); 
    } 
    else if ($(window).width() <= 1200) { 
    $("#imageurl_#{post.id}").attr("href", '#{escape_javascript(render :partial => 'posts/imageurl1200', :locals => {:post => post })}'); 
    } 
    else if ($(window).width() <= 1600) { 
    $("#imageurl_#{post.id}").attr("href", '#{escape_javascript(render :partial => 'posts/imageurl1600', :locals => {:post => post })}'); 
    } 
    else { 
    $("#imageurl_#{post.id}").attr("href", '#{escape_javascript(render :partial => 'posts/imageurl1920', :locals => {:post => post })}'); 
    } 

= cl_image_path(post.image.full_public_id, width:800, crop:"scale", class:"img-responsive") 

_imageurl1200.html.hamlは次のとおりです。

= cl_image_path(post.image.full_public_id, width:1200, crop:"scale", class:"img-responsive") 

ので、ここでは完全なファイルですに。

基本的には、投稿が読み込まれるたびに、ブラウザの幅をチェックし、それに応じてクリックしたときに特定のサイズのギャラリー("data-gallery": "")に画像を読み込みます。私は私がはっきりしていることを望む全体的なことに取り組むためのよりよい方法があるなら、それを提案してください。ありがとう!

答えて

2

[OK]を、数時間後...

var $postbox = $('<%= j render @posts %>'); 
var $container = $('.postindex'); 

$postbox.imagesLoaded(function(){ 
$container.append.($postbox).masonry('appended', $postbox);  
}); 

<% if @posts.next_page %> 
    $('.pagination').replaceWith('<%= j will_paginate @posts %>'); 
<% else %> 
    $(window).off('scroll'); 
    $('.pagination').remove(); 
<% end %> 

これはあなたのために働く必要があります。

0

DRY-ERアプローチを試してみましたが、私の問題を解決しました。私は部分からスクリプトを削除し、代わりにjs関数を使ってURL内のテキストを検索し置換しました。したがって、たとえば:

_post.html。HAML

%a{class: "post_url", href: "#{cl_image_path(post.image.full_public_id, width:640, crop:"scale", class:"img-responsive")}", "data-gallery": ""} 

masonry.js

function urlhelper() { 
    $("a.post_url").each(function(){ 
    var str = $(this).attr('href') 
    if ($(window).width() <= 800) { 
     var txt = str.replace("w_640","w_800"); 
    } else if ($(window).width() <= 1200) { 
     var txt = str.replace("w_640","w_1200"); 
    } else if ($(window).width() <= 1600) { 
     var txt = str.replace("w_640","w_1600"); 
    } else { 
     var txt = str.replace("w_640","w_1920"); 
    } 
    $(this).attr('href', txt); 
    }); 
} 

$(document).ready(function() { 
    urlhelper(); 
}); 

$(document).ajaxComplete(function() { 
    urlhelper(); 
}); 

これは私の問題を解決しますが、私はまだそれがパーシャルをレンダリングすることにより、石工する無限スクロールを追加することが可能ですかどうかを知りたいと思います。だからあなたがその答えを知っているなら、私に知らせるのをためらってください!

0

これは役立つかもしれない:jQueryの.appendとHTML文字列を(追加することができますが、)

http://masonry.desandro.com/methods.html#appended

を石造の追加はできません。 $ .get()や$ .ajax()のようなjQuery ajaxメソッドでコンテンツを追加する場合は、HTMLコンテンツ文字列をjQueryオブジェクトにラップして、追加して使用します。

// does not work 
$.get('page2', function(content) { 
    // HTML string added, but items not added to Masonry 
    $grid.append(content).masonry('appended', content); 
}); 

// does work 
$.get('page2', function(content) { 
    // wrap content in jQuery object 
    var $content = $(content); 
    // add jQuery object 
    $grid.append($content).masonry('appended', $content); 
}); 
関連する問題