2013-03-02 21 views
7

Na naszym blogu znajduje się link, na którym użytkownicy mogą publikować nasze artykuły na swojej osi czasu. Otwiera się popup, a użytkownicy wysyłają posty na Facebooka, a następnie pojawia się tam popup i przekierowuje na "www.oursite.com". Jak zamiast tego zamykamy okienko, gdy użytkownik kończy publikację lub klika przycisk anulowania? Zgodnie z this so question nie można tego zrobić, ale post Huffington go zrozumiał, ale patrząc na ich kod, nie możemy tego zrozumieć. Jako przykład, przycisk the facebook share otworzy okno podręczne, a następnie zamknie się, gdy opublikujesz artykuł lub anulujesz.Jak zamknąć popup po opublikowaniu na Facebooku?

Oto, co mamy:

FB.init({appId: "90210", status: true, cookie: true}); 

     function postToFeed() { 

     // calling the API ... 
     var obj = { 
      method: 'feed', 
      redirect_uri: 'http://www.oursite.com/', 
      link: 'http://www.oursite.com/', 
      picture: 'http://www.oursite.com/png.png', 
      name: 'Some title', 
      caption: '', 
      description: '' 
     }; 

     function callback(response){ 
      window.close(); // doesn't do anything 
      //document.getElementById('msg').innerHTML = "Post ID: " + response['post_id']; 
     } 

     FB.ui(obj, callback); 
     } 

Staraliśmy dodanie window.close(); w wywołaniu zwrotnym (a także self.close();), próbowałem pozostawić redirect_uri puste (i próbowałem całkowicie zostawić redirect_uri, ale jest to wymagane).

+0

Może ta odpowiedź może pomóc: http://stackoverflow.com/a/2520861/1427942 – Eich

Odpowiedz

15

Przekieruj do http://oursite.com/#close_window. Następnie na stronie głównej witryny wpisz coś takiego:

if (window.location.hash == '#close_window') window.close();.

+2

nie działa w Chrome – Manuel

+0

Chrome nie pozwala zamknąć okno, które zostało otwarte przez inny skrypt – levi

0
<script>if (window.location.hash.indexOf("#close_window") != -1) window.close();</script> 
17

Wydaje się, że przyjęte rozwiązanie nie działa ze względu na fakt, że Facebook teraz stykowych niczego po hash i zastępuje go post_id = xxxxx.

Rozwiązanie nr 1 (jeśli ufasz FB nie to zmienić w niedalekiej przyszłości):

if(window.location.search.indexOf('post_id')==1) window.close(); 

Rozwiązanie nr 2 (jeśli chcesz trochę więcej Ubezpieczenia ze zmianami i nie zrobić przeszkadza drugi plik): utworzyć nowy plik html closewindow.html:

<html><body><script>window.close()</script></body></html> 

i link do niej w przekierowania.

+0

Rozwiązanie # 2 jest genialne, lol, dziękuję. – Lauro182

8

Po całym dniu pracy nad tym problemem, mam bardzo dobre rozwiązanie, które chciałbym udostępnić. Zamiast używać zestawu SDK z FB.ui(), odkryłem, że mogę tego uniknąć całkowicie, ręcznie otwierając własne wyskakujące okienko do https://www.facebook.com/dialog/feed. Robiąc to w ten sposób, redirect_uri działa zgodnie z oczekiwaniami. Dopóki użytkownik nie kliknie przycisku, aby wyświetlić okno dialogowe, nie zostanie uruchomiony żaden program blokujący wyskakujące okienka.

Nie sądzę, że istnieje jakikolwiek kompromis z tym kodem, a jeśli cokolwiek, jest o wiele łatwiejszy w użyciu niż rzeczywisty pakiet SDK.

kod Mój JavaScript (które można zapisać jako FacebookFeedDialog.js) wygląda następująco:

/* by Steven Yang, Feb 2015, originally for www.mathscore.com. This code is free for anybody to use as long as you include this comment. */ 
function FacebookFeedDialog(appID, linkTarget, redirectTarget) { 
    this.mParams = { 
    app_id: appID, 
    link: linkTarget, 
    redirect_uri: redirectTarget, 
    display: "popup" 
    } 
}; 

