2010-08-26 1 views
59

Meine Beispiel-Facebook-App funktionierte gestern in Chrome großartig. Die Seite integriert Silverlight ad Facebook über das JavaScript SDK. Ich kann den grundlegenden Login-Status prüfen, mich bei Facebook anmelden, sich anmelden und abmelden.Facebook gibt "Unsicher JavaScript versuchen, auf Frame mit URL zuzugreifen" Fehler in Chrome

Heute, ohne Änderungen von mir, ist es in Chrome mit einem JavaScript-Fehler, der sehr häufig in Google-Suchergebnissen, aber keine echten Antworten ist gebrochen. Es funktioniert immer noch gut in IE und Firefox.

Hier ist die öffentliche URL:

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

Wenn Sie die JavaScript-Konsole in Chrome öffnen, wirft es Tonnen dieser Fehler:


Unsafe JavaScript Versuch zuzugreifen Rahmen mit 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 von Rahmen mit URL http://www.andrewdothay.net/prj/facebook/.

Domänen, Protokolle und Ports müssen übereinstimmen.


Haben Sie Ideen, was hier mit Chrome passiert?


aktualisieren

entdeckte ich, dass Chrome auf Maschine heute wurde das Login-Pop-up-Blocker, wenn ich FB.login() rief, aber ich weiß, ich nicht diese 190 Fehlermeldungen bekommen in der JavaScript-Konsole gestern.

Also, wenn ich Pop-ups in Chrome erlaube, funktioniert es für einen Endbenutzer, aber all diese neuen Fehlermeldungen bringen meine Diagnoseerfahrung als Entwickler zum Erliegen.

+0

Sehr seltsam. Ich bekomme diesen Fehler ziemlich oft auf Facebook-Apps in Chrome, und manchmal auch etwas ähnliches in FF. Allerdings bekomme ich den Fehler normalerweise nur einmal, und dann funktioniert alles wie erwartet. – Matt

Antwort

28

Ich habe die Lösung gefunden. Wenn Sie FB.login ohne Benutzeraktion ausführen, blockiert webkit die Popups.

Zum Beispiel habe ich ein Einladungssystem für mein Projekt verwendet. Es gab eine Eingabe/einen Text, um den Einladungscode einzugeben. Ich habe überprüft, dass der Einladungscode mit einer Ajax/Post-Anfrage verfügbar ist. Wenn es verfügbar ist, führe ich FB.login(). Wie Sie vermuten, Popup-Blockierung blockiert und Tonnen von Fehlern erschien an der js-Konsole.

Sie müssen also FB.login() nach einer Benutzeraktion ausführen. Ich werde einen Facebook-Login-Button zwischen Ajax/Post und FB.login() setzen. Die Benutzer müssen darauf klicken - das ist scheiße - aber sie werden kein Problem sehen.

Btw, Problem tritt in ein paar Tagen auf. Ich denke, es geht um das Vertrauenssystem des Browsers. Wenn Sie es entwickeln, besuchen Sie es oft, der Browser denkt zuerst, dass es zuverlässig ist. Ich bin mir über diesen Teil nicht sicher, aber meine Lösung funktioniert.

+1

Das bedeutet also, dass wir FB.Event.subscribe ('auth.statusChange', onStatus) nicht verwenden können; ? – BeaverProj

+1

@BeaverProj Ich habe das nicht versucht, ich weiß es nicht. –

+0

Wie nah muss die Benutzeraktion für den FB.login-Aufruf sein? Ich bekomme ein Popup, aber es steht nur "ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal". Ich habe eine Taste, die eine Funktion aufruft, die dann selbst FB.login aufruft. Denkst du, das ist nicht direkt genug? –

1

Mücahit Yılmaz ist korrekt. Nehmen Sie das Beispiel, das ich unten eingefügt habe, und wenn Sie die setTimeout() Methode verwenden, schlägt es fehl, ansonsten funktioniert es. Ich bekomme immer noch die Warnmeldung in einer Schleife, bis ich mich richtig anmelde, aber es ist ein kleiner Preis zu zahlen. Ich bin mir sicher, dass die Nutzer es nicht sehen werden.

$(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); 
} 

});

Es ist leicht zu reproduzieren: Anmelden in einem anderen Tab auf Facebook, dann diesen Code versuchen, und Sie werden keine Warnungen sehen. Logout, dann versuchen Sie den Code und Sie erhalten die Warnungen. Es ist, weil es den .login Block trifft.

5

In meinem Fall war es wegen Facebook JS geladen mehrmals auf einzelne Seite: eine für die Anmeldung und die zweite für „gefällt mir“ Button. Entfernen der Referenz im "Like" -Modul speichert den Tag.

+1

Ähnlich für mich. Ich rief FB.init nach der Initialisierung des SDK mit URL //connect.facebook.net/en_US/all.js#xfmbl=1&appId=[appId] - Ich denke, die xfmbl = 1 verursacht eine implizite FB.init, obwohl die Facebook die Dokumentation ist dazu nicht schlüssig. Als ich den getrennten Anruf zu FB.init entfernte, verschwand das Problem. – xgretsch

+0

'xfmbl' (das muss" transfumble "gelesen werden) scheint keinen Unterschied zu machen. Ich hatte genau das gleiche Problem. – Potatoswatter

1

Ich hatte dieses Problem mit einem Chrom-Browser und es war aufgrund meiner Chrom-Einstellungen. Ich hatte den Browser so eingestellt, dass Drittanbieter-Websites das Setzen von Cookie-Daten verbieten. Das Zulassen von Popups war für mich kein Problem. Wenn der Facebook-iFrame erstellt wird, muss er ein Cookie setzen, mit dem er nachverfolgen kann, ob der Benutzer sich anmelden muss. Wenn dieser Cookie nicht gesetzt werden darf, schlägt die Site fehl. Eine Sache, die in der Facebook API nützlich wäre, wäre eine Einstellung, die zeigt, wenn etwas nicht funktioniert. Ich sehe das nicht als ein Ereignis, das man abonnieren und einem Rückruf zuordnen kann.

Hier ist ein Link zum FB Javascript sdk auf Abonnements. Jede Antwort auf einen Rückruf für fehlgeschlagene Anfragen würde geschätzt werden.
https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

0

Die Lösung von Mücahit Yılmaz funktionierte auch für mich. Ich musste nicht auf die Benutzerinformationen zugreifen. Daher entfernte ich das Anmeldeskript aus der Beispielanwendung. Entfernen Sie auch die Willkommensnachricht und alle Informationen, die Informationen benötigen, die in der Variablen $basic gespeichert sind.

1

In meinem Fall war das Problem zu <div id="fb-root"></div> Tag zusammen. Ich habe es nicht sofort nach der Eröffnung <body> Tag, as recommended by the docs.

Nachdem es an der richtigen Stelle setzen, die „Unzulässiges JavaScript ...“ Fehler gestoppt.

2

das Entfernen 'XFBML: true' Option von meinem FB.init Anruf für mich fixiert.

ich das Problem in der Standard-Internet-Browser auf Android Jelly Bean

1

Und in meinem Fall das Problem Protokolltyp verwandt war mit war: aus:

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

zu:

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

als mein Web-Shop nur knapp sein Ziel Verwendung https entfernt I 's' von Daten-href-Attribute des LikeBox.

+1

Ich denke, Sie können einfach setzen //www.facebook.com/.... Siehe: http: //stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just –

Verwandte Themen