web-dev-qa-db-de.com

Parameter der URL hinzufügen/ändern und zur neuen URL umleiten

Wenn der Parameter &view-all NICHT in der URL vorhanden ist, muss er zusammen mit einem Wert am Ende der URL hinzugefügt werden. Wenn es existiert, muss ich in der Lage sein, den Wert zu ändern, ohne eine neue URL zu erstellen, da er möglicherweise andere Parameter enthält oder nicht.

Ich habe diese Funktion gefunden, kann sie jedoch nicht zum Laufen bringen: https://stackoverflow.com/a/10997390/837705

Hier ist der Code, den ich mit der obigen Funktion habe (die ich nicht zur Arbeit bringen kann): http://jsfiddle.net/Draven/tTPYL/4/

Ich kann den Parameter und den Wert bereits anhängen:

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

Weitere Infos:

Wenn die URL http://www.domain.com/index.php?action=my_action lautet, lautet der Standardwert für "& Alles anzeigen" "Ja", sodass die URL, zu der sie beim Klicken auf die Schaltfläche weitergeleitet werden, http://www.domain.com/index.php?action=my_action&view-all=Yes lautet.

Wenn die URL http://www.domain.com/index.php?action=my_action&view-all=Yes lautet, ändert sich die URL beim Klicken auf die Schaltfläche in http://www.domain.com/index.php?action=my_action&view-all=No​​​.

BEARBEITEN: Bitte geben Sie mir Beispiele. Ich kenne nicht viel von JS und mir fällt gerade keine Möglichkeit ein, dies in PHP zu tun.

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;
}

Rufen Sie die Funktion oben in Ihrem Onclick-Ereignis auf.

60
Lajos Arpad

Die gesamte präivöse Lösung berücksichtigt nicht die Möglichkeit des Teilstrings im Parameter. Zum Beispiel http: // xyz? Ca = 1 & a = 2 würde den Parameter a nicht auswählen, aber ca. Hier ist eine Funktion, die Parameter durchläuft und diese überprüft.

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

Ich hatte eine ähnliche Situation, in der ich einen URL-Abfrageparameter ersetzen wollte. Ich hatte jedoch nur einen Parameter und konnte ihn einfach ersetzen:

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

Mit der location.search-Eigenschaft können Sie den Abfrageteil einer URL abrufen oder festlegen.

3
Andrew

obwohl ich die url von einer eingabe nehme, ist sie leicht an die echte url anpassbar.

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

Um dies in PHP zu tun: Sie haben einige Parameter, um Ihre Seite anzuzeigen, sagen wir action und view-all. Sie werden (wahrscheinlich) bereits mit $action = $_GET['action'] oder was auch immer darauf zugreifen, möglicherweise wird ein Standardwert festgelegt.

Dann entscheiden Sie in Abhängigkeit davon, ob Sie eine Variable wie $viewAll = $viewAll == 'Yes' ? 'No' : 'Yes' wechseln möchten.

Und am Ende bauen Sie einfach die URL mit diesen Werten wieder auf 

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

Und das ist es. 

Sie hängen also vom Seitenstatus ab und nicht von der Benutzer-URL (weil Sie später entscheiden, dass $ viewAll als Standard oder was auch immer ja ist).

1
Marc

ich würde eine kleine Änderung an @ Lajos 'Antwort vorschlagen ... In meiner speziellen Situation könnte ich möglicherweise einen Hash als Teil der URL enthalten, der Probleme beim Parsen des Parameters verursacht, den wir mit dieser Methode nach der Umleitung einfügen. 

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

Einige einfache Ideen, um Sie zum Laufen zu bringen:

In PHP können Sie dies folgendermaßen tun:

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

In Javascript:

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

Ich denke, so etwas würde funktionieren, den @Marc-Code aktualisieren:

//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

Hier ist eine Möglichkeit, dies zu erreichen. Es nimmt den Parameternamen und den Parameterwert sowie ein optionales 'clear' an. Wenn Sie clear = true angeben, werden alle anderen Parameter entfernt und der neu hinzugefügte Parameter wird einfach verlassen. In anderen Fällen wird das Original durch das neue ersetzt, oder es wird hinzugefügt, wenn es nicht in der Querzeichenfolge enthalten ist.

Dies wird von der ursprünglichen Top-Antwort modifiziert, da derjenige gebrochen ist, wenn er etwas anderes als den letzten Wert ersetzt hat. Dies funktioniert für jeden Wert und behält die bestehende Reihenfolge bei.

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

Warum die Abfragezeichenfolge selbst analysieren, wenn der Browser dies für Sie erledigen kann?

function changeQS(key, value) {
    let urlParams = new URLSearchParams(location.search.substr(1));
    urlParams.set(key, value);
    location.search = urlParams.toString();
}
1
Jamie

