非同期のタイミングの問題があります。組積造のレイアウトコードは、コンテンツが読み込まれる前に実行されます。
したがって、すべてのコンテンツがロードされるまで、石積みを呼び出すのを待つ必要があります。タイムアウトを使用したくなるかもしれません。これは競合状態を引き起こす傾向があります。
理想的には、embedlyはより優れたAPIを持ち、ajax呼び出しと同じようにある種の遅延promiseオブジェクトを返します。残念ながら、きれいなものは何もないようですので、いくつかの逆立ちをしなければなりません。
成功:コールバックを定義する場合は、明らかにコンテンツを自分で挿入する必要があります。
幸い、embedly()は、コンテンツがロードされて表示された後、コールバックをバインドできる独自のイベントを発生させます。
これを実現するためのより洗練された方法はおそらくたくさんありますが、醜いグローバルを使用した簡単な例のために、ロードされたコンテンツの数を追跡します。埋め込みイベントが発生してコンテンツの一部が読み込まれたことを示すたびに、カウンターをインクリメントします。一致した要素の総数に達すると、すべてのコンテンツが読み込まれたことがわかり、石積みと呼ばれます。
きれいではありませんが、機能します:http: //jsfiddle.net/sJ5vc/
//embedly
var matches = $('.box').find('a').length;
var loaded = 0;
// we call this from the embedly callback after all
// content has been loaded.
function callMasonry() {
var $container = $('#main-container');
$container.imagesLoaded(function() {
$container.masonry({
itemSelector: '.box',
isAnimated: true,
isFitWidth: true
});
});
}
var result = $('.box').find('a').embedly({
maxWidth: 260,
wmode: 'transparent',
method: 'after',
chars: 50,
width: 260,
key: ':cd54253e69944ae18ad5ece38b4d0e1e' //temporal
}).bind('embedly-oembed', function(e, oembed) {
// not as elegant as I would like but increment
// the counter. Once we have gotten to
// the number of matches call masonry
//
// It would be much cleaner if embedly could return some kind
// of deferred object that gets resolved after all matched
// content has been loaded.
loaded++;
console.log("loaded " + oembed.title);
if (loaded == matches) {
callMasonry();
}
});;