web-dev-qa-db-ja.com

URLのパラメーターを追加/変更し、新しいURLにリダイレクトします

_&view-all_パラメータがURLに存在しない場合、値とともにURLの最後に追加する必要があります。存在する場合は、新しいURLを作成せずに値を変更できる必要があります。これは、その前に他のパラメーターがある場合とない場合があるためです。

私はこの関数を見つけましたが、動作させることができません: https://stackoverflow.com/a/10997390/837705

上記の関数を使用したコードを次に示します(機能しません): http://jsfiddle.net/Draven/tTPYL/4/

私はすでにパラメーターと値を追加する方法を知っています:

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

詳細:

URLが_http://www.domain.com/index.php?action=my_action_の場合、デフォルトの「&view-all」値は「Yes」になるため、ボタンをクリックしたときにリダイレクトされるURLは_http://www.domain.com/index.php?action=my_action&view-all=Yes_です。

URLが_http://www.domain.com/index.php?action=my_action&view-all=Yes_の場合、ボタンをクリックすると_http://www.domain.com/index.php?action=my_action&view-all=No​​​_に変わります

EDIT:例を挙げてください。私は多くのJSを知らず、PHPでそれを行う方法を考えることができません。

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

Onclickイベントで上記の関数を呼び出します。

62
Lajos Arpad

すべてのpreivousソリューションは、パラメーターのサブストリングの可能性を考慮していません。たとえば、 http:// xyz?ca = 1&a = 2 はパラメーターaではなくcaを選択します。ここにパラメータを通過してチェックする関数があります。

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

同様の状況で、URLクエリパラメーターを置き換えたい場合がありました。ただし、パラメーターは1つしかなく、単純に置き換えることができました。

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

location.search property を使用すると、URLのクエリ部分を取得または設定できます。

4
Andrew

入力からURLを取得しますが、実際のURLに簡単に調整できます。

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

PHPでそれを行うには、ページを表示するためのパラメーターがいくつかあります。たとえば、actionview-allとします。 (おそらく)$action = $_GET['action']などで既にこれらにアクセスします。デフォルト値を設定している可能性があります。

次に、$viewAll = $viewAll == 'Yes' ? 'No' : 'Yes'のような変数を切り替えるかどうかに応じて決定します。

そして最後に、これらの値を使用してURLを再度作成します

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

以上です。

したがって、ユーザーのURLではなくページのステータスに依存します(多分、後で$ viewAllがデフォルトまたは何でもYesであると判断するため)。

1
Marc

@Lajosの答えに少し変更することをお勧めします...私の特定の状況では、URLの一部としてハッシュを含む可能性があり、リダイレクト後にこのメソッドで挿入しているパラメータの解析に問題が発生する可能性があります。

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

あなたを導くいくつかの簡単なアイデア:

PHPでは、次のように実行できます。

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

Javascriptの場合:

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

@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

これを実現する方法を次に示します。パラメーター名とパラメーター値、およびオプションの「クリア」を取ります。 clear = trueを指定すると、他のすべてのパラメーターが削除され、新しく追加されたパラメーターがそのまま残ります。他の場合は、元のパラメーターを新しいものに置き換えるか、クエリ文字列にない場合は追加します。

これは、最後の値以外を置き換えると壊れたため、元のトップアンサーから変更されます。これはどの値でも機能し、既存の順序を保持します。

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

ブラウザに実行させることができるのに、クエリ文字列を自分で解析するのはなぜですか?

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

以下のスクリプトを調整するか、wordpressサイトで使用できるスクリプトを見つけて、前方URLからURL接尾辞パラメーターを取得し、ボタンをクリックしてURLに追加する必要があります。適切なフォワード広告IDを追跡するため。

理由:ユーザーがボタンクリックを使用してoptinページから販売ページに移動した場合でも、ユーザーがどの広告から転送されたかを見つけるための広告追跡にパラメーターが使用されます。

ここで到達する目標は次のとおりです。1. FB広告は、トラッキングコードを含むoptinページを指します。 https://ownsite.com/optin-page/?tid=fbad1 2. optin-pageで販売ページに転送するためのセットアップURLを備えたボタンがありますが、クリックするとURLのみが転送されますが、パラメーター「?tid = fbad1」が欠落しています。 3.以下の自動転送スクリプト(正常に動作しています)を使用して、ボタンクリックフォワードを変更できますが、utmパラメーターではなく「tid」パラメーターのみを取得するため、制限があります。

したがって、クリックボタンを設定し(スタイルを設定したり、代わりに画像を使用したり)、ボタンをクリックして別の販売ページに転送するスクリプトコードを実装し、現在のoptin-pageから接尾辞パラメーターを取得して、次に販売するページ https://ownsite.com/sales-page/?tid=fbad1 UTMパラメーターも含む

現在、自動リダイレクトスクリプトを使用してこれを解決できましたが、A。)このページでは自動リダイレクトを使用したくありません。より良いのは、ユーザー自身がクリックしてURLパラメータを含めて転送できるようにするためのイベントクリックボタンです。 B.)このスクリプトのトラッキングIDパラメーターは「?tid = ...」に制限されます。代わりに、ボタンクリック時のUTMコードもトラッキングします。つまり、現在のページからURLのパラメーターを取得します https: //www.optin-page.com/?tid=facebookad1?utm_campaign=blogpost 次に、ボタンをクリックしてパラメーターを取得し、ボタンセットURLに追加します https://www.sales-page.com/? tid = facebookad1?utm_campaign = blogpost

ここで、自動リダイレクトおよびURLパラメータの取得に使用されている以下のコードを見つけてください。このコードは、クリックイベントでボタンを作成し、ボタンがクリックされた場合に現在のURLのパラメーターを取得して、上記のようにリダイレクトURLにリダイレクトできるように変更されます。

    <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

これはJSでURLクエリ文字列を再構築するための私のサンプルコードです

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

JQUERY param: http://api.jquery.com/jquery.param/ を使用して、新しいパラメーターで新しいURLを作成しました。

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