2013-03-02 1 views
7

Sul nostro blog abbiamo un link dove gli utenti possono pubblicare i nostri articoli nella loro cronologia. Si apre un popup e l'utente pubblica su facebook, quindi il popup rimane lì e reindirizza a "www.oursite.com". Come chiudiamo invece il popup quando l'utente termina la pubblicazione o fa clic sul pulsante Annulla? Secondo lo this so question non si può fare ma il post di Huffington ha capito, ma guardando il loro codice non riusciamo a capirlo. Ad esempio, il pulsante the facebook share qui aprirà un popup e quindi si chiuderà quando si pubblicherà l'articolo o si annulla.Come posso chiudere il popup dopo aver postato su Facebook?

Ecco ciò che abbiamo:

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); 
     } 

Abbiamo provato ad aggiungere window.close(); nel callback (e anche self.close();), provato a lasciare redirect_uri vuoto (e provato a lasciare fuori redirect_uri, ma è obbligatorio).

+0

Forse questa risposta può aiutare: http://stackoverflow.com/a/2520861/1427942 – Eich

risposta

15

Reindirizzare a http://oursite.com/#close_window. Quindi, nella home page del tuo sito, inserisci qualcosa del tipo:

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

+2

non funziona in cromo – Manuel

+0

Chrome non consentire di chiudere una finestra che è stata aperta da altri script – levi

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

sembra che la risposta accettata non funziona più a causa del fatto che Facebook ora spoglia nulla dopo un hash e lo sostituisce con post_id = xxxxx.

Soluzione # 1 (se vi fidate FB di non cambiare questo nel prossimo futuro):

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

Soluzione # 2 (se volete un po 'di più l'assicurazione contro il cambiamento e non fare mente un secondo file): Creare un nuovo file HTML closewindow.html:

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

e link ad esso nel reindirizzamento.

+0

Soluzione n. 2 è brillante, lol, grazie. – Lauro182

8

Dopo aver trascorso un'intera giornata a lavorare su questo problema, ho un'ottima soluzione che mi piacerebbe condividere. Invece di utilizzare l'SDK con FB.ui(), ho scoperto che posso evitarlo completamente aprendo manualmente il mio popup a https://www.facebook.com/dialog/feed. Quando lo fai in questo modo, redirect_uri funziona come previsto. Finché è necessario che l'utente faccia clic su un pulsante per far apparire la finestra di dialogo, non verrà attivato alcun blocco popup.

Non credo che ci siano compromessi con questo codice e, semmai, è molto più facile da usare rispetto all'SDK attuale.

codice mio Javascript (che si può salvare come FacebookFeedDialog.js) si presenta così:

/* 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'); 
} 

Ecco un esempio di file HTML che utilizza il codice Javascript di cui sopra:

<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> 

tuo CloseWindow html il file può avere il seguente aspetto:

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

Grazie amico, dopo aver combattuto con questo per un paio d'ore, una soluzione perfetta! Hai salvato la mia giornata !! –

+0

È bello essere apprezzato! – Steven

1

Questa non è una risposta diretta a La domanda originale, ma potrebbe aiutare gli altri ad arrivare qui.

C'è un modo più robusto per fare questo che permette di agire sulla pagina originari a condizione che la quota è stata completata con successo:

Nella pagina di origine:

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... 
    } 
} 

Nella pagina avete impostare come redirect_uri, che di solito mappa per qualcosa come http://myserver.com/share/close:

window.opener.shareCompleted(); 

Ora sei assicurato la finestra condivisione si chiuderà e sarai in grado di intervenire sulla pagina di origine, se necessario.

Nota: shareCompleted deve essere disponibile nello spazio dei nomi della finestra radice per questo lavoro. Se stai avvolgendo tutto il vostro JavaScript come si dovrebbe essere, quindi assicuratevi di:

window.shareCompleted = shareCompleted; 
3

UPDATE: Aggiungi questo script per la pagina di reindirizzamento:

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

funziona bene :) –

2

è sufficiente rimuovere il parametro redirect_uri da l'url.

Come here.

+0

Funziona per tutti questi giorni (luglio 2017)? Quando clicco su "qui", posso postare, ma la finestra non si chiude, si trova solo su https://www.facebook.com/dialog/return/close#_=_ –