Несколько fbAsyncInit?

На своем сайте я использую асинхронную загрузку Facebook JS SDK. Чтобы настроить его, я использую стандартную функцию FB.init внутри функции window.fbAsyncInit.

Однако проблема в том, что на моем сайте эта функция есть на каждой странице. Однако, когда я нахожусь на подстранице, я не могу напрямую добавить функцию JS из-за дизайна моего сайта, мне приходится копировать и вставлять всю функцию и добавлять свои биты.

Я не думаю, что несколько fbAsyncInit возможны, так как лучше всего это реализовать?


person TheLQ    schedule 09.02.2012    source источник


Ответы (3)


Вместо этого вы можете использовать это, чтобы проверить, есть ли у вас уже fbAsyncInit, и в этом случае связать его вместе:

var oldCB = window.fbAsyncInit;
window.fbAsyncInit = function(){
    if(typeof oldCB === 'function'){
        oldCB();
    }
    //Do Something else here
 };
person Eduardo    schedule 01.03.2012
comment
Упс, я забыл об этом вопросе. После дополнительных поисков я нашел этот способ расширения функции. Надеюсь, это поможет кому-то другому. Спасибо! - person TheLQ; 01.03.2012
comment
Вы знаете, это официальный способ сделать это? Или если Facebook предложит другой метод/есть решение для этого? Кажется, это довольно распространенная вещь, если только вы не хотите поместить весь свой JS-код в одно место. - person powerbuoy; 29.03.2012
comment
@powerbuoy Я не могу сказать, есть ли официальный способ, отличный от этого. Но это не взлом. Это довольно распространенный шаблон проектирования для javascript. - person Eduardo; 30.03.2012
comment
@EduardoCereto - хорошо, спасибо. Да, я знаю, я делал то же самое раньше при прикреплении событий, дело в том, что когда я пробовал это вчера, это не сработало, и мне кажется странным, что FB не дает нам более простой способ сделать это (что-то вроде fbAsynInit.addFunc(function () {}) было бы неплохо). - person powerbuoy; 30.03.2012

Иногда API facebook может вызвать fbAsyncInit еще до того, как ваш второй fbAsyncInit даже запустится. Это исправит этот случай:

        if (window.fbAsyncInit.hasRun === true) {
            setup(); // do something
        } else {
            var oldCB = window.fbAsyncInit;
            window.fbAsyncInit = function () {
                if (typeof oldCB === 'function') {
                    oldCB();
                }
                setup(); // do something
            };
        }
person Kim T    schedule 20.08.2013

в fbAsyncInit есть "статическое" свойство

Попробуйте ниже

if (window.fbAsyncInit && window.fbAsyncInit.hasRun) {
    // do sth
}
person huang47    schedule 05.09.2012
comment
Я не думаю, что это будет ждать, пока запустится fbAsyncInit. - person TheLQ; 05.09.2012