2012-11-30 11 views
5

Abbiamo lavorato su un'applicazione web e abbiamo appena finito, ma c'è una cosa che ci infastidisce (anche se non significa che fermerà la produzione.)nascondi le variabili passate nell'URL

Quando chiamiamo una delle pagine (index.html), a volte dobbiamo passare una variabile nell'URL (searchid). Quindi otteniamo una pagina come http://domain.com/index.html?searchid=string.

Preferiamo non mostrare il ?searchid=string, ma non sono sicuro di come lo faremmo.

Il mio gruppo non possiede la pagina index.html (ma stiamo lavorando con il gruppo che lo fa), quindi non so quanto saremmo in grado di fare con qualcosa come .htaccess o simile.

Stavo pensando alla variabile POST, ma non so come riceverla con solo HTML e jQuery. Un'altra persona nel mio gruppo ha pensato che dopo la pagina caricata potessimo rimuoverla dall'URL, ma presumo che avremmo bisogno di un aggiornamento della pagina che quindi perderebbe comunque i dati.

Sto cercando di evitare XY problema in cui il problema è X e chiedo di Y, quindi qual è il modo giusto per rimuovere la variabile dall'URL?

+0

Quello che non sto capendo è il motivo per cui vorresti rimuovere la stringa di query dall'URL. Il contenuto della pagina cambia in modo tale che la stringa di query non è più rilevante? – zzzzBov

+1

'.htaccess' ti permetterebbe di stimolare l'url, che può essere trasformato in qualcosa come http: // domain.com/searchfor/string'. Sarebbe abbastanza? Se stai cercando di sbarazzarti completamente di 'string', non penso che sia possibile senza il POST. E non puoi leggere i dati POST da html/js, solo dal lato server. – bfavaretto

+0

Perché ti dà fastidio che stai facendo un'applicazione riposante? – epascarello

risposta

2

tua domanda sembra indicare che la pagina di destinazione non è e non è sarà alimentato da un po 'di script lato server. Se questo è il caso, io suggerirei di cambiare la querystring ad un hash, che ha il vantaggio di essere direttamente modificabile senza innescare una pagina-carico:

http://yourdomain.com/page.html#search=value

<script type='text/javascript'> 
    // grab the raw "querystring" 
    var query = document.location.hash.substring(1); 

    // immediately change the hash 
    document.location.hash = ''; 

    // parse it in some reasonable manner ... 
    var params = {}; 
    var parts = query.split(/&/); 
    for (var i in parts) { 
    var t = part[i].split(/=/); 
    params[decodeURIComponent(t[0])] = decodeURIComponent(t[1]); 
    } 

    // and do whatever you need to with the parsed params 
    doSearch(params.search); 
</script> 

Anche se, sarebbe meglio per ottenere alcuni script sul lato server coinvolti qui.

+0

Sembra che sia il più semplice da implementare, consegnando il codice all'altro gruppo ora. – Rob

0

È possibile riscrivere l'URL utilizzando l'API della cronologia di JavaScript. History.js è una libreria che funziona molto bene.

Detto questo, non penso che sia necessario rimuovere la stringa di query dall'URL, a meno che non si modifichi dinamicamente il contenuto della pagina per rendere irrilevante l'attuale stringa di query.

+0

Siamo, e in generale è un brutto grosso. – Rob

6

È possibile utilizzare l'API di storia, ma richiede un browser moderno

history.replaceState({}, null, "/index.html"); 

che causerà il vostro URL di apparire come /index.html senza ricaricare la pagina

Maggiori informazioni qui:

Manipulated the browser history

+0

Questa è una buona soluzione, ma sarà più lavoro da implementare per questo cambiamento. Upvote! – Rob

+0

Questa è di gran lunga la migliore risposta, ma dovresti includere, forse, come nascondere parametri specifici (ad esempio 'http: //example.com/index.html? Search = cats & utm_source = app') dove vuoi nascondere il fonte per l'analisi ma si desidera includere la ricerca in modo che gli utenti possano condividere il collegamento o aggiungerlo ai segnalibri. –

0

Si potrebbe inviare i dati, quindi lasciare che il server include i dati pubblicati nella pagina, ad esempio:

echo "<script> post_data = ".json_encode($_POST)." </script>"; 

Questo funziona cross-browser.

Problemi correlati