JQuery / Javascript (querystring) ile sorgu dizesi parametreleri url değerlerini alma


149

Herkes sorgu dize parametrelerini işlemek için bir jQuery uzantısı yazmak için iyi bir yol biliyor mu? Temelde jQuery sihirli ($)işlevini genişletmek istiyorum, böylece böyle bir şey yapabilirsiniz:

$('?search').val(); 

Bu da bana şu URL'de değer "testini" verecekti: http://www.example.com/index.php?search=test.

Ben jQuery ve Javascript bunu yapabilirsiniz fonksiyonları bir sürü gördüm, ama aslında jQuery tam olarak yukarıda gösterildiği gibi genişletmek istiyorum. Bir jQuery eklentisi aramıyorum, jQuery yöntemine bir uzantı arıyorum.



1
@NicoWesterdale - Bu bağlantıdan geçtim, ancak bu soruyu çözen herhangi bir cevap görmedim. Tam olarak yukarıdaki gibi istediğini söyledi.
mrtsherman

2
Bunu yapabileceğinizi sanmıyorum, geçirilen bir dize sizzler tarafından ayrıştırılır, sonra DOM nesneleri dizisine çözümlenir. Eşleştiriciyi özel filtreler sağlayacak şekilde genişletebilirsiniz, ancak bir dizeye dayalı bir jquery nesneniz olamaz.
Andrew

6
Is not $yeterince aşırı?
Quentin

1
@mrtsherman Sağladığım bağlantıdaki getParameterByName () işlevine bakın. Hayır, doğrudan bir $ istemi içinden yapamazsınız, ancak jQuery seçicileri bunun için değildir. URL dizesinin yalnızca bir bölümünü seçiyor, DOM'un $ () işlevinin yaptığı bölüme erişmeye çalışmıyor. Bu tamamen farklı bir şey. Eğer gerçekten jQuery kullanmak istiyorsanız, bu sözdizimini kullanan bir eklenti yazabilirsiniz: $ .getParameterByName (param), bağlı olduğum sayfada tam olarak bunu yapan bir örnek daha var. Yine de anlamsız.
Nico Westerdale

Yanıtlar:


46

Yıllarca çirkin dize ayrıştırma işleminden sonra, daha iyi bir yol var: URLSearchParams Konumdan değerler almak için bu yeni API'yi nasıl kullanabileceğimize bir göz atalım!

// "? Post = 1234 & action = edit" varsayarsak

var urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('post')); // true
console.log(urlParams.get('action')); // "edit"
console.log(urlParams.getAll('action')); // ["edit"]
console.log(urlParams.toString()); // "?post=1234&action=edit"
console.log(urlParams.append('active', '1')); // "?

post=1234&action=edit&active=1"

GÜNCELLEME: IE desteklenmez

URLSearchParams yerine aşağıdaki yanıttan bu işlevi kullanın

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('action')); //edit

1
tarayıcılar URLSearchParams'ı destekliyor mu?
ilahi

Hata! ohh adam, IE desteklenmiyor !! Sadece test ettim. Chrome, FF, Safari'de sorun yoktur.
Saurin

1
@divine - URLSearchParams için burada bir çoklu
Roberto

Desteklenmeyen tarayıcılar için bir çoklu dolgu eklerseniz bu URLSearchParams çözümü iyi çalışır. github.com/ungap/url-search-params
Louisvdw

104

Neden jQuery genişletmek? JQuery'yi global bir işleve sahip olarak genişletmenin yararı ne olur?

function qs(key) {
    key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
    var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
    return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}

http://jsfiddle.net/gilly3/sgxcL/

Alternatif bir yaklaşım, tüm sorgu dizesini ayrıştırmak ve daha sonra kullanmak üzere değerleri bir nesnede saklamak olacaktır. Bu yaklaşım düzenli bir ifade gerektirmez ve window.locationnesneyi genişletir (ancak küresel bir değişkeni de kolayca kullanabilir):

location.queryString = {};
location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    location.queryString[parts[0]] = parts[1] &&
        decodeURIComponent(parts[1].replace(/\+/g, " "));
});

http://jsfiddle.net/gilly3/YnCeu/

Bu sürüm ayrıca, Array.forEach()IE7 ve IE8'de yerel olarak bulunmayan kullanımından da yararlanır . MDN'deki uygulama kullanılarak eklenebilir veya $.each()bunun yerine jQuery's kullanabilirsiniz .


