2012-01-05 53 views
17

Me gustaría tener un pequeño botón de huevo de pascua en la esquina del sitio de un proyecto. Cuando se hace clic, simplemente coloca una cadena en la url actual y vuelve a cargar la página.Agregar un parámetro a la URL actual

Así que si estoy en: http://test.com/projects/view/134

se pulsa el botón

recarga de la página en: http://test.com/projects/view/134?ts=true

No es muy seguro cómo podría ir haciendo así que sin embargo.

+2

la salida @ChamikaSandamal para la respuesta correcta – Eliezer

Respuesta

20

Puede asignar location.href al valor que tiene en la actualidad, además de su nueva cadena de consulta:

(editado para ser amigable con cadenas de consulta existentes)

$("#yourButtonId").click({ 
    var loc = location.href; 
    if (loc.indexOf("?") === -1) 
     loc += "?"; 
    else 
     loc += "&"; 
    location.href = loc + "ts=true"; 
}); 

O para ser más sucinta:

$("#yourButtonId").click({ 
    var loc = location.href;   
    loc += loc.indexOf("?") === -1 ? "?" : "&"; 

    location.href = loc + "ts=true"; 
}); 
+2

lo que si ya hay parámetros al final de la URL? – Eliezer

+0

@Eliezer - buen punto, gracias –

+0

está copiando mi respuesta: P http://stackoverflow.com/a/8737675/880434 –

2

¿Quiere decir:

 

$(document).ready(function() { 
    $("#yourButtonId").click(function() { 
     var currentUrl = window.location.pathname + "?ts=true"; 
    }); 
}); 

 
3
location.href += '?ts=true'; 

Así como eso.

+0

Crea un ciclo infinito – geotheory

23

tratan este código,

var separator = (window.location.href.indexOf("?")===-1)?"?":"&"; 
window.location.href = window.location.href + separator + "ts=true"; 

EDITS: que deben evitarse parámetro duplicado o muy grande cadena en su URL, es necesario sustituir el viejo parámetro ya existe.

var url=window.location.href, 
    separator = (url.indexOf("?")===-1)?"?":"&", 
    newParam=separator + "ts=true"; 
    newUrl=url.replace(newParam,""); 
    newUrl+=newParam; 
    window.location.href =newUrl; 
+0

Bien +1 ya que lo tienes primero (y le prometo que no copié) :-) –

+0

@AdamRackis: no me importa si es una copia o no. :) –

+0

pero ¿y si la URL contiene un hash? – fabiangebert

2

Si quieres dar cuenta de la posible existencia de un hash "#" en la URL, haga lo siguiente:

var href = location.href; 
var hasQuery = href.indexOf("?") + 1; 
var hasHash = href.indexOf("#") + 1; 
var appendix = (hasQuery ? "&" : "?") + "ts=true"; 
location.href = hasHash ? href.replace("#", appendix + "#") : href + appendix; 
3

He encontrado las respuestas anteriores que carecen y como tal aquí es un método que maneja mejor demás parámetros de cadena de consulta actual

appendToQueryString = function (param, val) { 
    var queryString = window.location.search.replace("?", ""); 
    var parameterListRaw = queryString == "" ? [] : queryString.split("&"); 
    var parameterList = {}; 
    for (var i = 0; i < parameterListRaw.length; i++) { 
     var parameter = parameterListRaw[i].split("="); 
     parameterList[parameter[0]] = parameter[1]; 
    } 
    parameterList[param] = val; 

    var newQueryString = "?"; 
    for (var item in parameterList) { 
     if (parameterList.hasOwnProperty(item)) { 
      newQueryString += item + "=" + parameterList[item] + "&"; 
     } 
    } 
    newQueryString = newQueryString.replace(/&$/, ""); 
    return location.origin + location.pathname + newQueryString; 
} 

usted tiene que utilizar location.href = appendToQueryString(ts, true) para realmente recargar la página.

+0

Entonces, ¿divide la cadena de consulta completa, agrega un elemento y lo vuelve a juntar? ¿Por qué haría eso en lugar de simplemente agregar el nuevo parámetro? No tiene sentido –

+1

@HorstJahns para evitar que los params se dupliquen – Envil

0

Una mejora de la respuesta @Bobbzorzen, con la capacidad de eliminar parámetro pasando sólo su nombre:

function AlterQueryString(param, val) { 
    var queryString = window.location.search.replace("?", ""); 
    var parameterListRaw = queryString == "" ? [] : queryString.split("&"); 
    var parameterList = {}; 
    for (var i = 0; i < parameterListRaw.length; i++) { 
     var parameter = parameterListRaw[i].split("="); 
     if (typeof val != 'undefined') { 
      parameterList[parameter[0]] = parameter[1]; 
     } else if (param != parameter[0]) { 
      parameterList[parameter[0]] = parameter[1]; 
     } 
    } 
    if (typeof val != 'undefined') { 
     parameterList[param] = val; 
    } 

    var newQueryString = Object.keys(parameterList).length > 0 ? "?" : ""; 
    for (var item in parameterList) { 
     if (parameterList.hasOwnProperty(item)) { 
      newQueryString += item + "=" + parameterList[item] + "&"; 
     } 
    } 
    newQueryString = newQueryString.replace(/&$/, ""); 
    return location.origin + location.pathname + newQueryString; 
} 

gist: https://gist.github.com/envil/bc1832503bef55ffdabb0cde32bb06f1

3

hacer pleno uso de la API DOM location, y contar en picadillo:

location.protocol + '//' + location.pathname + 
 
    (location.search ? location.search + '&a=b' : '?a=b') + 
 
    location.hash;

3

Usando:

Ejemplo:

var url = new URL("http://foo.bar/?x=1&y=2"); 

// If your expected result is "http://foo.bar/?x=1&y=2&x=42" 
url.searchParams.append('x', 42); 

// If your expected result is "http://foo.bar/?x=42&y=2" 
url.searchParams.set('x', 42); 

// Build result 
url.toString(); 
+0

lamentablemente aún no es compatible con todos los navegadores https://caniuse.com/#feat=urlsearchparams – Iftah

Cuestiones relacionadas