概念: will paganiate 由送到 controller 的 params[:page] 決定回傳的@posts
。
可以由我們在 controller 中定義@posts
所知道。
1 @posts = Post.paginate(:page => params[:page ])
1 2 3 4 5 $(window ).scroll(function ( ) { if ($(window ).scrollTop() >= $(document ).height() - $(window ).height() - 10 ) { } });
記得要減10,或任何你覺得適合的數,可以幫助捲動正確觸發。
javascript - infinite-scroll jquery plugin - Stack Overflow
程式碼 - HTML 因為我們使用 will pagniate 也就是分頁的GEM來實作,所以我們必須用 hidden field 來儲存目前捲動的最後一頁是哪一頁。image_tag 是 rails 特有的用法,會對應到 assets/images
資料夾下的圖片。
index.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 <div class ="page-header" > <h1 > My Post</h1 > </div > <div id ="my-posts" > <%= render @posts %></div > <div id ="loadmoreajaxloader" style ="display:none;" > <center > <%= image_tag "ajax-loader.gif" %></center > </div > <%= hidden_field_tag "current_page", "1" %>
_post.html.erb
1 2 3 4 5 6 <div > <h2 > <%= link_to post.title, post %></h2 > <small > <em > <%= post.timestamp %></em > </small > <p > <%= truncate(strip_tags(post.body), length: 600) %></p > </div >
程式碼 - JS 實作了兩種觸發的方式,先完成較簡單的 click ,之後再把 click 事件替換成捲動至頁尾會觸發的事件即完成無限下拉式瀏覽。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 $(function ( ) { var $loadmore = $("#loadmore" ); var $current_page = $("#current_page" ); var $my_posts = $("#my-posts" ); var addPostToList = function (post ) { var postStri = "" ; postStri += "<div>" ; postStri += " <h2><a href=\"#\">" + post.title + "<\/a><\/h2>" ; postStri += " <small><em>" + post.created_at + "<\/em><\/small>" ; postStri += post.body; postStri += "<\/div>" ; $my_posts.append(postStri); }; var addPosts = function (posts ) { $.each(posts, function ( ) { addPostToList(this ); }); }; $(window ).on("scroll" , function ( ) { if ($($(window ).scrollTop() >= $(document ).height() - $(window ).height() - 50 )) { var current_page = parseInt ($current_page.val()); current_page++; console .log("111" ); $('div#loadmoreajaxloader' ).show(); $.ajax({ url : "/posts.json" , type : "GET" , dataType : "json" , data : { page : current_page }, success : function (data ) { console .log(data); $current_page.val(String (current_page)); var posts = data; $('div#loadmoreajaxloader' ).hide(); addPosts(posts); } }); } }); $loadmore.click(function (e ) { e.preventDefault(); var current_page = parseInt ($current_page.val()); current_page++; $loadmore.hide(); console .log("click" ); $.ajax({ url : "/posts.json" , type : "GET" , dataType : "json" , data : { page : current_page }, success : function (data ) { console .log(data); $current_page.val(String (current_page)); var posts = data; addPosts(posts); $loadmore.show(); } }); }); }); (function ($ ) { })(jQuery);
其他:javascript小技巧 - 過濾url獲取id 1 var str_sub = str.substr(str.lastIndexOf("=" )+1 );
Javascript: 標籤過濾從url獲取id - 數碼維基