`

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上的“现实世界...

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

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

    Professional XMPP Programming with JavaScript and jQuery.pdf

    Facebook uses XMPP technology as part of its chat system. Google uses XMPP to power Google Talk and its exciting new Google Wave protocol. Collecta has built a real-time search engine based ...

    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. ...

    Parse-Facebook-OAuth-login-example:Parse平台中一种简单的OAuth登录Facebook的方法

    它显示了如何使用使用Facebook登录和使用Facebook Graph API检索数据。 您可以在查看演示。 设置 在Parse上创建了一个新应用。 请检查。 在所需的目录中键入parse new ,使用您的Parse凭据进行身份验证,然后选择...

    launch-vehicle-fbm:适用于Facebook Messenger的事件驱动的SDK

    除了Messenger API的包装外,您还可以获得: 会话存储,用于存储消息之间的状态 自动填充的个人资料信息,因此您可以从任何地方按名称进行寻址 听众问候和帮助文本遵循最佳做法 易于向您的机器人添加指标 支持在多...

    发射器:用于事件代码的JS EventEmitter基础

    事件发射器 Facebook的EventEmitter是一个... var emitter = new EventEmitter ( ) ; emitter . addListener ( 'event' , function ( x , y ) { console . log ( x , y ) ; } ) ; emitter . emit ( 'event' , 5 , 10 )

    网站聊天系统jQChat.zip

    jQChat 是一个类似 facebook/gmail 的聊天工具的 jQuery 插件,是一个基于 JavaScript 的网站聊天系统。具有以下特点: 支持多用户聊天 支持多国语言 支持消息弹出 ...

    new-portfolio-site:修改后的个人网站。 使用React,Express和Node.js构建

    技术领域React节点/ Express HTML / CSS / JavaScript忽略的文件前端–依赖文件夹: BackendAPI.js 包括grAPI(用于访问后端) trackingID(用于Google Analytics(分析))后端– Util文件夹insta.js(访问...

    follower:从社交网络获取数据

    这个库是逐渐服从的,即它尝试使用需要最少授权的 API(一些已知的和其他未知的),然后最终求助于 OAuth。 基本示例 获取 URL 的共享计数 var follower = require ( 'follower' ) ; var shares = new follower . ...

    JAVA上百实例源码以及开源项目源代码

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

    Easy Laravel5 A Hands On Introduction Usinga Real-World Project

    I’ll also introduce Laravel Elixir, a new feature for automating otherwise laborious tasks such as JavaScript transpiling and CSS minification. You’ll also learn how to integrate several popular ...

    happn-wrapper:Happn包装器库

    const happn = new HappnWrapper ( ) const facebookAccessToken = 'my-facebook-access-token' happn . authorize ( facebookAccessToken ) . then ( ( ) =&gt; happn . getRecommendations ( ) ) . then ( ( { ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情... ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    WordPress Top Plugins.pdf

    WordPress plugin API 19 PHP references 19 CSS 19 JavaScript 20 Troubleshooting plugins 20 Editing plugins 21 Summary 22 Table of Contents [ ii ] Chapter 2: Generating Content 23 GD Star Rating...

    [Mastering.Node.js(2013.11) 精通Node.js

    Extending JavaScript 9 Events 10 Modularity 12 The Network 13 V8 15 Memory and other limits 16 Harmony 18 The process object 19 The Read-Eval-Print Loop and executing a Node program 21 Summary 23 ...

    登录页面源码

    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//...

    BobBuilder_app

    Facebook Del.icio.us Reddit Stumbleupon Newsvine Technorati Mr. Wong Yahoo! Google Windows Live Send as Email Add to your CodeProject bookmarks Discuss this article 85 Print ...

    Laraboot: Laravel 5 For Beginners

    Minimum Javascript Skills . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Errata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 ...

Global site tag (gtag.js) - Google Analytics