3

我想在我的页面中动态刷新一个 fb:like 插件。

例如,进入 index.html,我有:

<fb:like id="fbtest" href="http://www.urltest.com" send="true" width="450" show_faces="true"></fb:like>

(Facebook 已初始化,一切正常。)

然后,我想动态更改这个like 按钮的URL。所以,使用 jQuery,我会这样做:

$('#fbtest').attr('href', 'http://www.urltest2.com').empty().off().removeData();
FB.XFBML.parse();

而且它不起作用......它仅在我删除fb:like 标记并重新创建它时才起作用(完全相同的 DOM !)。

正如您在此处看到的:使用 JavaScript 动态更新 FB:Like URL,所有描述的方法都重新创建了 fb:like 标记...我需要刷新现有的 fb:like...而不是重新创建它。是否可以 ?

编辑:这是一个用于测试的小提琴:-):http: //jsfiddle.net/nRTkS/

谢谢!

4

2 回答 2

0

不,我不认为这是可能的。
FB.XFBML.parse方法,顾名思义,只是解析:

This function parses and renders XFBML markup in a document on the fly

一旦一个插件已经被渲染,它就不会被重新渲染,否则行为可能会有点奇怪,例如,如果您在同一页面上有多个插件,您将 url 属性更改为类似插件的一个,然后调用FB.XFBML.parse这将重新渲染整个文档和其中的插件。

所以是的,您可以确保在将要开始的元素传递给该方法时调用该方法,或者 sdk 可以只为每个插件维护一个状态并仅在更改时重新渲染,但这一切都比只需从 dom 中删除插件,输入新fb:like标签,然后调用FB.XFBML.parse.

现在,我相信这是真正的原因,但这只是一个猜测。
sdk 在包含实际插件的插件容器内创建一个 iftame。
为了更改类似操作的 url,需要进行跨域通信(对于 fb sdk),我认为只能在一个方向上进行,即从插件到包含页面(因此edge.create 事件)。

于 2012-06-03T22:49:14.083 回答
0

你当然可以这样做:

var iframe = $("iframe", "#fbtest");
iframe[0].src = iframe[0].src.replace(/&href=(.*?)&/, "&href=" + encodeURIComponent(url) +"&");
于 2012-06-03T23:13:12.280 回答