2010-03-29 11 views
110

Qual è un modo semplice per rimuovere la querystring da un percorso in Javascript? Ho visto un plugin per Jquery che utilizza window.location.search. Non posso farlo: l'URL nel mio caso è una variabile impostata da AJAX.Rimuovi querystring dall'URL

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc' 
+0

Possibile duplicato di [Come rimuovere l'hash da window.location (URL) con JavaScript senza aggiornamento della pagina?] (Https://stackoverflow.com/questions/1397329/how-to -remove-the-hash-from-window-location-url-con-javascript-senza-page-r) – PayteR

risposta

272

Un modo semplice per ottenere questo è:

function getPathFromUrl(url) { 
    return url.split("?")[0]; 
} 

Per coloro che desiderano anche rimuovere l'hash (non fa parte della domanda originale) quando esiste alcuna querystring, che richiede un po ' di più:

function stripQueryStringAndHashFromPath(url) { 
    return url.split("?")[0].split("#")[0]; 
} 

EDIT

@caub (originariamente @CRL) ha suggerito una combo più semplice che funziona per entrambi stringa di query e hash (se utilizza RegExp, nel caso qualcuno ha un problema con questo):

function getPathFromUrl(url) { 
    return url.split(/[?#]/)[0]; 
} 
+4

+1 ... In realtà, split() è migliore di substring() in questo caso. –

+1

Tuttavia, ho anche scoperto che il metodo substring() è quasi due volte più veloce rispetto al metodo split(). (in Firefox 3.6). –

+7

Ottimizzazione marginale se è importante (probabilmente no): 'split ('?', 1) [0]'. – bobince

31

2 ° Aggiornamento: Nel tentativo di fornire una risposta completa, sto Benchmarking the tre metodi proposti nelle varie risposte.

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
var i; 

// Testing the substring method 
i = 0; 
console.time('10k substring'); 
while (i < 10000) { 
    testURL.substring(0, testURL.indexOf('?')); 
    i++; 
} 
console.timeEnd('10k substring'); 

// Testing the split method 
i = 0; 
console.time('10k split'); 
while (i < 10000) { 
    testURL.split('?')[0]; 
    i++; 
} 
console.timeEnd('10k split'); 

// Testing the RegEx method 
i = 0; 
var re = new RegExp("[^?]+"); 
console.time('10k regex'); 
while (i < 10000) { 
    testURL.match(re)[0]; 
    i++; 
} 
console.timeEnd('10k regex'); 

Risultati in Firefox 3.5.8 su Mac OS X 10.6.2:

10k substring: 16ms 
10k split:  25ms 
10k regex:  44ms 

risultati in Chrome 5.0.307.11 su Mac OS X 10.6.2:

10k substring: 14ms 
10k split:  20ms 
10k regex:  15ms 

Nota che il metodo della sottostringa è di funzionalità inferiore in quanto restituisce una stringa vuota se l'URL non contiene una stringa querystring. Gli altri due metodi restituirebbero l'URL completo, come previsto. Tuttavia è interessante notare che il metodo della sottostringa è il più veloce, specialmente in Firefox.


1 ° UPDATE: In realtà il metodo split() suggested by Robusto è una soluzione migliore che quello che ho suggerito in precedenza, dal momento che funziona anche quando non v'è alcuna querystring:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
testURL.split('?')[0]; // Returns: "/Products/List" 

var testURL2 = '/Products/List'; 
testURL2.split('?')[0]; // Returns: "/Products/List" 

Risposta originale:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; 
testURL.substring(0, testURL.indexOf('?')); // Returns: "/Products/List" 
+9

O_O Molto esauriente, ma ... perché? Il metodo più flessibile e appropriato ovviamente vince, la velocità non è assolutamente di alcuna preoccupazione qui. – deceze

+1

@deceze: solo per curiosità ... E perché c'era un argomento sull'esecuzione del metodo regex nei commenti della risposta di Angus. –

+5

Molto interessante, Daniel. E se dovessi mai fare analisi di 10K URL su una pagina, cercherò un'altra linea di lavoro. :) – Robusto

-1

Se è necessario eseguire operazioni complesse su URL, è possibile dare un'occhiata allo jQuery url parser plugin.

2

Se siete in RegEx. ...

var newURL = testURL.match(new RegExp("[^?]+")) 
+1

il regexp è lento uno - andare con il modo facile veloce. – Aristos

+0

Non per questa operazione non lo è. 1000 ops su un URL lungo richiede 5 ms in firefox – plodder

+1

@Angus: il tuo ciclo ti dà "Uno script potrebbe essere occupato ..." perché hai dimenticato di incrementare 'a ++;'. Riparando i test, nel mio Firefox 3.6 su un iMac 2.93Ghz Core 2 Duo, ottengo 8ms per il RegEx e 3ms per il metodo split ... Ciononostante +1 per la risposta, perché è ancora un'altra opzione. –

3

Un modo semplice è che si può fare come segue

public static String stripQueryStringAndHashFromPath(String uri) { 
return uri.replaceAll(("(\\?.*|\\#.*)"), ""); 
} 
1
var path = "path/to/myfile.png?foo=bar#hash"; 

console.log(
    path.replace(/(\?.*)|(#.*)/g, "") 
); 
-1

Se si utilizza la spina dorsale.js (che contiene url anchor come percorso), url query string possono apparire:

  1. prima url anchor:

    var url = 'http://example.com?a=1&b=3#routepath/subpath'; 
    
  2. dopo url anchor:

    var url = 'http://example.com#routepath/subpath?a=1&b=3'; 
    

Soluzione:

012.
window.location.href.replace(window.location.search, ''); 
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', ''); 
0

Questa potrebbe essere una vecchia domanda, ma ho provato questo metodo per rimuovere parametri di query. Sembra funzionare senza problemi per me, poiché avevo bisogno di una ricarica e combinato con la rimozione dei parametri di query.

Inoltre, poiché sto utilizzando una semplice operazione di aggiunta di stringhe, suppongo che le prestazioni siano buone. Ma vale la pena confrontare con frammenti in this answer