2010-03-29 15 views
110

¿Cuál es una manera fácil de eliminar la cadena de consulta de una ruta de acceso en Javascript? He visto un complemento para Jquery que usa window.location.search. No puedo hacer eso: la URL en mi caso es una variable que está configurada desde AJAX.Quitar querystring de la URL

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

Posible duplicado de [¿Cómo eliminar el hash de window.location (URL) con JavaScript sin actualización de página?] (Https://stackoverflow.com/questions/1397329/how-to -remove-the-hash-from-window-location-url-with-javascript-without-page-r) – PayteR

Respuesta

272

Una forma sencilla de conseguir esto es:

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

Para aquellos que también desean eliminar el hash (no forma parte de la pregunta original) cuando no existe una cadena de consulta, que requiere un poco más:

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

EDITAR

@caub (originalmente @crl) sugirió un combo simple que funciona tanto para la cadena de consulta y el hash (aunque utiliza RegExp, por si alguien tiene un problema con eso):

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

+1 ... En realidad, split() es mejor que substring() en este caso. –

+1

Sin embargo, también descubrí que el método substring() es casi el doble de rápido en comparación con el método split(). (en Firefox 3.6). –

+7

Optimización marginal si es importante (probablemente no): 'split ('?', 1) [0]'. – bobince

31

segunda actualización: En un intento de dar una respuesta integral, estoy evaluación comparativa de los tres métodos propuestos en las distintas respuestas.

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'); 

Resultados en Firefox 3.5.8 en Mac OS X 10.6.2:

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

resultados en Chrome 5.0.307.11 en Mac OS X 10.6.2:

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

Nota que el método de subcadena es inferior en funcionalidad ya que devuelve una cadena en blanco si la URL no contiene una cadena de consulta. Los otros dos métodos devolverían la URL completa, como se esperaba. Sin embargo, es interesante observar que el método de subcadena es el más rápido, especialmente en Firefox.


primera ACTUALIZACIÓN: En realidad, el método split() suggested by Robusto es una mejor solución que la que sugirió anteriormente, ya que funcionará incluso cuando no hay una cadena de consulta:

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" 

Original Respuesta:

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

O_O De hecho, muy completo, pero ... ¿por qué? Obviamente, el método más flexible y apropiado gana, la velocidad no tiene ninguna importancia aquí. – deceze

+1

@deceze: solo por curiosidad ... Y porque hubo una discusión sobre el rendimiento del método de expresión regular en los comentarios de la respuesta de Angus. –

+5

Muy interesante, Daniel. Y si alguna vez tengo que hacer análisis de URL 10K en una página, buscaré otra línea de trabajo. :) – Robusto

2

Si usted está en expresiones regulares. ...

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

la expresión regular es lenta, vaya con la manera más fácil. – Aristos

+0

No es para esta operación, no lo es. 1000 operaciones en una URL larga tardan 5 ms en firefox – plodder

+1

@Angus: Su ciclo le está dando "Un script puede estar ocupado ..." porque se olvidó de incrementar 'a ++;'. Reparado las pruebas, en mi Firefox 3.6 en un iMac 2.93Ghz Core 2 Duo, obtengo 8ms para RegEx y 3ms para el método de división ... Sin embargo, +1 para la respuesta, porque es otra opción. –

3

Una forma sencilla es que puede hacer de la siguiente manera

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

Si se utiliza la columna vertebral.js (que contiene url anchor como ruta), url query string pueden aparecer:

  1. antes url anchor:

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

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

Solución:

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

Esto puede ser una vieja pregunta, pero he intentado este método para eliminar params de consulta. Parece que funciona bien para mí, ya que necesitaba una recarga combinada con la eliminación de parámetros de consulta.

window.location.href = window.location.origin + window.location.pathname; 

Asimismo, puesto que estoy utilizando operación de suma simple cadena que estoy adivinando el rendimiento será bueno. Pero aún vale la pena comparar con fragmentos en this answer

Cuestiones relacionadas