225 votes

Modifier les paramètres des URL et spécifier les valeurs par défaut en utilisant JavaScript

J'ai cette URL :

site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc

Ce dont j'ai besoin est de pouvoir changer la valeur du paramètre url 'rows' en quelque chose que je spécifie, disons 10. Et si le paramètre 'rows' n'existe pas, je dois l'ajouter à la fin de l'url et ajouter la valeur que j'ai déjà spécifiée (10).

2 votes

Une réponse légère, sans plugin : stackoverflow.com/a/10997390/11236

11 votes

Je ne peux pas croire que nous sommes en 2013 et qu'il n'y a pas une meilleure façon de le faire, comme quelque chose d'intégré dans les bibliothèques de base du navigateur.

0 votes

Voir ma réponse pour une solution moderne : stackoverflow.com/a/19965480/64949

128voto

Adil Malik Points 1754

J'ai étendu le code de Sujoy pour créer une fonction.

/**
 * http://stackoverflow.com/a/10997390/11236
 */
function updateURLParameter(url, param, paramVal){
    var newAdditionalURL = "";
    var tempArray = url.split("?");
    var baseURL = tempArray[0];
    var additionalURL = tempArray[1];
    var temp = "";
    if (additionalURL) {
        tempArray = additionalURL.split("&");
        for (var i=0; i<tempArray.length; i++){
            if(tempArray[i].split('=')[0] != param){
                newAdditionalURL += temp + tempArray[i];
                temp = "&";
            }
        }
    }

    var rows_txt = temp + "" + param + "=" + paramVal;
    return baseURL + "?" + newAdditionalURL + rows_txt;
}

Appels de fonction :

var newURL = updateURLParameter(window.location.href, 'locId', 'newLoc');
newURL = updateURLParameter(newURL, 'resId', 'newResId');

window.history.replaceState('', '', updateURLParameter(window.location.href, "param", "value"));

Version mise à jour qui prend également en charge les ancres sur l'URL.

function updateURLParameter(url, param, paramVal)
{
    var TheAnchor = null;
    var newAdditionalURL = "";
    var tempArray = url.split("?");
    var baseURL = tempArray[0];
    var additionalURL = tempArray[1];
    var temp = "";

    if (additionalURL) 
    {
        var tmpAnchor = additionalURL.split("#");
        var TheParams = tmpAnchor[0];
            TheAnchor = tmpAnchor[1];
        if(TheAnchor)
            additionalURL = TheParams;

        tempArray = additionalURL.split("&");

        for (var i=0; i<tempArray.length; i++)
        {
            if(tempArray[i].split('=')[0] != param)
            {
                newAdditionalURL += temp + tempArray[i];
                temp = "&";
            }
        }        
    }
    else
    {
        var tmpAnchor = baseURL.split("#");
        var TheParams = tmpAnchor[0];
            TheAnchor  = tmpAnchor[1];

        if(TheParams)
            baseURL = TheParams;
    }

    if(TheAnchor)
        paramVal += "#" + TheAnchor;

    var rows_txt = temp + "" + param + "=" + paramVal;
    return baseURL + "?" + newAdditionalURL + rows_txt;
}

0 votes

Je n'arrive pas à faire en sorte que ça marche. Voici mon code : jsfiddle.net/Draven/tTPYL/1 L'URL ressemblerait à http://www.domain.com/index.php?action=my_action&view-all=Ye‌​s et je dois modifier la valeur "view-all". Ma question SO qui a été fermée : stackoverflow.com/questions/13025880/

0 votes

Êtes-vous sûr ? Cela a fonctionné pour moi facilement. Regardez ici : jsfiddle.net/mw49a

1 votes

Utilisez "var i=0" au lieu de "i=0" pour éviter de créer/modifier i en tant que variable globale.

95voto

Matthew Flaschen Points 131723

Je pense que vous voulez le plugin de requête .

Par exemple :

window.location.search = jQuery.query.set("rows", 10);