2
Bu yaygın değildir, ancak sorgu parametrelerinde ve işaretleri yerine noktalı virgül kullanmak geçerlidir.
Muhd

@Muhd - Kodunuzun anladığı sürece bir sorgu dizesinde istediğiniz sınırlayıcıyı kullanmak "geçerli" dir. Ancak, bir form gönderildiğinde, form alanları birbirinden name=valueayrı olarak çiftler halinde gönderilir &. Kodunuz özel bir sorgu dizesi biçimi kullanıyorsa, açıkçası, ister sunucuda ister istemcide, sorgu dizesinin kullanıldığı yere özel bir sorgu dizesi ayrıştırıcısı yazmanız gerekir.
gilly3

2
@nick - İlginç. Ancak HTTP sunucularının noktalı virgülleri "ve" işareti olarak kullanmaları için önerileri, yalnızca bir form gönderimini taklit etmek için bir bağlantı kullanırken HTML'yi daha güzel hale getirmeye yarar. Bu sadece bir öneridir ve standart değildir. Standart form GETgönderimi, application/x-www-form-urlencodeddeğerlerle ayrılmış olarak kodlanır &. Kodum bu standardı ele alıyor. Bağladığınız gibi özel URL yapılarının özel bir ayrıştırıcı sunucu tarafı ve istemci tarafı gerekir. Ne olursa olsun, yukarıdaki koduma böyle bir yetenek eklemek önemsiz olacaktır.
gilly3

1
@gilly - taşınabilir kod istiyorsanız her ikisini de desteklemeniz gerekir
nick

1
Anahtarın büyük / küçük harfe duyarlı olmaması için RegExp () öğesine "i" ekleyin: new RegExp ("[? &]" + Key + "= ([^ &] +) (& | $)", "i"));
17'de Yovav

94

JQuery jQuery-URL-Parser eklentisi aynı işi yapar, örneğin arama sorgusu string parametresinin değerini almak için kullanabilirsiniz

$.url().param('search');

Bu kütüphane aktif olarak tutulmamaktadır. Aynı eklentinin yazarı tarafından önerildiği gibi, URI.js'yi kullanabilirsiniz .

Veya js-url kullanabilirsiniz bunun yerine . Aşağıdaki ile oldukça benzer.

Böylece param sorgusuna şu şekilde erişebilirsiniz: $.url('?search')


2
Güzel. Kod herkese açık alandadır, bu yüzden yorumları eklemenize bile gerek yoktur.
Muhd

4
İyi bir çözüm, ancak dosya üzerinden test ediyorsanız çalışmaz: //
kampsj

1
Whats ile bir şey yapmak zorunda, @kampsj
RameshVel

3
Merhaba @kampsj, file://protokol ile test çok fazla şey işe yaramaz neden olur. Node.js ile çok hızlı ve kolay bir statik HTML sunucusu oluşturabilirsiniz. stackoverflow.com/questions/16333790/…
Jess

2
Bu eklenti artık korunmamaktadır ve yazarın kendisi bunun yerine başka eklentiler kullanmanızı önerir.
JanErikGunnar

77

Bu gem bizim arkadaşlar SitePoint üzerinde bulundu. https://www.sitepoint.com/url-parameters-jquery/ .

PURE jQuery kullanma. Bunu sadece kullandım ve işe yaradı. Örneğin biraz hatırladım.

//URL is http://www.example.com/mypage?ref=registration&email=bobo@example.com

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('ref')); //registration
console.log($.urlParam('email')); //bobo@example.com

İstediğiniz gibi kullanın.


Harika. Teşekkürler! Yine de son kapanış ayracı etiketine ihtiyacınız olduğunu sanmıyorum.
bhtabor

Ahh evet, haklısın. Yayını düzenledi. Bu benim kodumda bazı if deyimi kaldı. Teşekkürler.
ClosDesign

1
.Href yerine window.location.search kullanmalısınız - aksi takdirde iyi.
BrainSlugs83

4
Bunun yerine, results[1] || 0(results) {return results [1]} 0 döndürürse; bcoz sorgu parametreleri hiç mevcut olmayabilir. Ve değişiklik tüm genel durumları ele alacaktır.
myDoggyWritesCode