/* Common params include: 
    name - the title that appears in bold font 
    description - the text that appears below the title 
    picture - complete URL path to the image on the left of the dialog 
    caption - replaces the link text 
*/ 
FacebookFeedDialog.prototype.addParam = function(key, value) { 
    this.mParams[key] = value; 
}; 

FacebookFeedDialog.prototype.open = function() { 

    var url = 'https://www.facebook.com/dialog/feed?' + encodeCGIArgs(this.mParams); 
    popup(url, 'feedDialog', 700, 400); 
}; 

/* Takes a param object like this: 
    { arg1: "value1", arg2: "value2" } 
    and converts into CGI args like this: 
    arg1=value1&arg2=value2 

    The values and args will be properly URI encoded 
*/ 
function encodeCGIArgs(paramObject) { 

    var result = ''; 

    for (var key in paramObject) { 
    if (result) 
     result += '&'; 
    result += encodeURIComponent(key) + '=' + encodeURIComponent(paramObject[key]); 
    } 

    return result; 
} 

function popup(mylink,windowname,width,height) { 
    if (!window.focus) return; 
    var href; 
    if (typeof(mylink) == 'string') 
    href=mylink; 
    else 
    href=mylink.href; 
    if (!windowname) 
    windowname='mywindow'; 
    if (!width) 
    width=600; 
    if (!height) 
    height=350; 
    window.open(href, windowname, 'resizable=yes,width='+width+',height='+height+',scrollbars=yes'); 
} 

Oto przykładowy plik HTML, który używa powyższy kod javascript:

<HTML> 
<BODY> 
<SCRIPT type="text/javascript" src="FacebookFeedDialog.js"></SCRIPT> 
<SCRIPT> 
var dialog = new FacebookFeedDialog(yourAppIDGoesHere,yourDestinationURLGoesHere,yourCloseWindowURLGoesHere); 
dialog.addParam('name','This is my title'); 
dialog.addParam('description','This is the description'); 
dialog.addParam('picture',yourImageURLGoesHere); 
dialog.addParam('caption','This is the caption'); 
</SCRIPT> 

<A href="javascript:dialog.open()">Open facebook dialog</A> 
</BODY> 
</HTML> 

Twój closeWindow html plik może wyglądać tak:

<SCRIPT> 
window.close(); 
</SCRIPT> 
+0

Dzięki temu człowiek, po walce z tym przez kilka godzin, jest idealnym rozwiązaniem! Uratowałeś mój dzień! –

+0

Miło być docenionym! – Steven

1

To nie jest bezpośrednia odpowiedź na To oryginalne pytanie, ale może pomóc innym przybyć tutaj.

Jest bardziej wydajny sposób to zrobić, który pozwala na podjęcie działań na stronie pochodzące gdy akcja zakończyła się pomyślnie:

Na stronie pochodzenia:

var shareWindow; 

function openShareWindow() { 
    // See https://developers.facebook.com/docs/sharing/reference/share-dialog 
    shareWindow = window.open('https://www.facebook.com/dialog/share?app_id=...&display=popup&redirect_uri=...'); 
} 

function shareCompleted() { 
    if (shareWindow) { 
    shareWindow.close(); 
    shareWindow = null; 

    // The share was successful, so do something interesting here... 
    } 
} 

na stronie masz ustaw jako redirect_uri, które zwykle mapowany coś http://myserver.com/share/close:

window.opener.shareCompleted(); 

teraz masz pewność, okno akcji zamknie się i będziesz mógł podjąć działania na stronie początkowej, jeśli będzie to konieczne.

Uwaga: shareCompleted musi być dostępny w przestrzeni nazw okna głównego dla tej pracy. Jeśli zawijania wszystkie swoje JavaScriptu, jak powinno być, a następnie upewnij się, że:

window.shareCompleted = shareCompleted; 
3

UPDATE: Dodaj ten skrypt na swojej stronie przekierowania:

if (document.referrer == "https://www.facebook.com/" && (window.location.href.indexOf('post_id=') != -1 || window.location.hash == '#_=_')) { 
    window.close(); 
} 
+0

działa dobrze :) –

2

Wystarczy usunąć parametr redirect_uri od adres URL.

Podobnie jak here.

+0

Czy to działa teraz dla nikogo (lipiec 2017 r.)? Kiedy klikam na "tutaj", mogę pisać, ale okno się nie zamyka, po prostu siedzi na https://www.facebook.com/dialog/return/close#_=_ –

Powiązane problemy