我有一个大页面,底部有一个“加载更多”按钮;每次点击“加载更多”都会通过 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>
加载附加内容后,我可以要求 Facebook 重新解析整个页面FB.XFBML.parse();
(这会导致这些 div 变成实际的类似按钮)。这工作得很好,但是,它很快就会变慢,因为 Facebook 重新解析页面上已有的内容,而不仅仅是新内容。每次用户单击“加载更多”时,它都会解析整个页面,因此 FB 功能要做的事情越来越多。
现在有个好消息:FB 解析方法的文档 say:
...要仅评估文档的一部分,您可以传入一个
元素。
FB.XFBML.parse(document.getElementById('foo'));
所以我想,好吧,当用户单击“加载更多”时,我会将新的 HTML 包装在一个独特的文件中div
,然后使用 jQuery 遍历div
,找到所有 Facebook 标签并要求 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 & append
newDivName = "d"+String(new Date().valueOf());
var $newHtml = $("<div id='"+newDivName+"'>"+html+"</div>");
c.append($newHtml);
// walk through new HTML and get all Facebook "like" buttons and parse them
$('#'+newDivName+' .fb-like').each(function() {
FB.XFBML.parse(this);
});
}
}
});
});
没有错误消息,它只是不产生任何结果。控制台的调试代码看起来很完美,它找到了所有正确的元素。
UPDATE在这个简单的 jsfiddle 上玩它:http://jsfiddle.net/pnoeric/NF2jz/4372/
UPDATE 2我还尝试将代码从 HTML5 更改为 FBML (点击本页的“获取代码”查看差异),这不仅具有相同的结果,而且现在只会在 ajax 调用上加载一个附加按钮,而不是两个。所以情况变得更糟了!您可以在此处使用 FBML 版本:http://jsfiddle.net/pnoeric/4QkbX/2/