下部に「さらに読み込む」ボタンがある大きなページがあります。「さらに読み込む」をクリックするたびに、AJAX を介してより多くのコンテンツが読み込まれます。そのコンテンツの一部は、Facebook の「いいね」ボタンとコメント ボタンです。
<div class="fb-like" data-href="http://mysite.com/a<?=$x ?>" data-width="100" data-layout="button_count" data-show-faces="false" data-send="false"></div>
<div class="fb-comments" data-href="http://mysite.com/a<?=$x ?>" data-width="435"></div>
追加のコンテンツを読み込んだ後、Facebook にページ全体を再解析するように依頼できますFB.XFBML.parse();
(これにより、これらの div が実際のいいね! ボタンとコメント フォームに変わります)。これは完全に機能しますが、Facebook は新しいコンテンツだけでなく、既にページにあったコンテンツを再解析するため、すぐに遅くなります。ユーザーが「さらに読み込む」をクリックするたびに、ページ全体が解析されるため、FB 機能が実行できることはますます多くなります。
ここで朗報があります。FB parse のドキュメントには、Facebook に要素を 1 つだけ解析するように依頼できると書かれています。そこで私は、ユーザーが「さらに読み込む」をクリックしたときに、その新しい HTML を一意の でラップし、div
jQuery を使用してdiv
を調べ、すべての Facebook タグを見つけて、Facebook にそれらだけを解析するように依頼することにしました。いい考えですね。しかし、私はそれを機能させることはできません。:-)
したがって、このトリックを実行するはずのコードは次のとおりです。
// "c" is my container div (a jQuery object, i.e. c = $('#container'); )
// "load more" button
$('#loadmore').click(function() {
$.ajax({
url: "/loadmore.php",
success: function(html) {
if(html) {
// wrap new HTML in special div
newDivName = "d"+String(new Date().valueOf());
var $newHtml = $("<div id='"+newDivName+"'>"+html+"</div>");
// append it to existing content, and tell Isotope
c.append($newHtml);
if(c.hasClass('isotope-loaded')) { c.isotope( 'appended', $newHtml ); }
// walk through new HTML and get all Facebook "like" buttons and parse them
$('#'+newDivName+' .fb-like').each(function() {
console.log('xfbml parsing .'+this.attr('class')+' and data-href '+this.attr('data-href'));
FB.XFBML.parse(this);
});
}
}
});
});
しかし、私は得ています:(Uncaught TypeError: Object #<HTMLDivElement> has no method 'attr'
これは、私の each() が正しく機能していないことを示しています)...なぜですか?
更新:この問題を解決するための回答が以下に見つかりましたが、まだ機能していません。新しい質問を参照してください:個々の要素の FB.XFBML.parse() は何もしません