Facebook SDK初始化失败,FB未定义错误排查求助
嘿,这个问题我之前帮不少开发者解决过,“FB is not defined”大多是因为SDK加载或者初始化的顺序出了问题,咱们一步步排查:
先确认SDK加载脚本是否正确添加
你有没有在fbAsyncInit定义之后,加入Facebook的SDK加载代码?这步绝对不能少,而且顺序很重要——必须先定义window.fbAsyncInit,再加载SDK,不然SDK找不到初始化函数,自然不会生成FB对象。正确的加载脚本长这样:<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>检查脚本的放置位置
你说把初始化代码放在布局页面开头之后,会不会是放在了<head>标签里,导致DOM还没准备好就执行了?或者有没有被其他脚本阻塞?建议把相关脚本挪到<body>标签的末尾,这样能确保页面元素加载完成后再处理SDK初始化。另外,一定要把fbAsyncInit直接挂载在window对象上,别把它嵌套在其他函数里,不然SDK找不到它。验证fbAsyncInit是否真的执行了
最简单的方法是在你的初始化函数里加一行日志:window.fbAsyncInit = function () { console.log('fbAsyncInit 执行了!'); // 加这行 FB.init( { appId : 'xxxxxxxxx', autoLogAppEvents : true, xfbml : true, version : 'v3.0' }); // 其他代码... }然后打开浏览器控制台(按F12)刷新页面,看看有没有这行日志。如果没有,说明SDK根本没触发这个函数,大概率是加载顺序错了或者SDK脚本没加载成功。
检查App ID和SDK版本
先确认你的appId有没有输错字符,别多打或少打了。另外v3.0版本实在太老了,Facebook早就停止对旧版本SDK的支持了,建议换成当前稳定的版本号(比如v18.0,你可以去开发者后台确认最新的兼容版本),旧版本可能会加载失败或者出现兼容性问题。排查缓存和跨域问题
有时候浏览器缓存会导致旧的SDK脚本没更新,试试强制刷新页面(Ctrl+F5)。另外,一定要在Facebook开发者后台把你的网站域名添加到“有效OAuth跳转URI”和“网站域名”列表里,不然跨域限制会阻止SDK正常加载和初始化。
内容的提问来源于stack exchange,提问作者ChumpStick

