我有一個大頁面,底部有一個「加載更多」按鈕;每次點擊「加載更多」都會通過AJAX加載更多內容。這部分內容是Facebook的喜歡和評論按鈕:如何使用jQuery each()分析加載的項目
<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功能的功能越來越多。
現在這裏是好消息:docs for the FB parse say you can ask Facebook to parse just one element。所以我認爲,好吧,當用戶點擊「加載更多」時,我會將這個新鮮的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'
(它告訴我,我的每一個()工作不正常)...爲什麼?
更新:回答下面找到解決此問題,但它仍然無法正常工作。請參閱新問題:FB.XFBML.parse() on individual element does nothing
或者,爲了僅評估文檔的一部分,您可以傳入一個元素。 FB.XFBML.parse(的document.getElementById( '富'));所以它期望一個DOM節點,而不是一個jQuery對象。 – Daniel
明白了。那麼我怎樣才能從jQuery的each()方法返回的jQuery對象中獲取DOM節點呢? – Eric
這是原始節點。 $(this)接受該節點並將其封裝在jQuery中。 – Daniel