2017-03-14 24 views
0

我已經在類似主題看過不少答案,但找不到導致此行爲的原因。Facebook Javascript SDK和Safari - 無法解釋的行爲

這裏是我的腳本:

$("html").on("click",".fb",function(){ 
    var my_picture=$("#image_link_holder").attr('data-link'); 
    var file_id=$("#image_link_holder").attr('fileid'); 


    FB.getLoginStatus(function(response) { 


    FB.login(function(apiResponse){ 
    my_share="http://www.example.com/gallery.php-Q-event_id=<?php echo $event_id;?>"; 
    my_share=encodeURI(my_share+"-A-fb_cover-E-"+my_picture); 

    FB.ui(
    { 
    method:'feed', 
    link: my_share, 
    display: 'touch', 
    message: 'message', 
    caption:'caption', 
    name:"Name" 

    }) 
}, {scope: ['publish_actions','email']}); 

這工作完全在Chrome,火狐,邊緣,Android的,IE瀏覽器,但在Safari它只是閃爍的窗口,並沒有什麼事情發生。

用Safari查找任何控制檯錯誤或任何內容,但它絕對是空的。當我按下按鈕時,我看到來自Facebook的3張圖片的一些網絡請求,但就是這樣,它甚至不會觸發或顯示對其他瀏覽器中發生的任何請求: https://www.facebook.com/impression.php/

有人能說出我失蹤的一些東西嗎?這讓我精神振奮,當然它必須成爲心愛的蘋果和他們的「完美」產品。

該體驗在Mac和iOS設備中都得到了重現。 Safari瀏覽器版本:10.0.3 的iOS:模擬器10.1

這是我的加載SDK頁面上:

window.fbAsyncInit = function() { 
    FB.init({ 
     appId  : 'XXXXXXXXXXXX', 
     xfbml  : false, 
     version : 'v2.5' 
    }); 


    FB.getLoginStatus(function (response) {}); 
    }; 

    (function(d, s, id){ 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) {return;} 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
    }(document, 'script', 'facebook-jssdk')); 

回答

-1

什麼的$ @一堆牛逼 - 問題是由原因引起的事實上Safari默認有一個彈出式窗口攔截器!!!!!!即使我的事件是在點擊後立即觸發的,它仍然被彈出窗口阻止程序阻止。

有沒有什麼話我討厭那家公司多少,你如何創建用戶友好的網站,當你按照所有的文件,但它不工作,因爲有人只是決定「擰你,我們知道更好!」

現在我已經警告用戶,他/她需要去設置並確保彈出窗口阻止程序被禁用,除了它不能按預期使用頁面。

太令人沮喪了!!!!!!

+0

這只是當您嘗試創建彈出窗口時發生的情況,但它不直接與用戶交互(如點擊)關聯。通過嵌套到異步調用的回調中,它不再是直接的。這不僅限於Safari,它也可能發生在其他瀏覽器中。對於FB.login,FB文檔甚至會明確提醒這一事實。 _「現在我警告用戶」 - 不,你必須從FB.login回調中取出它,然後直接調用它。 (對話框不需要任何權限,也不需要用戶登錄到您的應用程序。) – CBroe

+0

Ish ... FB.getLoginStatus應該被緩存,並且因爲我在頁面加載時調用它,不需要再往返服務器。 _「隨後調用FB.getLoginStatus將從此緩存響應中返回數據。」_如果用戶未登錄,登錄窗口應打開。它在登錄部分,因爲即使我沒有包括其餘的代碼,我抓取一些數據(電子郵件地址+ post_id),並抓住我需要登錄用戶。問題是登錄是被彈出窗口阻止程序阻止的那個。 –

+0

是的 - 因爲你也將它嵌套到異步調用中。無論getLoginStatus是發出請求還是使用緩存的結果都無關緊要 - 它不會改變您的後續代碼僅在回調函數內部調用,並且將其從事件中「分離」的事實。 – CBroe