web-dev-qa-db-fra.com

Ajouter/modifier le paramètre de l'URL et rediriger vers la nouvelle URL

Si le paramètre &view-all n'existe PAS dans l'URL, je dois l'ajouter à la fin de l'URL avec une valeur. S'il existe, alors je dois pouvoir modifier la valeur sans créer une nouvelle URL, car d'autres paramètres pourraient précéder ou non.

J'ai trouvé cette fonction mais je n'arrive pas à la faire fonctionner: https://stackoverflow.com/a/10997390/837705

Voici le code que j'ai en utilisant la fonction ci-dessus (que je ne peux pas me mettre au travail): http://jsfiddle.net/Draven/tTPYL/4/

Je sais déjà comment ajouter le paramètre et la valeur:

<div onclick="javascript: window.location.assign(window.location.href+='&view-all=Yes');">Blah Blah</div>

Plus d'infos:

Si l'URL est http://www.domain.com/index.php?action=my_action, la valeur par défaut "& view-all" serait "Oui"; l'URL vers laquelle ils seraient dirigés lorsqu'ils cliqueront sur le bouton sera http://www.domain.com/index.php?action=my_action&view-all=Yes.

Si l'URL est http://www.domain.com/index.php?action=my_action&view-all=Yes, quand ils cliquent sur le bouton, il devient http://www.domain.com/index.php?action=my_action&view-all=No​​​

EDIT: Donnez-moi des exemples, s'il vous plaît. Je ne connais pas beaucoup JS, et je ne vois pas comment le faire en PHP.

18
Draven
function setGetParameter(paramName, paramValue)
{
    var url = window.location.href;
    var hash = location.hash;
    url = url.replace(hash, '');
    if (url.indexOf(paramName + "=") >= 0)
    {
        var prefix = url.substring(0, url.indexOf(paramName));
        var suffix = url.substring(url.indexOf(paramName));
        suffix = suffix.substring(suffix.indexOf("=") + 1);
        suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : "";
        url = prefix + paramName + "=" + paramValue + suffix;
    }
    else
    {
    if (url.indexOf("?") < 0)
        url += "?" + paramName + "=" + paramValue;
    else
        url += "&" + paramName + "=" + paramValue;
    }
    window.location.href = url + hash;
}

Appelez la fonction ci-dessus dans votre événement onclick.

60
Lajos Arpad

Toute la solution préalable ne prend pas en compte la posibilité de la sous-chaîne en paramètre. Par exemple http: // xyz? Ca = 1 & a = 2 ne sélectionnerait pas le paramètre a mais ca. Voici la fonction qui passe par les paramètres et les vérifie.

function setGetParameter(paramName, paramValue)
{
  var url = window.location.href;
  var hash = location.hash;
  url = url.replace(hash, '');
  if (url.indexOf("?") >= 0)
  {
    var params = url.substring(url.indexOf("?") + 1).split("&");
    var paramFound = false;
    params.forEach(function(param, index) {
      var p = param.split("=");
      if (p[0] == paramName) {
        params[index] = paramName + "=" + paramValue;
        paramFound = true;
      } 
    });
    if (!paramFound) params.Push(paramName + "=" + paramValue);
    url = url.substring(0, url.indexOf("?")+1) + params.join("&");
  }
  else
    url += "?" + paramName + "=" + paramValue;
  window.location.href = url + hash;
}
4
Pcs

J'ai eu une situation similaire où je voulais remplacer un paramètre de requête d'URL. Cependant, je n'avais qu'un paramètre et je pouvais simplement le remplacer:

window.location.search = '?filter=' + my_filter_value

La propriété location.search vous permet d'obtenir ou de définir la partie requête d'une URL.

3
Andrew

bien que je prenne l'URL d'une entrée, il est facile d'ajuster à l'URL réelle.

var value = 0;

$('#check').click(function()
{
    var originalURL = $('#test').val();
    var exists = originalURL.indexOf('&view-all');

    if(exists === -1)
    {
        $('#test').val(originalURL + '&view-all=value' + value++);
    }
    else
    {
        $('#test').val(originalURL.substr(0, exists + 15) + value++);
    }
});

http://jsfiddle.net/8YPh9/31/

2
interested

Pour le faire en PHP: Vous avez deux paramètres pour afficher votre page, disons action et view-all. Vous aurez probablement accès à ceux-ci déjà avec $action = $_GET['action'] ou quoi que ce soit, peut-être en définissant une valeur par défaut.

