`

Facebook New JavaScript Api

阅读更多

  Facebook新的api与旧的相比,有了很大的不同,更加倾向于简约实用,摒弃了旧代码的臃肿繁琐.抛弃了Cross-Domain Receiver Page.旧有的Cross Domain经常有卡在xd_receiver.htm页面没反应的情况发生,新api很好的解决了这个问题.

初始化,登录,授权,FQL,UI等各个方面都有了很大的变化,首先看初始化的不同:

 

Old API:

<script type="text/javascript" src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php">
<script language="javascript">
FB_RequireFeatures(["Api"], function() {
    FB.Facebook.init('api_key', 'xd_receiver.htm', {
        "ifUserConnected": function(){
            // -- connected
        },
        "ifUserNotConnected": function(){
            // -- not connected
        }
    });
});

 

New Api(JS初始化的时候,可以分为两种方式,异步和同步):

异步方式:

<div id="fb-root"></div>
<script language="javascript">
window.fbAsyncInit = function() {
      FB.init({appId: facebook.facebook_app_id, status: true, cookie: true, xfbml: true});
      FB.Event.subscribe('auth.sessionChange', facebook.api_sessionChange);
      FB.getLoginStatus(facebook.api_sessionChange);
};

(function() {
    var e = document.createElement('script');
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());

 

同步方式:

<div id="fb-root"></div>
<script language="JavaScript" src="http://connect.facebook.net/en_US/all.js">

<script language="javascript">
  FB.init({appId: facebook.facebook_app_id, status: true, cookie: true, xfbml: true});
  FB.Event.subscribe('auth.sessionChange', facebook.api_sessionChange);
  FB.getLoginStatus(facebook.api_sessionChange);
</script>
 

新api提供了函数FB.Event.subscribe(),用来检测facebook登录状态变化.

新的api需要用户授权时,调用的函数跟Login一样,只是多了需要授权的参数.

FB.login(function(response) {
  if (response.session) {
    if (response.perms) {
      // user is logged in and granted some permissions.
      // perms is a comma separated list of granted permissions
    } else {
      // user is logged in, but did not grant any permissions
    }
  } else {
    // user is not logged in
  }
}, {perms:'read_stream,publish_stream,offline_access'});

 

新的api在简化了之后,也带来了诸多不便,首先,feed发布的时候,有些许bug,facebook规定在feed长度超过1000的字符的时候,用 post的方式传递数据,不过facebook在传递数据的时候,传错了值,应该将attatch对象json_encode后传递,却直接穿了对象过 去,导致feed发布不了,修正方式是,参考source code修改FB.Content.postTarget函数定义.

 

FB.Content.postTarget = function(opts) {
    var form = document.createElement('form');
    form.action = opts.url;
    form.target = opts.target;
    form.method = 'POST';
    FB.Content.appendHidden(form);

    FB.Array.forEach(opts.params, function(val, key) {
      if (val !== null && val !== undefined) {
        var input = document.createElement('input');
        input.name = key;
        if (typeof val == "object" || typeof val == "array") {
		        input.value = FB.JSON.stringify(val);
		    } else {
		    		input.value = val;
		    }
        form.appendChild(input);
      }
    });

    form.submit();
    form.parentNode.removeChild(form);
};

 

本来代码是:

postTarget: function(opts) {
    var form = document.createElement('form');
    form.action = opts.url;
    form.target = opts.target;
    form.method = 'POST';
    FB.Content.appendHidden(form);

    FB.Array.forEach(opts.params, function(val, key) {
      if (val !== null && val !== undefined) {
        var input = document.createElement('input');
        input.name = key;
        input.value = val;
        form.appendChild(input);
      }
    });

    form.submit();
    form.parentNode.removeChild(form);
}

 

facebook的fbml实际上是加载一个iframe,加载之前显示loading,facebook这里采用的是html5 的,facebook这里的实现偶尔会出现问题,一直loading,iframe显示不出来,facebook开发团队还没有给出解决方法,还是通过修 改js source解决

首先增加一个变量:

/********* fix fbjs api start:{set method used for FB.UIServer.iframe} *************/
FB.UIServer._SDialogMethod   = '';
/********* fix fbjs api end *************/

 修改FB.UIServer.prepareCall方法,增加以下代码,记录当前的ui method:

/********* fix fbjs api start:{set method used for FB.UIServer.iframe} *************/
  FB.UIServer._SDialogMethod = params.method.toLowerCase();
/********* fix fbjs api end *************/

 修改FB.UIServer.iframe方法,iframe加载的时候,直接显示:

 

/********* fix fbjs api start:{dialog loading bug,set default iframe and float div size} *************/
if ('stream.publish' == FB.UIServer._SDialogMethod) {
    var _SLoaderState    = false;	// -- 是否显示loading,这里改为false,不显示
    var _SVisibleState   = true;	// -- ui dialog是否可见,设为true,可见
    // -- set iframe background default size,only set width so it will show at center,if set height, the background can't resize if iframe size changed
    var _SInitSize  = { width: 575, height:'100%'};
    call.size.height    = 290;
} else if ('bookmark.add' == FB.UIServer._SDialogMethod) {
	var _SLoaderState    = false;
    var _SVisibleState   = true;
    // -- set iframe default size
    var _SInitSize  = { width: 460, height:'100%' };
} else if ('auth.permission' == FB.UIServer._SDialogMethod) {
    var _SLoaderState    = false;
    var _SVisibleState   = true;
    // -- set iframe default size
    if ('email' == call.params.ext_perm) {
  	var _SInitSize  = { width: 627, height:200};
      call.size.height    = 200;
    } else {
    	var _SInitSize  = { width: 627, height:350};
        call.size.height    = 350;
    }
} else {
    var _SLoaderState    = true;
    var _SVisibleState   = false;
    var _SInitSize  = false;
}
/********* fix fbjs api end *************/

 修改FB.Dialog.create方法,修改为以下,如果有初始大小的话,设置长宽值:

if (opts.visible) {
	  /********* fix fbjs api start:{dialog loading bug,set default iframe size} *************/
    try {
      if (opts._SInit) {
          dialog.style.width  = opts._SInit.width + 'px';
            dialog.style.height  = opts._SInit.height + 'px';
      }
    } catch (e) {}
    /********* fix fbjs api end *************/
    FB.Dialog.show(dialog);
}
 

这样修改之后,feed或者bookmark发布的时候,就不会一直卡在loading那里了,尤其是后台有大量数据加载时候,比较容易卡loading

最后修改授权时的弹出窗口问题,现在授权的时候,调用的是跟登录时候一样的接口,所以授权界面会在新窗口打开,这样就会被大部分浏览器屏蔽掉,在用户至上的现在,显然是不能接受的,所以参考旧api的方法,自定义一个ui method.

 

/************* fix fbjs api start: {permission dialog} ******************/
FB.provide('UIServer.Methods', {
  'auth.permission': {
    size      : { width: 627, height: 350 },
    url       : 'connect/prompt_permissions.php',
    transform : function(call) {
      //FIXME
      if (!FB._apiKey) {
        FB.log('FB.login() called before calling FB.init().');
        return;
      }

      // if we already have a session and permissions are not being requested,
      // we just fire the callback
      if (FB._session && !call.params.perms) {
        FB.log('FB.login() called when user is already connected.');
        call.cb && call.cb({ status: FB._userStatus, session: FB._session });
        return;
      }
      
      var
        xdHandler = FB.Auth.xdHandler,
        cb        = call.cb,
        id        = call.id,
        session   = FB._session,
        cancel    = xdHandler(
          cb,
          id,
          'parent',
          true, // isDefault
          FB._userStatus,
          session),
        next      = xdHandler(
          cb,
          id,
          'parent',
          false, // isDefault
          'connected',
          session);

      FB.copy(call.params, {
        cancel_url              : cancel,
        channel_url             : window.location.toString(),
        next                    : next,
        ext_perm                : call.params.perms
      });
      delete call.cb;
      delete call.params.perms; //TODO fix name to be the same on server
      return call;
    }
  }
});
/************* fix fbjs api end ******************/

 需要授权时,调用以下函数:

FB.ui(
   {
     method: 'auth.permission',
     perms: p_permissions
   },
   function(response){
      if ('' == response) {
          p_callback('failed');
          return false;
      }
      if (response.perms && egi.test(response.perms)) {
          // -- success
          var p_state = 'success';
      } else {
          var p_state = 'failed';
      }
      if (typeof p_callback == 'function') {
          p_callback(p_state);
      }
  }
);
 

 

分享到:
评论

相关推荐

    fqb:适用于JavaScript的Facebook Graph API查询生成器

    fqb 适用于JavaScript的Facebook Graph API查询生成器一个查询构建器,可以帮助您简单地向Facebook的发出,以获取所需的特定数据。介绍关于Facebook的Graph API,您应该了解: 节点:节点代表Facebook上的“现实世界...

    javascript备课(new)

    在"javascript备课(new)"中,我们可以深入探讨JavaScript的核心概念、语法特性以及在现代Web开发中的应用。 1. **基本概念** - **变量**:JavaScript中的变量是存储数据的容器,使用`var`、`let`或`const`关键字...

    creat Facebook Application

    替换其中的`api_key`和`secret`为你自己的API Key和Secret,这两个值在Facebook开发者平台上可以获取。 发布你的应用程序,并将其上传到之前设定的Web空间。之后,将这个URL输入到画布设定的路径位置。现在,当你...

    Javascript范例

    1. 面向对象:理解JavaScript的基于原型的面向对象机制,包括构造函数、原型链、`new`操作符以及`this`关键字的应用。 2. 闭包:理解闭包的概念,它是函数内部访问外部变量的能力,常用于封装和数据隐藏。 3. 异步...

    类Facebook风格的对话框fbmodal

    fbmodal是一款专门设计为模仿Facebook对话框样式的JavaScript插件,它能够帮助开发者快速创建具有Facebook风格的弹出窗口,提升网站或应用的用户体验。 一、fbmodal的设计理念 fbmodal的核心设计理念是简洁、直观...

    前端开源库-passport-facebook

    它处理了与Facebook API交互的所有复杂细节,包括获取访问令牌、验证令牌以及获取用户的基本信息。 **集成步骤** 1. **安装依赖**:首先,你需要在你的Node.js项目中安装`passport`, `passport-facebook`和对应的...

    javaScript教程及实例讲解

    2. React:Facebook开发的用于构建用户界面的JavaScript库,强调组件化开发。 3. Vue.js:轻量级的MVVM框架,易于学习和使用。 八、JavaScript实例 1. 动态效果:如计时器、滑动菜单、轮播图等。 2. 表单验证:...

    JavaScript

    - 构造函数:通过`new`关键字创建对象实例,构造函数用于初始化新对象。 - 继承:JavaScript采用原型链实现继承,通过`Object.create()`或`__proto__`属性。 - ES6的类:引入了类的语法糖,但本质仍是基于原型的...

    JavaScript编程50例.rar

    - 对象创建:通过花括号`{}`或`new Object()`创建对象,属性和方法可以通过点或方括号符号访问。 - 属性和方法:理解原型链和原型对象,了解`__proto__`、`constructor`等关键字的作用。 5. **事件处理** - 事件...

    passport-facebook-token:使用OAuth 2.0 API使用Facebook访问令牌进行身份验证的Passport策略

    护照-Facebook-令牌 使用OAuth 2.0 API通过访问令牌进行身份验证的策略。 该模块使您可以在Node.js应用程序中使用Facebook进行身份验证。 通过插入Passport,可以轻松,毫不费力地将Facebook身份验证集成到任何支持...

    Javascript合辑

    - 构造函数:使用`function`创建类的模板,通过`new`关键字实例化对象。 - 继承:JavaScript的继承基于原型链,可以使用`prototype`属性实现。 4. **事件和事件处理** - 事件:用户与网页交互时触发的特定动作,...

    javascript教程实例

    - **构造函数**:用于创建特定类型的对象,通过`new`关键字调用。 3. **DOM操作** - **Document Object Model**:将HTML或XML文档解析成树形结构,JavaScript通过DOM API来访问和修改文档内容。 - **元素选择**...

    javascript知识大全

    - DOM树:HTML元素在JavaScript中的表示形式,可以使用DOM API进行操作。 - 事件:JavaScript可以监听和处理用户或浏览器触发的事件,如点击、滚动等。 - AJAX:异步JavaScript和XML,实现在不刷新页面的情况下与...

    GraphQLjs是GraphQL的JavaScript参考实现

    GraphQL是一种由Facebook开发并公开的查询语言,它旨在优化数据获取,使得客户端能够精确地描述它们需要的数据,而无需关心服务器如何实现。GraphQL.js是这个查询语言在JavaScript平台上的官方参考实现,允许开发者...

    JavaScript学习资料

    以上仅是JavaScript部分核心知识点,实际学习过程中,你还会接触到Ajax、Web API、Web Storage、WebSocket、前端路由、CSS选择器与样式绑定、模块打包工具如Webpack、测试框架如Jest等内容。通过"JavaScriptHelp_...

    JavaScript新手指南

    - **React**: Facebook开源的用于构建用户界面的JavaScript库。 - **Angular**: Google推出的用于构建动态Web应用的框架。 - **Vue.js**: 一种用于构建用户界面的渐进式框架,易于上手且灵活。 ### 总结 通过以上...

    ReactNative动画的一个简单声明式API使用渲染器props

    React Native 是一个由 Facebook 推出的开源框架,它允许开发者使用 JavaScript 和 React 框架来构建原生的 iOS 和 Android 应用程序。在 React Native 中,动画的实现通常涉及复杂的 JavaScript 和原生代码交互,但...

    Serverless Applications with Node.js

    And thanks to JavaScript support in AWS Lambda and powerful new serverless API tools like the Claudia.js library, you can build and deploy serverless apps end to end without learning a new language. ...

Global site tag (gtag.js) - Google Analytics