2014-01-15 2 views
3

나는 페이스 북 SDK 초기화 페이스 북에서 개인 정보를 사용하기 위해, 나는 다트 코드Dart에서 Facebook SDK를 사용하는 방법?

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"]); 
    } 
} 

에서 이러한 방법을 사용하지만, 초기화 오류와 함께 실패에서

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)); 

이 코드를 사용하고 Uncaught InvalidCharacterError: The string contains invalid characters.

페이스 북 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; 
} 

document.createElement 다트의 domCreateElement 함수를 사용하여이

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; 
}; 

지금까지의 기능을 hasNamePropertyBug가하는, 요소를 래핑하는 경우 hasBug 변수는와 동일하게됩니다.은 GeneratedWrapper 래퍼와 요소를 비교하기 때문에 발생합니다.

그래서, hasNamePropertyBug 반환 true이 코드는 내 질문에 다트 환경에서 페이스 북 SDK를 사용하는 방법이다, 그래서 오류를

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

을 던져?

+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가 초기화되지 않습니다. SDK를 초기화하는 함수에 window.fbAsyncInit을 할당하지만 해당 함수는 절대로 호출되지 않습니다.

+0

SDK 스크립트가로드 된 후'window.fbAsyncInit'가 동적으로 호출됩니다. http://connect.facebook.net/en_US/all/debug.js search'fbAsyncInit' 키워드를 보시면 알 수 있습니다. –

+0

Gotcha. 그 점을 지적 해 주셔서 감사합니다. –

0

나는 똑같은 문제가있었습니다.

이 버그를 검사 한 후 문제가 shadown_dom 패키지 안에 있었고 다트 자체가 아니라는 것을 알았습니다.

현재는 어쨌든 기본 음영 처리 기능을 지원하는 브라우저를 대상으로하므로 <script src="packages/shadow_dom/shadow_dom.min.js"></script>을 제거하면이 문제가 해결되지만 이전 버전과의 호환성은 손상됩니다.

관련 문제