2010-08-26 11 views
59

Moja przykładowa aplikacja na Facebooku działa wczoraj w Chrome. Strona integruje Facebook reklamowy Silverlight za pomocą zestawu SDK JavaScript. Mogę sprawdzić podstawowy status logowania, zalogować się na Facebooku, uzyskać imię i wylogować się.Facebook podaje błąd "Niechroniona próba dostępu do ramki z URL-em" w przeglądarce Chrome

Dzisiaj, bez zmian z mojej strony, jest on uszkodzony w Chrome z błędem JavaScript, który jest bardzo często spotykany w wynikach wyszukiwania Google, ale nie ma prawdziwych odpowiedzi. Nadal działa świetnie w IE i Firefox.

Oto publiczny URL:

http://www.andrewdothay.net/prj/facebook/

Po otwarciu konsoli JavaScript w przeglądarce Chrome, to wyrzuca tony tych błędów:


Niebezpieczne JavaScript próbę uzyskania dostępu do ramki z adresem URL

http://www.facebook.com/login.php?api_key=151352704876752&cancel_url=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df1175dd3f%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&channel_url=http%3A%2F%2Fwww.andrewdothay.net%2Fprj%2Ffacebook%2F&display=popup&fbconnect=1&locale=en_US&method=auth.login&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3c546942%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session=1&sdk=joey&session_version=3&v=1.0 z ramki z adresem URL http://www.andrewdothay.net/prj/facebook/.

Domeny, protokoły i porty muszą być zgodne.


Jakieś pomysły na temat tego, co się tutaj dzieje w Chrome?


Aktualizacja

odkryłem, że Chrome na dzisiejszym maszyna została blokuje wyskakujące okienko logowania kiedy wzywającą FB.login(), ale wiem, że nie był już te komunikaty o błędach 190 wczoraj w konsoli JavaScript.

Kiedy dopuszczam wyskakujące okienka w przeglądarce Chrome, działa ona dla użytkownika końcowego, ale wszystkie te nowe komunikaty o błędach zabijają moją diagnostykę jako programisty.

+0

Bardzo dziwne. Dostaję ten błąd dość często na facebookowe aplikacje w chrome, a czasami coś podobnego w FF. Jednak zwykle pojawia się błąd tylko raz, a następnie wszystko działa zgodnie z oczekiwaniami. – Matt

Odpowiedz

28

Znalazłem rozwiązanie. Jeśli wykonasz FB.login bez akcji użytkownika, webkit blokuje wyskakujące okienka.

Na przykład użyłem systemu zaproszeń w moim projekcie. Był wpis/tekst, aby wprowadzić kod zaproszenia. Sprawdziłem, czy kod zaproszenia jest dostępny z żądaniem ajax/post. jeśli jest dostępny, uruchamiam FB.login(). Jak zgadujesz, przeglądarka zablokowała wyskakujące okienka i mnóstwo błędów pojawiło się na konsoli js.

Musisz więc uruchomić FB.login() po akcji użytkownika. Wprowadzę facebookowy przycisk logowania między ajax/post i FB.login(). Użytkownicy będą musieli go kliknąć - co jest do bani - ale nie zobaczą problemu.

Przy okazji problem pojawia się za kilka dni. Myślę, że chodzi o system zaufania przeglądarki. Kiedy go tworzysz, odwiedzasz wiele razy, przeglądarka myśli, że jest niezawodny na początku. Nie jestem pewien co do tej części, ale moje rozwiązanie działa.

+1

Oznacza to, że nie możemy użyć FB.Event.subscribe ('auth.statusChange', onStatus); ? – BeaverProj

+1

@BeaverProj Nie próbowałem tego, więc nie wiem. –

+0

Jak blisko działania użytkownika musi być połączenie FB.login? Otrzymuję wyskakujące okienko, ale po prostu pojawia się komunikat "Wystąpił błąd. Spróbuj ponownie później". Mam przycisk wywołujący funkcję, która następnie sama wywołuje FB.login. Czy uważasz, że nie jest wystarczająco bezpośredni? –

1

