#javascript #facebook
#javascript #Facebook
Вопрос:
что именно делает FB.Объект арбитра внутри «connect.facebook.net/en_US/all.js «?
это что-то для связи между iframes? внутри FB есть функция inform .Арбитр, который создает невидимый iframe внутри приложения iframe.
это источник функции inform:
function (d, f, g, c, a)
{
if (FB.Canvas.isTabIframe() || FB._inPlugin amp;amp; window.postMessage || !FB._inCanvas amp;amp; FB.UA.mobile() amp;amp; window.postMessage)
{
var e = FB.JSON.stringify({
method : d, params : f, behavior : a || FB.Arbiter.BEHAVIOR_PERSISTENT
});
if (window.postMessage) {
FB.XD.resolveRelation(g || "parent").postMessage(e, "*");
return;
}
else {
try {
window.opener.postMessage(e);
return;
}
catch (b) { }
}
}
var i = FB.getDomain((c ? "https_" : "") "staticfb") FB.Arbiter._canvasProxyUrl "#" FB.QS.encode(
{
method : d, params : FB.JSON.stringify(f || {}), behavior : a || FB.Arbiter.BEHAVIOR_PERSISTENT,
relation : g
});
var h = FB.Content.appendHidden("");
FB.Content.insertIframe(
{
url : i, root : h, width : 1, height : 1,
onload : function ()
{
setTimeout(function ()
{
h.parentNode.removeChild(h);
}, 10);
}
});
}
может кто-нибудь объяснить эту функцию?
Ответ №1:
В Facebook есть класс, Arbiter
который управляет событиями. По сути, это собственная система событий Facebook. Вы можете привязать функцию к событию с помощью Arbiter.subscribe("id/id",function_name)
. "id/id"
это просто строка, которая идентифицирует пользовательское имя для события. При вызове вызываются Arbiter.inform("id/id",{data:"in an object"})
любые функции, которые были подписаны с использованием того же "id/id"
, например function_name()
, и {data:"in an object"}
передаются ему в качестве второго аргумента. (Первый аргумент справедлив "id/id"
.)
Другими словами, Arbiter.inform()
запускает события в системе событий Facebook.
Комментарии:
1. отличное объяснение, спасибо! Знаете ли вы, есть ли простой способ регистрировать все события facebook, которые отправляются в систему арбитров?
2. @user280109 Я не знаю, можете ли вы просто
Arbiter.subscribe("*/*", my_function)
или нет. Возможно, вы могли бы попробовать. Другим способом сделать это было бы перехватитьArbiter.inform()
функцию, например:var Arbi = Arbiter.inform; Arbiter.inform = function(id, data){console.log(id, data); Arbi(id, data);}