質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

3回答

4315閲覧

masonryがajaxでオートロードした際に2ページ目以降適応されない

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/02/04 07:18

編集2016/02/04 12:10

masonryをajaxでページングした際に
2ページ目以降(ページ遷移なし)でmasonryが効きない事態に陥ってます。

「もっと見る」ボタンはなくinview.jsを使用して
オートロードするようになってます。

最初にnextTickを使用してみましたが
高さの計算が上手くいかず重なってしまいました。

javascript

1var deferred = ajaxPagingLoaderReady(options, loaderEl, 'auto', state, self, resultKey); 2 3 deferred.done(function() { 4 var units = $('.unit').not('.masonried'); 5 Vue.nextTick(function() { 6 new Masonry('.unitList', { 7 columnWidth: 360, 8 isFitWidth: true, 9 itemSelector: '.unit', 10 gutter: 20, 11 isAnimatedFromBottom: true 12 }); 13 units.each(function() { 14 $(this).addClass('masonried'); 15 }); 16 }); 17 }).fail(function() { 18 console.log('fail'); 19 });

その後、setIntervalを使用したコードに書き換えてみました。
最初の読み込みでは問題なく動いてるのですが
2回目の読み込みからmasonryが適応されません。

javascript

1 var deferred = ajaxPagingLoaderReady(options, loaderEl, 'auto', state, self, resultKey); 2 3 deferred.done(function() { 4 var units = $('.unit').not('.masonried'); 5 var renderMasonry = function() { 6 new Masonry('.unitList', { 7 columnWidth: 360, 8 isFitWidth: true, 9 itemSelector: '.unit', 10 gutter: 20, 11 isAnimatedFromBottom: true 12 }); 13 units.each(function() { 14 $(this).addClass('masonried'); 15 }); 16 }; 17 18 var interval = setInterval(function() { 19 console.log($('.unitList').height()); 20 if ($('.unitList').height() > 0) { 21 renderMasonry(); 22 clearInterval(interval); 23 } 24 }, 200); 25 }).fail(function() { 26 console.log('fail'); 27 });

検索をしてみたところ
imagesLoadedを使うといいと見たので試してみました。

javascript

1var deferred = ajaxPagingLoaderReady(options, loaderEl, 'auto', state, self, resultKey); 2 3 deferred.done(function() { 4 var units = $('.unit').not('.masonried'); 5 imagesLoaded('.unitList',function() { 6 new Masonry('.unitList', { 7 columnWidth: 360, 8 isFitWidth: true, 9 itemSelector: '.unit', 10 gutter: 20, 11 isAnimatedFromBottom: true 12 }); 13 units.each(function() { 14 $(this).addClass('masonried'); 15 }); 16 }); 17 }).fail(function() { 18 console.log('fail'); 19 });

最初と同じく重なってしまう状況になってます。

ご教示いただけますと幸いです。

【追記】
imgタグにwidth, heightを指定する解決方法もありましたが
JSONから取得しており幅高さは統一されておりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ロード時にmasonryを一度実行します。
その後、ajax成功時(DOM更新時)にはreloadItemsを実行するだけで良いと思います。
masonriedクラスの付与も不要です。

公式ドキュメント
http://masonry.desandro.com/methods.html#reloaditems

JavaScript

1var deferred = ajaxPagingLoaderReady(options, loaderEl, 'auto', state, self, resultKey); 2var masonry; 3 4deferred.done(function() { 5 var renderMasonry = function() { 6 masonry = new Masonry('.unitList', { 7 columnWidth: 360, 8 isFitWidth: true, 9 itemSelector: '.unit', 10 gutter: 20, 11 isAnimatedFromBottom: true 12 }); 13 }; 14 15 renderMasonry(); 16}).fail(function() { 17 console.log('fail'); 18});

投稿2016/02/04 09:28

編集2016/02/05 02:06
yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/04 11:20

ご回答ありがとうございます! 教えていただいたコードを試したところ ローダーがぐるぐる回ったままになり masonryが実行されるまでに至っていないようでした。 (エラーは出ておらず。) コードを元に改変などしてみたのですが なかなか動かず...。 また何かお気づきの点がありましたら ご回答いただけますと幸いです!
yamato_hikawa

2016/02/05 02:07 編集

回答のコードを修正しました。 こちらだといかがでしょうか?
guest

0

もう解決済みでしょうか?
私も同じ問題にあたり、以下の手順で解決しました。
jqueryでの実装ですので、コードが違いますが参考までに。

javascript

1$.ajax({ 2 dataType: 'html', 3 url: 'example.php' 4}) 5.done(function(data) { 6 $('#target').append(data); 7 var $grid = $('#target').imagesLoaded( function() { 8 $grid.masonry('appended', $(data)); 9 $grid.masonry('reloadItems'); 10 $grid.masonry('layout'); 11 }); 12}); 13

投稿2016/09/04 03:06

masayoshi0222

総合スコア162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

appended というメソッドがあるようですね。

Adds and lays out newly appended item elements to the end of the layout.

Masonry · Methods

投稿2016/02/04 09:57

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/04 11:13

ご回答ありがとうございます! appendedを調べながら少し試してみました。 2ページがオートロードされるタイミングで appendedしてあげるのは想像できるのですが なかなか実現できず...。 もし宜しければ もう少し詳しいコードを教えていただけますと幸いです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問