2012-12-06 14 views
5

Ho una pagina chiamata search.jsp. Quando l'utente seleziona un record e preme un pulsante di modifica, vorrei aprire una nuova pagina (nella stessa finestra) con i dati del record (che è memorizzata in un oggetto JSON e passata alla nuova pagina). Come posso usare Javascript (o jQuery) per aprire una nuova pagina e passare i dati JSON?JavaScript: come si apre una nuova pagina e si passano i dati JSON?

+0

Grazie a tutti per le risposte . Le pagine sono sullo stesso dominio. Mi scuso per non averlo incluso nel post originale. – James

risposta

1

Se le due pagine sono sullo stesso dominio, un terzo modo è quello di utilizzare HTML5 localStorage: http://diveintohtml5.info/storage.html

Infatti localStorage è appunto inteso per ciò che si vuole. Gestire i parametri GET o i riferimenti JS di finestre/documenti non è molto portabile (anche se, lo so, tutti i browser non supportano localStorage).

+1

Ho pensato che la memoria locale fosse limitata dal dominio in qualche modo (anche se non ricordo i dettagli)? Dopotutto, non vorrete che malevolo.website.com acceda al localStorage impostato da your.bank.com giusto? – machineghost

+0

Hai perfettamente ragione. La domanda è stata posta in un modo in cui pensavo che le due pagine fossero sullo stesso dominio. Modificato la risposta con la precisione. E ho trovato le altre soluzioni un po 'brutte .. – Ulflander

+1

Sì; entrambe le pagine sono sullo stesso dominio, quindi funzionerà bene. Devo solo fare attenzione a svuotare la memoria dopo l'uso. – James

2

Supponendo che le due pagine si trovino nello stesso dominio, è possibile utilizzare l'oggetto restituito creato da window.open() per accedere (e modificare) l'oggetto finestra di una finestra appena aperta.

+0

Devo mantenere la nuova pagina nella stessa finestra (ad es. Window.open ('edit.jsp', '_self')) Come posso manipolare l'oggetto finestra della pagina di modifica dalla pagina di ricerca quando la pagina di ricerca non esiste più? – James

+0

puoi fornire uno snippet di codice che può descrivere più la tua risposta – dom

1

Se il JSON è abbastanza piccolo, è sufficiente includerlo come parametro GET per l'URL quando si apre la nuova finestra.

Qualcosa di simile:

window.open(yourUrl + '?json=' + serializedJson) 
+0

Ma la risposta di Jack mi piace di più; nessun limite di lunghezza JSON e nessun pasticcio gigante di JSON nell'URL che l'utente può vedere. – machineghost

+0

Mi sono imbattuto in questa affermazione, "se JSON è abbastanza piccolo" How Small è abbastanza piccolo e quali sono i limiti coinvolti? – Jay

+1

http://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request – machineghost

1

Hmm, ad esempio, si dispone oggetto

var dataObject = { 
    param : 'param', 
    param2 : 'param2' 
}; 

È possibile tradurlo in stringa, utilizzando il metodo JSON.stringify

var dataObjectString = JSON.stringify(dataObject); 

Poi si dovrebbe utilizzare la codifica Base64 per codificare i tuoi dati (base64 metodi di codifica/decodifica possono essere easely trovati nei motori di ricerca)

var dataObjectBase64 = base64encode(dataObjectString); 

otterrete qualcosa di simile

e3BhcmFtIDogJ3BhcmFtJyxwYXJhbTIgOiAncGFyYW0yJ307 

Poi si può passare questa stringa come un parametro:

iframe src="http://page.com/?data=e3BhcmFtIDogJ3BhcmFtJyxwYXJhbTIgOiAncGFyYW0yJ307" 

Infine, azioni sulla pagina caricata retromarcia.

2

È possibile creare "al volo" un modulo con un valore di input nascosto/testo che manterrà il valore di json, quindi è possibile inviare questo modulo tramite javascript.

qualcosa di simile ...

Im utilizzando jQuery e underscore (a scopo template)

Questo è il modello

<form method='<%= method %>' action="<%= action %>" name="<%= name %>" id="<%= id %>" target="_blank"> 
    <input type='hidden' name='json' id='<%= valueId %>' /> 
</form> 

si può quindi posta utilizzarlo su javascript

function makePost(){ 
    var _t = _.template("use the template here");    
    var o = { 
      method : "POST", 
      action :"someurl.php", 
      name : "_virtual_form", 
      id : "_virtual_form_id", 
      valueId : "_virtual_value" 
     } 

    var form = _t(o); //cast the object on the template 
      //you can append the form into a element or do it in memory     
    $(".warp").append(form);   

      //stringify you json   
     $("#_virtual_value").val(JSON.stringify(json)); 
     $("#_virtual_form_id").submit(); 
     $("#_virtual_form_id").remove();       
} 

ora si fa Non devi preoccuparti della lunghezza di te json o di quante variabili inviare.

meglio!

+0

Grazie per la risposta. Credo che la soluzione di archiviazione locale (proposta da Ulflander) potrebbe essere un po 'più semplice poiché entrambe le pagine si trovano sullo stesso dominio. – James

+0

Beh, questa è una soluzione crossbrowser mentre Ulflander no, ma hai ragione la sua risposta è molto più semplice perché sta solo sfruttando le nuove funzionalità di html5. E naturalmente quando dici che questa soluzione può aiutarti quando le tue pagine sono in domini diversi. meglio ... – ncubica

0

Ecco alcuni molto semplici JavaScript puro (senza HTML, senza jQuery) che converte un oggetto JSON e lo sottopone ad un'altra pagina:

/* 
    submit JSON as 'post' to a new page 
    Parameters: 
    path  (URL) path to the new page 
    data  (obj) object to be converted to JSON and passed 
    postName (str) name of the POST parameter to send the JSON 
*/ 
function submitJSON(path, data, postName) { 
    // convert data to JSON 
    var dataJSON = JSON.stringify(data); 

    // create the form 
    var form = document.createElement('form'); 
    form.setAttribute('method', 'post'); 
    form.setAttribute('action', path); 

    // create hidden input containing JSON and add to form 
    var hiddenField = document.createElement("input"); 
    hiddenField.setAttribute("type", "hidden"); 
    hiddenField.setAttribute("name", postName); 
    hiddenField.setAttribute("value", dataJSON); 
    form.appendChild(hiddenField); 

    // add form to body and submit 
    document.body.appendChild(form); 
    form.submit(); 
} 

utilizzare alcuni di PHP come questo sulla pagina di destinazione per ottenere il JSON :

$postVarsJSON = $_POST['myPostName']; 
$postVars = json_decode($postVarsJSON); 

O, più semplicemente per JavaScript:

var postVars = JSON.parse(<?php $_POST['myPostName']; ?>); 
Problemi correlati