Ensuite, vous décidez en fonction de cela si vous voulez utiliser une variable telle que $viewAll = $viewAll == 'Yes' ? 'No' : 'Yes'.

Et à la fin, vous construisez à nouveau l’url avec ces valeurs comme 

$clickUrl = $_SERVER['PHP_SELF'] . '?action=' . $action . '&view-all=' . $viewAll;

Et c'est tout. 

Donc, vous dépendez du statut de la page et non de l’url des utilisateurs (car vous déciderez peut-être plus tard que $ viewAll est à Yes par défaut ou peu importe).

1
Marc

je suggérerais un petit changement à la réponse de @ Lajos ... Dans mon cas particulier, je pourrais potentiellement avoir un hachage dans le cadre de l'URL, ce qui poserait des problèmes pour l'analyse du paramètre que nous insérons avec cette méthode après la redirection. 

function setGetParameter(paramName, paramValue) {
    var url = window.location.href.replace(window.location.hash, '');
    if (url.indexOf(paramName + "=") >= 0) {
        var prefix = url.substring(0, url.indexOf(paramName));
        var suffix = url.substring(url.indexOf(paramName));
        suffix = suffix.substring(suffix.indexOf("=") + 1);
        suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : "";
        url = prefix + paramName + "=" + paramValue + suffix;
    }else {
        if (url.indexOf("?") < 0)
            url += "?" + paramName + "=" + paramValue;
        else
            url += "&" + paramName + "=" + paramValue;
    }
    url += window.location.hash;
    window.location.href = url;
}
1
MrTristan

Quelques idées simples pour vous aider:

Dans PHP, vous pouvez le faire comme ceci:

