2013-01-14 3 views
5

Sto tentando di eseguire un'anteprima post, che verrà visualizzata in un nuovo iframe di Fancybox. Da un paio di settimane cerco aiuto o buone pratiche, ma non riesco a trovarlo.Anteprima post - Trasmissione dati con AJAX e Fancybox

Il mio problema principale è passare i dati dal modulo (prima dell'aggiornamento del database) alla finestra di Fancybox. Le mie abilità AJAX sono molto scarse, quindi forse il mio problema non è così difficile.

Si prega di verificare il codice:

$('.preview2').fancybox({ 
fitToView : false, 
width  : 905, 
height  : 505, 
autoSize : false, 
closeClick : false, 
openEffect : 'none', 
closeEffect : 'none', 
ajax: { 
    type: "POST", 
    cache : false, 
    url: "preview.php", 
    data: $('#postp').serialize() 
} 
}); 

e un link di chiamata:

<a class="preview2" data-fancybox-type="iframe" href="preview.php" id="preview2">Preview</a> 

Sono quasi sicuro che tutto va bene con il file preview.php, basta inviare le variabili e la stampa in posti giusti

Qualcuno può controllare la parte Fancybox/AJAX?

+0

è o Ajax o iframe ... provare senza 'data-fancybox-type' – JFK

+0

Buono giorno JFK, sono di nuovo io. La rimozione di data-fancybox-type causa l'errore "Il contenuto richiesto non può essere caricato. Riprova più tardi". – kacper

+0

cosa c'è in "# postp"? ... hai qualche sito demo? – JFK

risposta

16

Come ho detto nei miei commenti, il pulsante di anteprima dovrebbe inviare il modulo tramite la tecnologia AJAX per ottenere i valori Anteprima Messaggio (useremo ajax invece di iframe) così:

<a class="preview2" data-fancybox-type="ajax" href="preview.php" id="preview2">Preview</a> 

allora si avrebbe bisogno di associare il pulsante di anteprima per un metodo manuale on("click") per inviare il modulo via ajax primo luogo .... e poi inviare i risultati in fancybox piace in secondo luogo:

$(document).ready(function() { 
    $('.preview2').on("click", function (e) { 
    e.preventDefault(); // avoids calling preview.php 
    $.ajax({ 
     type: "POST", 
     cache: false, 
     url: this.href, // preview.php 
     data: $("#postp").serializeArray(), // all form fields 
     success: function (data) { 
     // on success, post (preview) returned data in fancybox 
     $.fancybox(data, { 
      // fancybox API options 
      fitToView: false, 
      width: 905, 
      height: 505, 
      autoSize: false, 
      closeClick: false, 
      openEffect: 'none', 
      closeEffect: 'none' 
     }); // fancybox 
     } // success 
    }); // ajax 
    }); // on 
}); // ready 

Vedi DEMO (sentitevi liberi di esplorare il codice sorgente)

+0

Grazie mille! La tua DEMO funziona perfettamente, è ciò di cui ho bisogno. Sto cercando di eseguire il tuo script nel mio CMS. In questo momento dopo aver cliccato sul link non succede nulla, quindi penso che altri script disturbino. Darò un feedback più tardi, penso che funzionerà. Grazie ancora! :) – kacper

+0

@kacper http://meta.stackexchange.com/a/5235/173947 per ogni evenienza;) – JFK

+0

La mia reputazione è troppo scarsa per fare clic su "su", quindi posso semplicemente fare clic su "OK" :) – kacper

0

ho cercato un modo più interessante con fancybox che funziona,

nella pagina fancybox

var myvar; 
$(document).ready(function(){ 
    myvar = parent.$("#formvariwant").val(); 
}); 
+0

Grazie Theresa, proverò in questo modo nel mio nuovo progetto :) – kacper

2

non mi piace la soluzione , quindi posterò le mie indagini.

Perché il codice di scrittura con 1. .on("click", ... 2. e.preventDefault 3. $.ajax 4. this.href solo per chiamare fancybox in caso di successo, che ha già all this functions inside?

Se si decide di utilizzare Ajax invece di iframe (come in risposta accettata) si potrebbe semplicemente aggiungere type proprietà fancybox() chiamata, causa è beening selezionata, e superare tutti gli altri

$('.preview2').fancybox({ 
    type: "ajax", 
    ajax: { 
     data: $('#postp').serialize() 
    // url: "someurl.php" not needed here, it's taken from href 
    //     if you need it, e.g. you have a button, not a link 
    //     use "href" property that overrides everything 
    //     not attribute, cause it's invalid 
    } 
// href: "url_to_add_or_override_existing_one", 
// all other effects 
// afterLoad: function() { // other cool stuff } 
}); 

EDIT Come @JFK ha sottolineato che non è sufficiente, devi ottenere i dati del modulo ogni volta che fai clic sul link, quindi è necessario beforeLoad() anziché data.Finnaly:

$('.preview2').fancybox({ 
    type: "ajax", 
    beforeLoad: function() { 
     this.ajax.data = $('#postp').serialize(); 
    } 
}); 

è possibile rimuovere tutti data-* atrributes troppo

FIDDLE

BACIO

+0

@JFK quindi cos'è questo [http://prntscr.com/5so2b0](http://prntscr.com/5so2b0) quindi – vladkras

+0

@JFK forse qualcosa di sbagliato con il tuo 'loginTest2.php'? ecco [fiddle] (http://jsfiddle.net/vladkras/5s2e73tq/) e funziona. Leggete anche un po 'di [serialize() e serializeArray() difference] (http: // stackoverflow.it/a/10430571/1713660) – vladkras

+0

@JFK per quanto hai cancellato il tuo css, fammi postare [updatedd fiddle] (http://jsfiddle.net/vladkras/5s2e73tq/1/) con css da CDN. Devo anche confessare che il form di serializzazione non funziona correttamente in fancybox quando si modifica il valore di input. Sembra essere congelato allo stato di inizializzazione – vladkras