2014-01-15 77 views
3

我使用这个代码为Facebook SDK初始化如何在Dart中使用Facebook SDK?

window.fbAsyncInit = function() { 
    FB.init({ 
     appId : '{app id}', 
     status : true, 
     cookie : true, 
     xfbml : true 
    }); 
}; 

(function(d){ 
    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.js"; 
    ref.parentNode.insertBefore(js, ref); 
}(document)); 

为了从Facebook使用这些个人信息,我用飞镖代码

void showFacebook(Event e, var detail, Node target) { 
    JsObject fb = context["FB"]; 
    fb.callMethod("getLoginStatus", [checkLoginStatusCallback]); 
} 

void checkLoginStatusCallback(response) { 
    print("checkLoginStatusCallback"); 
    if(response["status"] == "connected") { 
    showPhoto(response["authResponse"]["userID"]); 
    } 
    else { 
    authUser(); 
    } 
} 

void authUser() { 
    print("authUser"); 
    JsObject fb = context["FB"]; 
    fb.callMethod("login", [loginCallback]); 
} 

void loginCallback (response) { 
    print("loginCallback"); 
    if(response["authResponse"]) { 
    showPhoto(response["authResponse"]["userID"]); 
    } 
} 

这些方法,但初始化失败,错误Uncaught InvalidCharacterError: The string contains invalid characters.

深入探究Facebook SDK我发现了这个错误的原因。初始化函数试图发送HTTP创建一个iframe请求

httpProxyFrame = createIframe({ 
    url: httpDomain + proxyUrl, 
    name: 'fb_xdm_frame_http', 
    id: 'fb_xdm_frame_http', 
    root: container, 
    'aria-hidden':true, 
    title: IFRAME_TITLE, 
    'tab-index': -1 
}); 

功能createIframe做此检查

if (hasNamePropertyBug()) { 
    frame = document.createElement('<iframe name="' + name + '"/>'); 
} else { 
    frame = document.createElement("iframe"); 
    frame.name = name; 
} 

功能hasNamePropertyBug做到这一点

function hasNamePropertyBug() { 
    return typeof hasBug === 'undefined' 
     ? test() 
     : hasBug; 
}; 

function test() { 
    var form = document.createElement("form"), 
       input = form.appendChild(document.createElement("input")); 
    input.name = guid(); 
    hasBug = input !== form.elements[input.name]; 
    form = input = null; 
    return hasBug; 
}; 

至于document.createElement使用飞镖的domCreateElement功能,其中包含一个元素,hasBug变量等于true,因为它比较GeneratedWrapper包装元素。

所以,hasNamePropertyBug回报true这个代码抛出错误

document.createElement('<iframe name="' + name + '"/>'); 

所以,我的问题是如何达特环境中使用Facebook SDK?

+0

不是最优雅的解决方案,但'hasBug'似乎是全球性的,那么在做任何FB的东西之前将它设置为'true'就可以了?名称属性错误只适用于IE7及以下版本,而Dart不支持。如果你不需要迎合传统浏览器,这可能是可行的。 – MarioP

+0

@MarioP看看http://connect.facebook.net/en_US/all/debug.js'hasBug'是'hasNamePropertyBug'函数的局部变量,它是动态创建的。似乎更容易覆盖整个'hasNamePropertyBug'函数,但我不知道它是可能的 –

+0

也许我错过了一些东西,但它仍然看起来像它在全局对象上定义的。 'var hasBug;',正好在空行和函数test()的定义之上。 – MarioP

回答

0

从您的代码片段中,SDK未被初始化。您将window.fbAsyncInit分配给初始化SDK的函数,但该函数从未被调用。

+0

在加载SDK脚本后动态调用'window.fbAsyncInit'。看看http://connect.facebook.net/en_US/all/debug.js搜索'fbAsyncInit'关键字,你会得到它。 –

+0

哎呀。感谢您指出了这一点。 –

0

我有完全相同的问题。

经过检查这个bug后,我发现问题出在shadown_dom包里面,而不是dart本身。

因为现在我的目标是使用原生shadown dom支持的浏览器,删除<script src="packages/shadow_dom/shadow_dom.min.js"></script>为我解决了这个问题(但是打破了向后兼容性)。

相关问题