2011-08-01 34 views
12

私の現在のURLは次のとおりです。ユーザーが(300と言う)最低価格フィルターをクリックしたときにhttp://something.com/mobiles.php?brand=samsungURLにパラメータを追加するにはどうすればよいですか?

は今、私は私のURLは、言い換えれば

http://something.com/mobiles.php?brand=samsung&priceMin=300

になりたい、私を探しています現在のURLに指定されたパラメータを追加して、新しいURLにウェブページをリダイレクトするjavascript関数。

注:何のパラメータが設定されていない場合は、現在のURLは、そのページがhttp://something.com/mobiles.php?priceMin=300 代わりのhttp://something.com/mobiles.php&priceMin=300

+1

...私はその助けの誰かを願っていますが、リンクサーバー側を生成したり使用することはできません任意の理由を

function addOrUpdateUrlParam($name, $value){ $href = $_SERVER['REQUEST_URI']; $regex = '/[&\\?]' . $name . "=/"; if(preg_match($regex, $href)){ $regex = '([&\\?])'.$name.'=\\d+'; $link = preg_replace($regex, "$1" . $name . "=" . $value, $href); }else{ if(strpos($href, '?')!=false){ $link = $href . "&" . $name . "=" . $value; }else{ $link = $href . "?" . $name . "=" . $value; } } return $link; } 

をウェブフォーム? – zzzzBov

+0

私は@zzzzBovに同意します。その後、最低価格フィルタをダイナミックリンクにすることができます。 – iLLin

+1

ブランド名、価格帯、人気順、価格別などのように、私のウェブサイトにはフィルタが多すぎます。サーバー側でURLを生成するには 'if-else'ステートメントが多く必要であり、サーバーに不必要な負荷が発生します。私は具体的にクライアント側でURLの変更を探しています。ありがとう! –

答えて

16

このような何かをしようとあなたはすでにURLでのparamことを持っている場合、それはまた、例を検討する必要があります。

function addOrUpdateUrlParam(name, value) 
{ 
    var href = window.location.href; 
    var regex = new RegExp("[&\\?]" + name + "="); 
    if(regex.test(href)) 
    { 
    regex = new RegExp("([&\\?])" + name + "=\\d+"); 
    window.location.href = href.replace(regex, "$1" + name + "=" + value); 
    } 
    else 
    { 
    if(href.indexOf("?") > -1) 
     window.location.href = href + "&" + name + "=" + value; 
    else 
     window.location.href = href + "?" + name + "=" + value; 
    } 
} 

、あなたはあなたのケースのように、それを呼び出す:

addOrUpdateUrlParam('priceMin', 300); 
+0

'mypriceMin'という名前のパラメータが既にlocation.hrefの一部である場合、それも変更される可能性があるので、コードが実際に目的のために働いていることに注意してください。さらに、正規表現は完全なhrefではなく、検索部分でのみ実行する必要があります。 – hakre

+0

@hakre fixed "mypriceMin" problem :)検索部分のみ - はい、これは短い文字列ではより効率的ですが、もちろんこれは最適な解決策ではなく、誰でも好みに合わせて調整することができます – petho

+0

実際に比較する関数を追加しました正規化されたパラメータ名。すでに存在し、値を持たず、重複するパラメータを削除するsetのパラメータ。それは検索のみで動作し、残りのURIを処理する必要はありません。 – hakre

4
if(location.search === "") { 
    location.href = location.href + "?priceMin=300"; 
} else { 
    location.href = location.href + "&priceMin=300"; 
} 
にリダイレクトする必要があります http://something.com/mobiles.phpであるならば、関数は ?の代わりに、すなわち &

を追加する必要があります

location.search === ""の場合、?部分はありません。

?newpartを追加すると、.php?newpartになります。

それ以外の場合は、既に?の部分があります。

&newpartを追加すると、.php?existingpart&newpartになります。 hakreへ


おかげで、あなたは、単にそれが好きで設定することができます。

location.search += "&newpart"; 

必要であれば明らかでない場合には、それはそれ?&newpartこの方法を行いますそれは自動的に(?が追加されますが、それはいけません問題)。

+0

あなたの例では 'if'の必要はなく、まったく同じことができます'location.search + ="&priceMin = 300 ";'のみ。 – hakre

+0

@hakre:申し訳ありませんが、実際に '?'と '&'を区別するために 'if'があります。 – pimvdb

+1

'?'をまだ設定していなければ 'search 'を使う必要がないので余計です。あなたのコードでは、私はそれを見るように、最後にハッシュパーツの後ろに追加して、 'test.html?a = b#filter'を試してみてください。 – hakre

0