if (!array_key_exists(explode('=', explode('&', $_GET))) {
  /* add the view-all bit here */
}

En javascript:

if(!location.search.match(/view\-all=/)) {
  location.href = location.href + '&view-all=Yes';
}
1
LeonardChallis

Je pense que quelque chose comme ceci fonctionnerait, mettant à jour le code @Marc:

//view-all parameter does NOT exist  
$params = $_GET;  
if(!isset($_GET['view-all'])){  
  //Adding view-all parameter  
  $params['view-all'] = 'Yes';  
}  
else{  
  //view-all parameter does exist!  
  $params['view-all'] = ($params['view-all'] == 'Yes' ? 'No' : 'Yes');  
}
$new_url = $_SERVER['PHP_SELF'].'?'.http_build_query($params);
1
Tom Sarduy

Voici un moyen d'accomplir cela. Il prend le nom et la valeur du paramètre, ainsi qu'une option "clear". Si vous fournissez clear = true, tous les autres paramètres seront supprimés et il ne restera plus que le paramètre nouvellement ajouté. Dans d'autres cas, il remplacera l'original par le nouveau ou l'ajoutera s'il n'est pas présent dans la chaîne de requête.

Ceci est modifié par rapport à la réponse originale supérieure car celle-ci se cassait si elle remplaçait autre chose que la dernière valeur. Cela fonctionnera pour n'importe quelle valeur et préservera l'ordre existant.

function setGetParameter(paramName, paramValue, clear)
{
clear = typeof clear !== 'undefined' ? clear : false;
var url = window.location.href;
var queryString = location.search.substring(1); 
var newQueryString = "";
if (clear)
{
    newQueryString = paramName + "=" + paramValue;
}
else if (url.indexOf(paramName + "=") >= 0)
{
    var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
    var keyValues = queryString.split('&'); 
    for(var i in keyValues) { 
        var key = keyValues[i].split('=');
        if (key.length > 1) {
            if(newQueryString.length > 0) {newQueryString += "&";}
            if(decode(key[0]) == paramName)
            {
                newQueryString += key[0] + "=" + encodeURIComponent(paramValue);;
            }
            else
            {
                newQueryString += key[0] + "=" + key[1];
            }
        }
    } 
}
else
{
    if (url.indexOf("?") < 0)
        newQueryString = "?" + paramName + "=" + paramValue;
    else
        newQueryString = queryString + "&" + paramName + "=" + paramValue;
}
window.location.href = window.location.href.split('?')[0] + "?" + newQueryString;
}
1
jimmy0x52

J'ai besoin d'aide pour ajuster mon script ci-dessous ou pour trouver un script qui pourrait être utilisé sur mon site wordpress pour saisir les paramètres de suffixe d'URL à partir d'une URL à suivre, puis à ajouter au bouton de la souris sur l'URL pour le suivi du bon identifiant d'annonce.

REASON: les paramètres sont utilisés pour le suivi des publicités pour savoir à partir de quelle publicité l’utilisateur a été transféré, même si l’utilisateur saute de la page d’optin à la page de vente en utilisant un clic de souris. 

Voici l’objectif à atteindre: 1. Une annonce FB pointe vers une page d'inscription avec un code de suivi: https://ownsite.com/optin-page/?tid=fbad1 2. Sur la page d'optin, un bouton avec une URL de configuration à transférer à la page de vente s'affiche. Si vous cliquez dessus, seule l'URL est transmise, mais le paramètre "? Tid = fbad1" est manquant . 3. Le script de transfert automatique ci-dessous (qui fonctionne correctement) peut être utilisé pour modifier le clic de bouton en avant, mais présente une limitation car il ne récupère que les paramètres "tid" à la place des paramètres utm.

Par conséquent, un code de script doit être implémenté pour établir des boutons de clic (également pour les styler ou utiliser des images) et pour cliquer sur le bouton pour transférer vers une page de vente différente en saisissant le paramètre suffixe de la page d'optin actuelle, puis de le renvoyer à la vente. page https://ownsite.com/sales-page/?tid=fbad1 inclut également les paramètres UTM

Actuellement, j'aurais pu résoudre ce problème en utilisant un script de redirection automatique, mais A.) Je ne souhaite pas utiliser un autoredirect sur cette page. Il est préférable d'utiliser un bouton de clic d'événement utilisé pour permettre à l'utilisateur de cliquer lui-même sur le transfert avec le paramètre d'URL inclus . B.) Le paramètre d'ID de suivi dans ce script est limité à "? Tid = ..." à la place, je souhaite également pour suivre le code UTM sur le bouton, cliquez également sur Saisissez à partir de la page actuelle le paramètre d'URL https://www.optin-page.com/?tid=facebookad1?utm_campaign=blogpost puis, cliquez sur les paramètres de capture et ajoutez-les à l'URL de définition de bouton https: //. www.sales-page.com/?tid=facebookad1?utm_campaign=blogpost

Veuillez trouver ici le code utilisé ci-dessous pour la redirection automatique et la saisie des paramètres d’URL. Ce code doit maintenant être modifié pour pouvoir créer un bouton avec un événement de clic à rediriger puis vers l'URL de transfert avec saisie du paramètre de l'URL actuelle si le bouton est cliqué (comme indiqué ci-dessus).

    <p><!-- Modify this according to your requirement - core script from https://Gist.github.com/Joel-James/62d98e8cb3a1b6b05102 and suffix grabbing </p>
    <h3 style="text-align: center;"><span style="color: #ffffff; background-color: #039e00;">►Auto-redirecting after <span id="countdown">35</span> seconds◄</span></h3>
    <p><!-- JavaScript part --><br /><script type="text/javascript">

function findGetParameter(parameterName) {
    var result = null,
        tmp = [];
    location.search
        .substr(1)
        .split("&")
        .forEach(function (item) {
          tmp = item.split("=");
          if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
        });
    return result;
}


    // Total seconds to wait
    var seconds = 45;

    function countdown() {
        seconds = seconds - 1;
        if (seconds < 0) {
            // Chnage your redirection link here
var tid = findGetParameter('tid');
window.location = "https://www.2share.info/ql-cb2/" + '?tid='+tid;
        } else {
            // Update remaining seconds
            document.getElementById("countdown").innerHTML = seconds;
            // Count down using javascript
            window.setTimeout("countdown()", 1000);
        }
    }

    // Run countdown function
    countdown();

</script></p>
0
user51626

Ceci est mon exemple de code pour reconstruire la chaîne de requête d'URL avec JS

//function get current parameters
$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
        return null;
    }
    else{
        return results[1] || 0;
    }
};

//build a new parameters
var param1 = $.urlParam('param1');
var param2 = $.urlParam('param2');

//check and create an array to save parameters
var params = {};
    if (param1 != null) {
        params['param1'] = param1;
    }
    if (order != null) {
        params['param2'] = param2;
    }

//build a new url with new parameters using jQuery param
window.location.href =  window.location.Origin + window.location.pathname + '?' + $.param(params);

J'ai utilisé JQUERY param: http://api.jquery.com/jquery.param/ pour créer une nouvelle URL avec de nouveaux paramètres.

0
Tuan Ngo