Mücahit Yılmaz ma rację. Weź przykład wklejony poniżej i jeśli użyjesz metody setTimeout(), to się nie uda, w przeciwnym razie zadziała. Nadal dostaję komunikat ostrzegawczy w pętli, dopóki nie zaloguję się poprawnie, ale jest to niewielka cena do zapłacenia. Jestem pewien, że użytkownicy tego nie zobaczą.

$(document).ready(function() { 
$("#facebook_link").click(function() { 
    //setTimeout(fb); 
    fb(); 
    return false; 
}); 

function fb() { 
    FB.getLoginStatus(function(response) { 
     if (response.session) { 
      // logged in and connected user, someone you know 
      gotResponse(response); 
     } else { 
      // no user session available, someone you dont know 
      FB.login(function(response) { 
       if (response.session) { 
        // user successfully logged in 
        gotResponse(response); 
       } else { 
        // user cancelled login, do nothing 
       } 
      }); 
     } 
    }); 
} 

function gotResponse(response) { 
    console.dir(response); 
} 

});

Łatwo jest odtworzyć: zaloguj się na Facebooku w innej karcie, a następnie spróbuj tego kodu, a nie zobaczysz żadnych ostrzeżeń. Wyloguj się, a następnie wypróbuj kod i otrzymasz ostrzeżenia. Dzieje się tak, ponieważ trafia on do bloku .login.

5

W moim przypadku było to spowodowane tym, że JS na Facebooku były ładowane wiele razy na jednej stronie: jedna do zalogowania, a druga do przycisku "Lubię to". Usunięcie odwołania w module "Lubię to" oszczędza dzień.

+1

Podobne dla mnie. Dzwoniłem do FB.init po zainicjowaniu SDK z adresem URL //connect.facebook.net/en_US/all.js#xfmbl=1&appId=[appId] - Myślę, że xfmbl = 1 powoduje niejawny FB.init, chociaż na facebooku dokumentacja nie jest jednoznaczna. Kiedy usunąłem oddzielne połączenie do FB.init, problem zniknął. – xgretsch

+0

'xfmbl' (które musi być przeczytane" transfumble ") nie wydaje się mieć znaczenia. Miałem dokładnie ten sam problem. – Potatoswatter

1

Miałem ten problem z przeglądarką Chrome i było to spowodowane moimi ustawieniami chrome. Miałem ustawioną przeglądarkę, aby nie zezwalać stronom trzecim na ustawianie danych cookie. Zezwalanie na wyskakujące okienka nie było dla mnie problemem. Kiedy tworzony jest Facebook iFrame, musi on ustawić plik cookie, który następnie wykorzystuje do śledzenia, czy użytkownik musi się zalogować. Jeśli ten plik cookie nie może być ustawiony, witryna się nie powiedzie. Jedną z rzeczy, która przydałaby się w api facebooku byłoby ustawienie, które pokazuje, kiedy coś się nie udaje. Nie uważam tego za wydarzenie, które można subskrybować i przypisać oddzwanianie.

Oto link do sdk FB javascript na subskrypcje. Odpowiednia jest każda odpowiedź dotycząca znalezienia wywołania zwrotnego dla nieudanych żądań.
https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

0

Rozwiązanie Mücahit Yılmaz również zadziałało. Nie potrzebowałem dostępu do informacji o użytkowniku, więc usunąłem skrypt logowania z przykładowej aplikacji. Usunięto również komunikat powitalny i wszelkie informacje wymagające informacji zapisanych w zmiennej $basic.

1

W moim przypadku problem był związany z tagiem <div id="fb-root"></div>. Nie umieszczałem go od razu po otworzeniu tagu <body>, as recommended by the docs.

Po umieszczeniu go we właściwym miejscu, błąd "Niebezpieczny JavaScript ..." został zatrzymany.

2

Usunięcie opcji "xfbml: true" z mojego wywołania FB.init naprawiło to dla mnie.

miałem problem w domyślnej przeglądarce internetowej na Androidzie Jelly Bean

1

iw moim przypadku problem był związany z typem protokołu: od:

<div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx" 

do:

<div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx" 

ponieważ mój sklep internetowy nie używał https usunąłem 's' z atrybutu data-href z LikeBox.

+1

Myślę, że możesz po prostu umieścić //www.facebook.com/.... Zobacz: http: //stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just –