我可以使用带有动态脚本标签插入的Facebook Javascript SKD吗?

我可以使用带有动态脚本标签插入的Facebook Javascript SKD吗?,javascript,html,facebook,Javascript,Html,Facebook,我在努力实现什么。 要创建一个加载Facebook Javascript SDK的模块,而不必将该脚本标记粘贴到HTML中并手动输入应用程序详细信息,是的,这似乎是在浪费时间,但对我来说似乎更有意义。 例如,该模块将获取一个包含详细信息的配置,所有内容都可以通过Javascript进行设置,而不是将初始化代码保存在HTML文件中,将其余逻辑保存在脚本文件中 我的问题。 当我动态附加脚本和 我犯了一个错误 FB.init has already been called - this could

我在努力实现什么。 要创建一个加载Facebook Javascript SDK的模块,而不必将该脚本标记粘贴到HTML中并手动输入应用程序详细信息,是的,这似乎是在浪费时间,但对我来说似乎更有意义。 例如,该模块将获取一个包含详细信息的配置,所有内容都可以通过Javascript进行设置,而不是将初始化代码保存在HTML文件中,将其余逻辑保存在脚本文件中

我的问题。 当我动态附加脚本和


我犯了一个错误 FB.init has already been called - this could indicate a problem 我的代码中确实正确设置了Facebook变量,这是为了演示。 我已经在这上面读了很多次Facebook文档


是否有一种仅使用Javascript动态添加tje FB JS SKD块的方法?

FB提供的异步JS代码是一种仅在Javascript中生成FB SDK代码的方法。现在,您似乎试图将PHP风格编码到JS中

如果需要异步加载模块,则应使用模块加载程序(RequireJS或YepNope等)


触发错误消息的原因可能是您在FB SDK URL中添加了一些参数(例如,
//connect.facebook.net/fr\u CA/all.js#xfbml=1&appId=123456789“
)。如果是这样,只需删除散列
#
之后的所有内容。此外,请确保您没有两次加载SDK。

我尝试的方法导致了奇怪的加载顺序,初始化代码将在加载SDK之前加载,从而导致奇怪的错误

对逻辑的修改解决了这个问题。没有太大的不同,但现在它工作得很好

Facebook = {};

Facebook = {
    config: {
        APP_ID: 'APP_ID',
        APP_URL: 'APP_URL',
        CHANNEL_URL: 'CHANNEL_URL'
    }

};
Facebook.init = function() {
    var fbEl = document.createElement('div');
    fbEl.id = 'fb-root';
    document.body.insertBefore(fbEl,document.body.children[0]);
    window.fbAsyncInit = function() {
    // init the FB JS SDK
        FB.init({
            appId      : 'APP_ID', // App ID from the App Dashboard
            channelUrl : 'CHANNEL_URL', // Channel File for x-domain communication
            status     : true, // check the login status upon init?
            cookie     : true, // set sessions cookies to allow your server to access the session?
            xfbml      : true  // parse XFBML tags on this page?
        });

        // Additional initialization code such as adding Event Listeners goes here

    };

    // Load the SDK's source Asynchronously
    // Note that the debug version is being actively developed and might 
    // contain some type checks that are overly strict. 
    // Please report such bugs using the bugs tool.
    (function(d, debug){
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all" + (debug ? "/debug" : "") + ".js";
        ref.parentNode.insertBefore(js, ref);
    }(document, /*debug*/ false));
};

Facebook.init();

我不确定到底出了什么问题,但是你的间接性比你需要的多了一个层次,这使得整个事情变得太复杂了。为什么不做一些类似的事情呢

var Facebook = {
   config:{ //etc
   }
};

window.fbAsyncInit = function() {
  FB.init(//etc
  )
};

(function(d, debug){
  var js, id = //etc - this injects the SDK script reference into the dom.
})(document, false);

谢谢,是的,我尝试过PHP风格,这是我尝试过的众多尝试之一。