Ich brauche Hilfe, um mein Skript unten anzupassen oder ein Skript zu finden, das auf meiner Wordpress-Site verwendet werden könnte, um die URL-Suffix-Parameter von einer Forward-URL zu übernehmen und dann über die Schaltfläche Klick-URL zum Verfolgen der richtigen Forward-Anzeigen-ID hinzuzufügen.

GRUND: Parameter werden für die Anzeigenverfolgung verwendet, um herauszufinden, von welcher Anzeige der Benutzer weitergeleitet wurde, auch wenn der Benutzer mit einem Klick von der Optin-Seite zur Verkaufsseite springt. 

Hier das Ziel zu erreichen: 1. Eine FB-Anzeige zeigt auf eine Optin-Seite mit Tracking-Code: https://ownsite.com/optin-page/?tid=fbad1 2. Auf der Optin-Seite gibt es eine Schaltfläche mit einer Setup-URL, die zur Verkaufsseite weitergeleitet werden kann. Wenn Sie jedoch auf diese Schaltfläche klicken, wird nur die URL weitergeleitet. Der Parameter "? Tid = fbad1" fehlt jedoch . 3. Das Auto-Forward-Skript (das ordnungsgemäß funktioniert) kann zum Ändern des Vorwärtsklickens der Schaltfläche verwendet werden, hat jedoch eine Einschränkung, da es nur "TID" -Parameter statt UTM-Parameter verwendet.

Daher muss ein Skriptcode implementiert werden, um Klick-Schaltflächen festzulegen (auch um sie zu formatieren oder stattdessen Bilder zu verwenden). Wenn Sie auf die Schaltfläche klicken, um auf eine andere Verkaufsseite zu gelangen, wird der Suffix-Parameter von der aktuellen Optin-Seite übernommen, um sie dann an den Verkauf weiterzuleiten. page https://ownsite.com/sales-page/?tid=fbad1 enthält auch UTM-Parameter

Derzeit hätte ich dies mit einem Auto-Redirect-Skript lösen können, aber A.) Ich möchte auf dieser Seite keinen Autoredirect verwenden. Besser ist eine Ereignis-Klick-Schaltfläche, mit der der Benutzer selbst klicken kann, um mit dem URL-Parameter weiterzuleiten B.) Der Parameter für die Tracking-ID in diesem Skript ist auf "? Tid = ..." beschränkt. Stattdessen möchte ich auch Um den UTM-Code zu verfolgen, klicken Sie auch auf .__ Schnappen Sie sich von der aktuellen Seite den Parameter für URL https://www.optin-page.com/?tid=facebookad1?utm_campaign=blogpost . Klicken Sie dann auf die Schaltfläche zum Erfassen von Parametern und fügen Sie dem Schaltflächenset URL https: // hinzu. www.sales-page.com/?tid=facebookad1?utm_campaign=blogpost

Hier finden Sie jetzt den Code, der zur automatischen Umleitung und zum Abrufen der URL-Parameter verwendet wird. Dieser Code soll jetzt geändert werden, um eine Schaltfläche mit einem Klickereignis erstellen zu können, die dann an die Weiterleitungs-URL mit Parametererfassung der aktuellen URL weitergeleitet wird, wenn auf die Schaltfläche geklickt wird (wie oben angegeben).

    <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

Dies ist mein Beispielcode für die Neuerstellung der URL-Abfragezeichenfolge mit 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);

Ich habe JQUERY param: http://api.jquery.com/jquery.param/ verwendet, um eine neue URL mit neuen Parametern zu erstellen.

0
Tuan Ngo
var updateQueryStringParameter = function (key, value) {

    var baseUrl = [location.protocol, '//', location.Host, location.pathname].join(''),
        urlQueryString = document.location.search,
        newParam = key + '=' + value,
        params = '?' + newParam;

    // If the "search" string exists, then build params from it
    if (urlQueryString) {
        var updateRegex = new RegExp('([\?&])' + key + '[^&]*');
        var removeRegex = new RegExp('([\?&])' + key + '=[^&;]+[&;]?');

        if( typeof value == 'undefined' || value == null || value == '' ) { 
            params = urlQueryString.replace(removeRegex, "$1");
            params = params.replace( /[&;]$/, "" );

        } else if (urlQueryString.match(updateRegex) !== null) { 
            params = urlQueryString.replace(updateRegex, "$1" + newParam);

        } else {
            params = urlQueryString + '&' + newParam;
        }
    }

    // no parameter was set so we don't need the question mark
    params = params == '?' ? '' : params;

    window.history.replaceState({}, "", baseUrl + params);
};
0
Alper Ebicoglu