Cela fonctionnera quel que soit l'état actuel des rangs.

0 votes

Mofle, c'est parce que le plugin Query utilise decodeURIComponent, et decodeURIComponent("%F8") n'est pas valide.

2 votes

Enlève ce truc bizarre de ton URL. Ou, en d'autres termes, "modifiez votre chaîne de requête pour n'utiliser que des caractères UTF-8 valides". :) F8 seul n'est pas un caractère UTF-8 valide.

0 votes

Y a-t-il un moyen de récupérer l'url de base à partir de ce plugin ? Par exemple, si mon URL est ' youtube.com/watch?v=PZootaxRh3M ', obtenez ' youtube.com/watch '

79voto

Sindre Sorhus Points 20538

Pour répondre à ma propre question 4 ans plus tard, après avoir beaucoup appris. Notamment qu'il ne faut pas utiliser jQuery pour tout. J'ai créé un module simple qui peut parser/chiffrer une chaîne de requête. Cela permet de modifier facilement la chaîne de requête.

Vous pouvez utiliser requête-chaîne comme suit :

// parse the query string into an object
var q = queryString.parse(location.search);
// set the `row` property
q.rows = 10;
// convert the object to a query string
// and overwrite the existing query string
location.search = queryString.stringify(q);

1 votes

Wow, c'est une solution brillamment simple. Je vous en remercie.

0 votes

Cela fonctionne comme un champion ! Merci Sindre (tout ce que vous avez à faire est de réduire "query-string/index.js" et de le coller au bas de votre js).

2 votes

Avoir une bibliothèque supplémentaire juste pour cela semble un peu trop...

61voto

redsquare Points 47518

Ben Alman a un bon plugin jquery querystring/url aquí qui vous permet de manipuler facilement la chaîne de recherche.

Comme demandé -

Allez sur sa page de test aquí

Dans firebug, entrez ce qui suit dans la console

jQuery.param.querystring(window.location.href, 'a=3&newValue=100');

Il vous renverra la chaîne d'url modifiée suivante

http://benalman.com/code/test/js-jquery-url-querystring.html?a=3&b=Y&c=Z&newValue=100#n=1&o=2&p=3

Remarquez que la valeur de la chaîne d'interrogation pour a est passée de X à 3 et qu'elle a ajouté la nouvelle valeur.

Vous pouvez ensuite utiliser la nouvelle chaîne url comme bon vous semble, par exemple en utilisant document.location = newUrl ou en modifiant un lien d'ancrage, etc.

4 votes

N'est-ce pas jQuery.param.querystring au lieu de jQuery.queryString ?

13 votes

TypeError: jQuery.param.querystring is not a function

1 votes

Pour avoir 'TypeError', ce devrait être : jQuery.queryString(window.location.href, 'a=3&newValue=100')

28voto

Sujoy Points 1380

Vous pouvez aussi le faire via le JS normal

var url = document.URL
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var aditionalURL = tempArray[1]; 
var temp = "";
if(aditionalURL)
{
var tempArray = aditionalURL.split("&");
for ( var i in tempArray ){
    if(tempArray[i].indexOf("rows") == -1){
            newAdditionalURL += temp+tempArray[i];
                temp = "&";
            }
        }
}
var rows_txt = temp+"rows=10";
var finalURL = baseURL+"?"+newAdditionalURL+rows_txt;

0 votes

Joli ! Je l'ai pris et modifié en une fonction. Vous envoyez l'url actuelle, le nom du paramètre que vous recherchez, la nouvelle valeur, et un bool indiquant si vous voulez ajouter le paramètre à la chaîne de requête si je ne le trouve pas actuellement. La fonction retourne l'url modifiée.

0 votes

Gormer, vous devez partager cette fonction avec les autres :)

0 votes

Superbe snippet. Je l'ai aussi transformé en une fonction pour mon propre cas d'utilisation. Merci pour le partage ! +1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X