[facebook] لا يتم إغلاق مربع حوار FB.login على Google Chrome


Answers

بالنظر إلى عمر هذا المنشور ، أظن أن الملصق قد حل هذا ؛ ومع ذلك ، نظرًا لأن هذا يعد أيضًا موردًا للآخرين الذين يبحثون عن حل مشكلات مماثلة ، فقد اعتقدت أنني سأدرج تجربتي في حالتها فقط.

اكتشفت أن ما تسبب في عرض المشكلة نفسه بالنسبة لي هو نسيان بطريق الخطأ تضمين event.preventDefault(); في معالج المستمع "انقر" في jQuery. كان مربع حوار تسجيل الدخول في facebook يظهر ويسمح لي بتسجيل الدخول ولكن لا يختفي. كانت المشكلة هي أن موقع الويب كان يقوم بإجراء ما بعد التصرف الافتراضي ، والذي كان يتداخل مع وظيفة معاودة الاتصال من فيس بوك.

Question

أتصل بـ FB.login() على حدث نقرة في طلبي. يظهر مربع الحوار كما هو متوقع ، ولكن عندما ينتهي المستخدم من تسجيل الدخول إلى Facebook (و / أو تفويض التطبيق) ، لا يتم إغلاق مربع الحوار. بدلاً من ذلك ، يتم تحميل صفحة بيضاء (داخل مربع الحوار) ويتغير العنوان إلى وكيل XD .

يحدث هذا فقط على Google Chrome (أستخدم أحدث إصدار متاح حاليًا لنظام التشغيل Windows 7).

لا يحدث هذا إذا كان Chrome في وضع التصفح المتخفي.

يعمل المكون الإضافي الاجتماعي "fb-login" جيدًا على Chrome.

لاختبار / تصحيح هذا الأمر ، قمت بإنشاء تطبيق Facebook جديد باستخدام إعدادات الفانيلا. التغيير الوحيد الذي قمت به هو تعيين عنوان URL الخاص بالموقع في إعدادات التطبيق. فيما يلي تعليمات HTML البرمجية التي يمكنك استخدامها لإعادة إنشاء هذا الخطأ.

كود عينة لإعادة القضية

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Chrome Bug Test</title>
    </head>
    <body>
        <button onclick="dologin()">Login using Facebook</button>

        <div id="fb-root"></div>
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <script>
          FB.init({
            appId  : '[YOUR APP ID HERE]',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml  : true  // parse XFBML
          });
        </script>

        <script type="text/javascript">
            function dologin(){
                FB.login(function(r){
                    if(console && console.log) {
                        console.log(r);
                    }
                });
            }
        </script>

    </body>
</html>

إعدادات Facebook التي حاولت تغييرها

  1. تعيين نطاق الموقع ، لم يغير أي شيء.
  2. لم يساعد استخدام ملف channelUrl وملف قناة مخصصين أيضًا.

الأخطاء ذات الصلة التي تم تتبعها على Facebook

المشكلات ذات الصلة هنا على

لقد رأيت الكثير من الناس يتعرفون على هذا ، لكن ما يزعجني هو أنني لم أتمكن من إيجاد حل ملموس لهذا الأمر. لم يستجب Facebook لتقارير الأخطاء حتى الآن. أحد الحلول هو التخلص من شفرة التوثيق المبنية على جافا سكريبت والقيام بذلك فقط باستخدام آلية سيرفيديسايد (Facebook PHP SDK). أود تجنب ذلك بسبب ضيق الوقت.

هل يملك أي أحد فكرة كيف يمكن اصلاح هذا؟




إجابة مختصرة عن السؤال أعلاه:

تحميل البرنامج النصي all.js عبر https .

<script src="https://connect.facebook.net/en_US/all.js"></script>

إجابة أطول إذا كنت تقوم باستكشاف مشكلة مشابهة للسؤال الأصلي:

استخدم Google Chrome لمحاولة تسجيل الدخول. بمجرد تسجيل الدخول وإغلاق النافذة المنبثقة الفارغة على الشاشة ، اضغط F12 . يؤدي ذلك إلى إظهار أدوات مطوّري البرامج لمتصفح Chrome. انقر فوق علامة التبويب وحدة التحكم ، ونأمل أن ترى الخطأ. ما سترونه على الأرجح يتعلق بقضايا XD (عبر النطاقات).

حتى إذا كانت مشكلتك الخاصة مختلفة عن القضية التي كنت أواجهها ، فيجب أن تقودك أعلاه في الاتجاه الصحيح.

كانت مشكلتي / الحل الخاص بي وثائق V6 SDK الخاصة بـ Facebook C # - يقوم البرنامج التعليمي بتحميل البرنامج النصي all.js باستخدام عنوان URL يبدأ بـ // - ثم يقوم بتحميل البرنامج النصي من نفس مخطط موقعي (الذي كان http). بعد تسجيل الدخول ، حاولت النافذة المنبثقة إعادة توجيهي من https تسجيل الدخول إلى موقع الويب الخاص بي و bingo ، لدينا قضية XD. كان الحل هو تحميل البرامج النصية على وجه التحديد من https://connect.facebook.net/en_US/all.js كما يلي:

  // Load the SDK Asynchronously
  (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 = "https://connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
   }(document));

تصحيح:

بعد بعض الاعتبارات ، قد يؤدي هذا النهج في السماح بإعادة التوجيه إلى http إلى الإضرار بأمن النظام من خلال السماح للبيانات الموجودة في هذا الطلب بقراءة من قبل شخص آخر ثم إعادة استخدامها. لم أتمكن من العثور على أي وثائق أو أمثلة ذات صلة ، وبالتالي لم أستطع أن أختتم بطريقة أو بأخرى ، YMMV.




لقد واجهت نفس المشكلة في IE9 ، ويبدو أنها تنبع من الترقية إلى Flash Player 10. الإجابات المقترحة لم تنجح بالفعل بالنسبة لي وفقدت الأمل في محاولة إصلاحها منذ العثور على http://bugs.developers.facebook.net/show_bug.cgi?id=12112 تغطيها. لكن Henson نشر إجابة عن سؤال مماثل صممه لي. في جافا سكريبت في موقعي الرئيسي ، قمت بإزالة هذه السطور

    FB.UIServer.setLoadedNode = function (a, b) {
       //HACK: http://bugs.developers.facebook.net/show_bug.cgi?id=20168
        FB.UIServer._loadedNodes[a.id] = b;
    };

والآن يعمل. (ملاحظة: لم أتحقق مما إذا كانت مشكلة IE8 تهدف إلى التغلب على العوائد.)






Related