496 votes

Facebook rappel ajoute ' #_ = _ ' à l’URL de renvoi

Facebook rappel a commencé en ajoutant `` soulignement de hachage de l’URL de renvoi

Est-ce que quelqu'un sait pourquoi ? Quelle est la solution ?

243voto

Ryan Points 3659

via Facebook de la Plate-forme de Mises à jour:

Changement de Session Comportement de Redirection

Cette semaine, nous avons commencé l'ajout d'un fragment #_=_ à la redirect_uri quand ce champ est laissé vide. Veuillez vous assurer que votre application peut gérer ce comportement.

Pour éviter cela, réglez le redirect_uri dans votre url de connexion à la demande comme suit: (en utilisant Facebook php-sdk)

$facebook->getLoginUrl(array('redirect_uri' => $_SERVER['SCRIPT_URI'],'scope' => 'user_about_me'));

Mise à JOUR

Le dessus est exactement comme la documentation dit à résoudre ce problème. Cependant, Facebook est documenté solution ne fonctionne pas. Songez à laisser un commentaire sur le Facebook de la Plateforme de Mises à jour du blog et de suivre ce bug pour obtenir une meilleure réponse. Jusqu'alors, ajoutez à votre balise head pour résoudre ce problème:

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        window.location.hash = '';
    }
</script>

Ou une version plus détaillée de la solution (merci niftylettuce):

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        if (window.history && history.pushState) {
            window.history.pushState("", document.title, window.location.pathname);
        } else {
            // Prevent scrolling by storing the page's current scroll offset
            var scroll = {
                top: document.body.scrollTop,
                left: document.body.scrollLeft
            };
            window.location.hash = '';
            // Restore the scroll offset, should be flicker free
            document.body.scrollTop = scroll.top;
            document.body.scrollLeft = scroll.left;
        }
    }
</script>

121voto

PapaSierra Points 421

TL;DR

if (window.location.hash == '#_=_'){
    history.replaceState 
        ? history.replaceState(null, null, window.location.href.split('#')[0])
        : window.location.hash = '';
}

Version complète avec des instructions étape par étape

// Test for the ugliness.
if (window.location.hash == '#_=_'){

    // Check if the browser supports history.replaceState.
    if (history.replaceState) {

        // Keep the exact URL up to the hash.
        var cleanHref = window.location.href.split('#')[0];

        // Replace the URL in the address bar without messing with the back button.
        history.replaceState(null, null, cleanHref);

    } else {

        // Well, you're on an old browser, we can get rid of the _=_ but not the #.
        window.location.hash = '';

    }

}

Étape par étape:

  1. Nous allons entrer dans le bloc de code si l' fragment est #_=_.
  2. Vérifier si le navigateur prend en charge le HTML5 fenêtre.replaceState méthode.
    1. Nettoyer l'URL de la division de # et en ne prenant que la première partie.
    2. Dites - history afin de remplacer l'actuel état de la page avec l'URL "propre". Cela modifie l'actuelle entrée de l'historique au lieu d'en créer un nouveau. Ce que cela signifie, c'est les boutons précédent et suivant fonctionnera tout simplement la façon dont vous le souhaitez. ;-)
  3. Si le navigateur ne prend pas en charge le génial HTML 5 de l'histoire des méthodes puis il suffit de nettoyer l'URL du mieux que vous pouvez en définissant la valeur de hachage est la chaîne vide. C'est un piètre secours, car elle laisse toujours une fuite de hachage (example.com/#) et aussi il ajoute une entrée de l'historique, de sorte que le bouton précédent permet de revenir à l' #_-_.

En savoir plus sur history.replaceState.

En savoir plus sur window.location.

60voto

likebeats Points 577

Si vous souhaitez supprimer le « # » restante de l’url

11voto

mixmasteralan Points 180

Ne sais pas pourquoi ils font cela mais, vous pouvait contourner ce problème de réinitialisation le hachage en haut de votre page :

8voto

Sándor Tóth Points 448

Facebook utilise un cadre et à l'intérieur tout fonctionne à l'aide d'AJAX communication. Le plus gros problème dans ce cas est de préserver le courant de l'état de la page. Autant je comprends, Facebook a décidé d'utilisation simulée ancres. Cela signifie que si vous avez cliqué quelque part, ils simulent que comme un point d'ancrage à l'intérieur de votre page, et quand l'AJAX communication commence, ils changent l'ancre peu de votre URL.

Cette solution vous permet de vous normalement, lorsque vous essayez de recharger la page (pas d'ENTRÉE, appuyez sur la touche F5), parce que votre navigateur envoie à l'ensemble de l'URL avec des ancres à l'Facebook serveur. Par conséquent, Facebook récupère la dernière de l'état (ce que vous voyez) et vous êtes alors en mesure de continuer à partir de là.

Lorsque la fonction de rappel retourne avec #_=_ cela signifie que la page a été dans son état de base avant de la laisser. Parce que cette ancre est interprété par le navigateur, vous devez vous inquiétez pas à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X