1
Gibi bir şey varsa ne yaparsın https://example.com/?c=Order+ID? Bu artı işareti hala bu işlevde kalır.
Volomike

47

Bu benim kod örneğim değil, ama geçmişte kullandım.

//First Add this to extend jQuery

    $.extend({
      getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      },
      getUrlVar: function(name){
        return $.getUrlVars()[name];
      }
    });

    //Second call with this:
    // Get object of URL parameters
    var allVars = $.getUrlVars();

    // Getting URL var by its name
    var byName = $.getUrlVar('name');

2
'=' Üzerine bölmemelisiniz, herhangi bir anahtar / değer çiftinin değerinde ikinci bir eşittir işaretinin olması teknik olarak uygundur. - Yalnızca karşılaştığınız ilk eşittir işareti (anahtar / değer çifti başına) sınırlayıcı olarak ele alınmalıdır. (Ayrıca, eşittir işareti kesinlikle gerekli değildir; değeri olmayan bir anahtara sahip olmak mümkündür.)
BrainSlugs83

Temiz çözelti. Benim durumumda mükemmel çalıştı.
JF Gagnon

$ .extend ({getUrlVars: function () {var vars = [], hash; var hashes = window.location.href.slice (window.location.href.indexOf ('?') + 1) .split ('& '); (var i = 0; i <hashes.length; i ++) {hash = hashes [i] .split (' = '); var k = hash.shift (); vars.push (k); vars [k] = hash.join ("");} return vars;}, getUrlVar: function (name) {return $ .getUrlVars () [name];}});
Mupinc

15

Ben sadece sorgu parametresi adını ayrıştırmak zorunda küçük bir işlev yazdı. Eğer varsa:? Project = 12 & Mode = 200 & date = 2013-05-27 ve 'Mode' parametresini istiyorsanız, sadece 'Mode' adını fonksiyona ayrıştırmalısınız:

function getParameterByName( name ){
    var regexS = "[\\?&]"+name+"=([^&#]*)", 
  regex = new RegExp( regexS ),
  results = regex.exec( window.location.search );
  if( results == null ){
    return "";
  } else{
    return decodeURIComponent(results[1].replace(/\+/g, " "));
  }
}

// example caller:
var result =  getParameterByName('Mode');

Adınız önemsiz değilse, ilk normal
ifadeyi bırakabilirsiniz

7

@Rob Neild'in yukarıdaki cevabına dayanarak, burada çözülmüş sorgu dizesi parametrelerinin basit bir nesnesini (% 20, vb. Yok) döndüren saf bir JS uyarlaması var.

function parseQueryString () {
  var parsedParameters = {},
    uriParameters = location.search.substr(1).split('&');

  for (var i = 0; i < uriParameters.length; i++) {
    var parameter = uriParameters[i].split('=');
    parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
  }

  return parsedParameters;
}

Bu kodu kullanırken herhangi bir hata görmedim. Hangi tarayıcıyı kullanıyorsunuz? Mevcut Firefox, Chrome ve Safari'ye karşı test ettim.

Evet, yanlış okuduğum için üzgünüm. Ben tanımsız dönen bir şey üzerinde bir yöntem dediğini düşündüm. Gerçekten gerekmediğinde sadece bir kez çalışıyor. Arama olduğunda "". Ve {"": "tanımsız"} elde
edersiniz

Evet. Muhtemelen bazı rafineri kullanabilir.

1

Yazan Vanilla Javascript

     //Get URL
     var loc = window.location.href;
     console.log(loc);
     var index = loc.indexOf("?");
     console.log(loc.substr(index+1));
     var splitted = loc.substr(index+1).split('&');
     console.log(splitted);
     var paramObj = [];
     for(var i=0;i<splitted.length;i++){
         var params = splitted[i].split('=');
         var key = params[0];
         var value = params[1];
         var obj = {
             [key] : value
         };
         paramObj.push(obj);
         }
    console.log(paramObj);
    //Loop through paramObj to get all the params in query string.

1
function parseQueryString(queryString) {
    if (!queryString) {
        return false;
    }

    let queries = queryString.split("&"), params = {}, temp;

    for (let i = 0, l = queries.length; i < l; i++) {
        temp = queries[i].split('=');
        if (temp[1] !== '') {
            params[temp[0]] = temp[1];
        }
    }
    return params;
}

Bunu kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.