2010-10-02 27 views
15

Ho una pagina (page 1) che accetta richieste di posta, esegue alcune operazioni e visualizza alcuni dati alla fine.jquery - invia post in modo sincrono (non ajax)

Da un'altra pagina (page 2), desidero reindirizzare a page 1 quando si fa clic su un pulsante, ovviamente inviando tutti i dati rilevanti richiesti da page 1 tramite POST.

Posso, ovviamente, usare il vecchio hack di avere un modulo invisibile sulla pagina, inserendo tutti i dati di cui ho bisogno usando jquery, subito dopo che l'utente ha fatto clic sul pulsante e submit() automaticamente. Ma questo sembra ingombrante: è molto più bello usare la sintassi simile a $.post, piuttosto che iniziare a manipolare l'html. $.post sarebbe perfetto, se fosse effettivamente reindirizzare alla pagina e non effettuare la richiesta in modo asincrono (non posso semplicemente reindirizzare a page 1 dopo che il post ajaxy è stato completato dal page 1 ha bisogno dei dati per visualizzare qualcosa).

C'è un modo per fare ciò che voglio con jquery, o le brutte forme invisibili sono l'unica via d'uscita?

PS

So che ci sono altri modi contorti per raggiungere quello che voglio, per esempio utilizzando $.post e basta piantare HTML del rispondono nella pagina siamo attualmente, ma voglio solo sapere se c'è un semplice modo modo di fare ciò con jquery

risposta

0

Immagino che la risposta sia che non esiste un modo semplice. Per una funzione generale che aggiunge questa capacità, vedere la risposta di Greg W.

0

Se si deve inviare una richiesta POST, il modulo invisibile è una delle migliori opzioni.

Se l'applicazione funziona con una richiesta GET, vorrei codificare i dati nel querystring e fare a.

document.location.href =

È possibile utilizzare jQuery.serialize per generare la stringa di query.

-2

html:

<form id="myform" method="get" acction="page2"> 
    <!-- data --> 
</form> 

JS:

$('#myform').bind('submit', function(ev) { 

    ev.stopPropagation(); 

    var ok = true; 
    //manipulate html and 'ok' 

    return ok; // if ok == false, don't execute post 


}); 
15

questo mi ha dato un'idea per un po 'di funzione di jQuery per imitare il comportamento $ .post come hai descritto. Usa ancora le forme invisibili sullo sfondo, ma la sintassi per essa è relativamente pulita e diretta.

$(document).ready(function(){ 
    $('#myButton').PostIt('post.php', {foo:'bar', abc:'def', life:42}); 
    $('#myOtherButton').PostIt('post.php', dataObjectFromSomewhereElse); 
}); 

$.fn.PostIt = function(url, data){ 

    $(this).click(function(event){ 

     event.preventDefault(); 

     $('body').append($('<form/>', { 
      id: 'jQueryPostItForm', 
      method: 'POST', 
      action: url 
     })); 

     for(var i in data){ 
      $('#jQueryPostItForm').append($('<input/>', { 
      type: 'hidden', 
      name: i, 
      value: data[i] 
      })); 
     } 

     $('#jQueryPostItForm').submit(); 
    }); 
} 
+0

Mi rendo conto che è solo un esempio, ma secondo le specifiche, le chiavi in ​​oggetto JSON dovrebbe essere stringhe e come tale circondato da virgolette. Quel genere di cose mi ha causato un sacco di mal di testa quando ho incontrato JSON per la prima volta. ;-) – Flo

+0

Interessante. Non ho mai dovuto mettere le virgolette sulle mie chiavi JSON a meno che la chiave stessa non fosse una parola riservata come "classe" o qualcosa del genere. Suppongo che mettere le virgolette su tutto sia un modo per garantire che tu non abbia mai quel problema, ma preferisco il modo in cui appare senza citazioni. –

+0

Ulteriori informazioni su questo argomento: http://stackoverflow.com/questions/2348867/why-are-some-object-literal-properties-quotated-and-others-not –

9

ho adattato il codice di Greg W ad una funzione rettilineo che si può chiamare nel codice:

function postIt(url, data){ 

    $('body').append($('<form/>', { 
     id: 'jQueryPostItForm', 
     method: 'POST', 
     action: url 
    })); 

    for(var i in data){ 
     $('#jQueryPostItForm').append($('<input/>', { 
     type: 'hidden', 
     name: i, 
     value: data[i] 
     })); 
    } 

    $('#jQueryPostItForm').submit(); 
} 
+1

È necessario rimuovere la riga event.preventDefault(); –

+0

Fatto, grazie lulhuh. – crizCraig