ユーザーが最低価格のテキストフィールドに記入する場合は、フォームを空白のアクションでGETリクエストとして送信してみましょう。 IIRCは、あなたが望むだけで、JavaScriptを使わずにすべきです。

0

URLがすでに含まれている場合は、URLに

チェックを取得するために使用var urlString = window.location 'が?' urlString.indexOf('?')で-1は存在しないことを意味します。

これはジャバスクリプトの101のようなものである

をリダイレクトするwindow.locationを設定します。検索エンジンを試してみてください!

0
<FORM action="" method="get"> 
<P> 
<LABEL for="brand">Brand: </LABEL> 
      <INPUT type="text" id="brand"><BR> 
<LABEL for="priceMin">Minimum Price: </LABEL> 
      <INPUT type="text" id="priceMin"><BR> 
</P> 

1
var applyMinPrice = function(minPrice) { 
    var existingParams = (location.href.indexOf('?') !== -1), 
     separator = existingParams ? '&' : '?', 
     newParams = separator + 'priceMin=' + minPrice; 

    location.href += newParams; 
} 
13

実際これはJavaScriptの場所オブジェクトは既にこれを扱っているので、まったく問題ありません。ただ、リンクなどでそれを再利用する機能には、このワンライナーをカプセル化:

<script> 
    function addParam(v) { 
     window.location.search += '&' + v; 
    } 
</script> 

<a href="javascript:addParam('priceMin=300');">add priceMin=300</a> 

これはすでにsearch一部で、あなただけのparamを追加する必要があるとして?をチェックする必要はありません。

あなたも、あなたがように書くことができる機能を利用するにはしたくない場合:その特定のパラメータを追加するには:

<a href="javascript:location.search+='&priceMin=300';">add priceMin=300</a> 

が、これはあなたが求めてきましたまさにないことに注意してください。これはすでにsearchの一部になっている可能性があります。これは、同じパラメータをURIに複数回使用できるためです。アプリケーション内でこれを正規化することもできますが、それは別のフィールドです。私はURL正規化をそれ自身の関数に集中させます。

編集:それが必要、パラメータがすでに存在する場合

  • :それ以上の受け入れ答えについての議論で

    は、次の条件が働く機能を得るために満たさなければならないという、明らかになりました変更する。

  • パラメータが複数回存在する場合は、変更されたコピーのみが存続する必要があります。
  • パラメータがすでに存在するが値がない場合は、値を設定する必要があります。

searchがすでに検索文字列を提供しているように、唯一のことは、達成するために左に、名前と値のペアにそのクエリ-info部を解析欠落している名前と値を変更したり、追加しsearchに戻って、それを追加することです

test.html?a?b&c&test=foo&priceMin=300 

あるいは:

:それはこれらのようなURLを取り扱うことができるよう

<script> 
    function setParam(name, value) { 
     var l = window.location; 

     /* build params */ 
     var params = {};   
     var x = /(?:\??)([^=&?]+)=?([^&?]*)/g;   
     var s = l.search; 
     for(var r = x.exec(s); r; r = x.exec(s)) 
     { 
      r[1] = decodeURIComponent(r[1]); 
      if (!r[2]) r[2] = '%%'; 
      params[r[1]] = r[2]; 
     } 

     /* set param */ 
     params[name] = encodeURIComponent(value); 

     /* build search */ 
     var search = []; 
     for(var i in params) 
     { 
      var p = encodeURIComponent(i); 
      var v = params[i]; 
      if (v != '%%') p += '=' + v; 
      search.push(p); 
     } 
     search = search.join('&'); 

     /* execute search */ 
     l.search = search; 
    } 
</script> 

<a href="javascript:setParam('priceMin', 300);">add priceMin=300</a> 

は、これは、少なくとも、もう少し堅牢です

test.html?a?b&c&test=foo&pri%63eMin=300 

さらに、追加された名前と値は常に正しくエンコードされます。これが失敗する可能性があるのは、パラメータ名が不正なプロパティjsラベルになる場合です。

+0

ありがとう、このsetParam関数は本当に便利です。複数のパラメータを設定するために複数回呼び出す方法はありますか? – Alex

+0

ありがとうございます! – sputn1k

0
<html> 
<body> 
.. 
.. 
.. 

<?php 
$priceMinValue= addslashes ($_GET['priceMin']); 
if (!empty($priceMin)) { 
     $link = "currentpage.php?priceMin=". $priceMinValue; 
     die("<script>location.href = '".$link. "'</script>");  
} 
?> 
</body> 
</html> 
+0

彼はクライアントサイドのJavaScript、サーバー側ではない – JaMaBing

2

私はPHPで正しい答え書き換える:

関連する問題