我已經在類似主題看過不少答案,但找不到導致此行爲的原因。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'));
這只是當您嘗試創建彈出窗口時發生的情況,但它不直接與用戶交互(如點擊)關聯。通過嵌套到異步調用的回調中,它不再是直接的。這不僅限於Safari,它也可能發生在其他瀏覽器中。對於FB.login,FB文檔甚至會明確提醒這一事實。 _「現在我警告用戶」 - 不,你必須從FB.login回調中取出它,然後直接調用它。 (對話框不需要任何權限,也不需要用戶登錄到您的應用程序。) – CBroe
Ish ... FB.getLoginStatus應該被緩存,並且因爲我在頁面加載時調用它,不需要再往返服務器。 _「隨後調用FB.getLoginStatus將從此緩存響應中返回數據。」_如果用戶未登錄,登錄窗口應打開。它在登錄部分,因爲即使我沒有包括其餘的代碼,我抓取一些數據(電子郵件地址+ post_id),並抓住我需要登錄用戶。問題是登錄是被彈出窗口阻止程序阻止的那個。 –
是的 - 因爲你也將它嵌套到異步調用中。無論getLoginStatus是發出請求還是使用緩存的結果都無關緊要 - 它不會改變您的後續代碼僅在回調函數內部調用,並且將其從事件中「分離」的事實。 – CBroe