รับค่าพารามิเตอร์สตริงข้อความค้นหาด้วย jQuery / Javascript (การสอบถาม)


149

ใครรู้วิธีที่ดีในการเขียนนามสกุล jQuery เพื่อจัดการพารามิเตอร์สตริงแบบสอบถาม? โดยทั่วไปฉันต้องการขยาย($)ฟังก์ชั่นเวทย์มนตร์ jQuery ดังนั้นฉันสามารถทำสิ่งนี้:

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

ซึ่งจะให้ฉันค่า "ทดสอบ" ใน URL http://www.example.com/index.php?search=testต่อไปนี้:

ฉันได้เห็นฟังก์ชั่นมากมายที่สามารถทำได้ใน jQuery และ Javascript แต่จริง ๆ แล้วฉันต้องการที่จะขยาย jQuery ให้ทำงานตามที่แสดงไว้ด้านบน ฉันไม่ได้มองหาปลั๊กอิน jQuery ฉันกำลังมองหาส่วนขยายของวิธี jQuery



1
@NicoWesterdale - ฉันไปที่ลิงค์นั้น แต่ไม่เห็นคำตอบใด ๆ ที่แก้ปัญหานี้โดยเฉพาะ เขาบอกว่าเขาต้องการอย่างแน่นอนดังกล่าวข้างต้น
mrtsherman

2
ฉันไม่คิดว่าคุณสามารถทำสิ่งนี้ได้สตริงที่ส่งผ่านจะถูกวิเคราะห์โดยซิซซ์เลอร์จากนั้นจึงแก้ไขไปยังอาร์เรย์ของวัตถุ DOM คุณสามารถขยาย matcher เพื่อให้ตัวกรองที่กำหนดเอง แต่คุณไม่สามารถมีวัตถุ jquery ตามสตริง
Andrew

6
มีการรับ$น้ำหนักมากเกินไปหรือไม่
Quentin

1
@mrtsherman ดูที่ฟังก์ชัน getParameterByName () ในลิงก์ที่ฉันให้ไว้ ไม่คุณไม่สามารถทำได้โดยตรงจาก $ พรอมต์ แต่นั่นไม่ใช่ตัวเลือก jQuery เขาเพียงแค่เลือกส่วนของสตริง URL ไม่ใช่พยายามเข้าถึงส่วนของ DOM ซึ่งเป็นสิ่งที่ $ () ทำ มันแตกต่างอย่างสิ้นเชิง หากคุณต้องการใช้ jQuery คุณสามารถเขียนปลั๊กอินที่ใช้รูปแบบนี้: $ .getParameterByName (param) มีตัวอย่างเพิ่มเติมในหน้าเว็บที่ฉันเชื่อมโยงไปถึง ค่อนข้างไม่มีจุดหมายแม้ว่า
Nico Westerdale

คำตอบ:


46

หลังจากปีของการแยกสตริงน่าเกลียดมีวิธีที่ดีกว่า: URLSearchParamsลองมาดูวิธีที่เราสามารถใช้ API ใหม่นี้เพื่อรับค่าจากสถานที่!

// สมมติว่า "? post = 1234 & action = edit"

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"

UPDATE: ไม่รองรับ IE

ใช้ฟังก์ชันนี้จากคำตอบด้านล่างแทนURLSearchParams

$.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
URLSearchParams รองรับเบราว์เซอร์ทั้งหมดหรือไม่
พระเจ้า

อ๊ะ! โอ้มนุษย์ไม่สนับสนุน IE !! ฉันเพิ่งทดสอบกับมัน ในขณะที่ Chrome, FF, Safari ไม่มีปัญหา
Saurin

1
@divine - มี polyfill สำหรับ URLSearchParams ที่นี่: github.com/WebReflection/url-search-params
Roberto

หากคุณเพิ่ม polyfill สำหรับเบราว์เซอร์ที่ไม่รองรับการแก้ปัญหา URLSearchParams นี้จะทำงานได้ดี github.com/ungap/url-search-params
Louisvdw

104

ทำไมต้องขยาย jQuery สิ่งที่จะได้ประโยชน์จากการขยาย jQuery เทียบกับการมีฟังก์ชั่นระดับโลก?

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/

วิธีการทางเลือกคือการแยกสตริงการสืบค้นทั้งหมดและเก็บค่าในวัตถุเพื่อใช้ในภายหลัง วิธีนี้ไม่ต้องการนิพจน์ทั่วไปและขยายwindow.locationวัตถุ (แต่สามารถใช้ตัวแปรโกลบอลได้อย่างง่ายดาย):

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/

รุ่นนี้ยังใช้ประโยชน์จากArray.forEach()ซึ่งไม่สามารถใช้ได้ใน IE7 และ IE8 สามารถเพิ่มได้โดยใช้การนำไปใช้ที่ MDNหรือคุณสามารถใช้ jQuery $.each()แทน


2
ไม่ใช่เรื่องทั่วไป แต่สามารถใช้เซมิโคลอนแทนแอมเปอร์แซนด์ในพารามิเตอร์เคียวรีได้
Muhd

@Muhd - เป็น "ถูกต้อง" เพื่อใช้ตัวคั่นใด ๆ ที่คุณต้องการในการสืบค้นตราบใดที่รหัสของคุณเข้าใจ แต่เมื่อส่งแบบฟอร์มเขตข้อมูลฟอร์มจะถูกส่งเป็นคู่แยกจากกันโดยname=value &หากรหัสของคุณใช้รูปแบบการสืบค้นแบบกำหนดเองแน่นอนคุณจะต้องเขียนตัวแยกวิเคราะห์แบบกำหนดเองทุกครั้งที่มีการใช้การสืบค้นแบบข้อความไม่ว่าจะบนเซิร์ฟเวอร์หรือไคลเอนต์
gilly3

2
@nick - น่าสนใจ แต่ข้อเสนอแนะของพวกเขาสำหรับเซิร์ฟเวอร์ HTTP ในการใช้เซมิโคลอนเป็นเครื่องหมายแอมเปอร์แซนด์ทำหน้าที่เฉพาะเพื่อทำให้ HTML สวยขึ้นเมื่อใช้ลิงก์เพื่อเลียนแบบการส่งแบบฟอร์ม มันเป็นเพียงข้อเสนอแนะและไม่เป็นมาตรฐาน รูปแบบมาตรฐานGETการส่งจะถูกเข้ารหัสเป็นมีค่าคั่นด้วยapplication/x-www-form-urlencoded &รหัสของฉันจัดการกับมาตรฐานนั้น โครงสร้าง URL ที่กำหนดเองเช่นโครงสร้างที่คุณเชื่อมโยงจะต้องใช้ตัวแยกวิเคราะห์ฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ ไม่ว่าการเพิ่มความสามารถให้กับโค้ดของฉันด้านบนจะเป็นเรื่องเล็กน้อย
gilly3

1
@gilly แน่นอน - หากคุณต้องการรหัสแบบพกพาคุณต้องให้การสนับสนุนทั้งคู่
nick

1
เพิ่ม "i" ลงใน RegExp () เพื่อให้คีย์สามารถใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: RegExp ใหม่ ("[? &]" + key + "= ([^ &] +) (& | $)", "i"));
Yovav

94

JQuery jQuery-URL-Parserปลั๊กอินทำงานเดียวกันตัวอย่างเช่นในการเรียกค่าของการค้นหาสตริงแบบสอบถามพารามิเตอร์คุณสามารถใช้

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

ห้องสมุดนี้ไม่ได้รับการบำรุงรักษาอย่างแข็งขัน ตามที่ผู้เขียนปลั๊กอินแนะนำไว้คุณสามารถใช้URI.jsได้

หรือคุณสามารถใช้js-urlแทน มันค่อนข้างคล้ายกับด้านล่าง

ดังนั้นคุณสามารถเข้าถึงพารามิเตอร์แบบสอบถามเช่น $.url('?search')


2
ดี และรหัสอยู่ในโดเมนสาธารณะดังนั้นคุณไม่จำเป็นต้องรวมความคิดเห็น
Muhd

4
ทางออกที่ดี แต่จะไม่ทำงานถ้าคุณทดสอบผ่านไฟล์: //
kampsj

1
อะไรที่ต้องทำอะไรกับ @kampsj
RameshVel

3
สวัสดี @kampj การทดสอบด้วยfile://โปรโตคอลจะทำให้สิ่งต่าง ๆ อีกมากมายไม่ทำงาน คุณสามารถสร้างเซิร์ฟเวอร์ HTML แบบคงที่ที่ง่ายและรวดเร็วด้วย node.js stackoverflow.com/questions/16333790/…
Jess

2
ปลั๊กอินนี้ไม่ได้รับการดูแลรักษาอีกต่อไปและผู้เขียนแนะนำให้ใช้ปลั๊กอินอื่นแทน
JanErikGunnar

77

พบอัญมณีนี้จากเพื่อนของเราที่ SitePoint https://www.sitepoint.com/url-parameters-jquery/

ใช้ PURE jQuery ฉันเพิ่งใช้มันและมันใช้งานได้ ปรับตัวอย่างเล็กน้อยเพื่อเห็นแก่

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

ใช้ตามที่คุณต้องการ


ยิ่งใหญ่ ขอบคุณ! ฉันไม่คิดว่าคุณจะต้องใช้แท็กวงเล็บปิดครั้งสุดท้าย
bhtabor

อ่าใช่คุณถูกต้องแล้ว แก้ไขโพสต์ ที่เหลือจากบางคำสั่งถ้าในรหัสของฉัน ขอบคุณ
ClosDesign

1
คุณควรใช้ window.location.search แทนที่จะเป็น. href - อย่างอื่นดี
BrainSlugs83

4
แทนการresults[1] || 0ที่คุณจะต้องทำอย่างไรถ้า (ผล) {ผลตอบแทนผล [1]} return 0; พารามิเตอร์ข้อความค้นหา bcoz อาจไม่ปรากฏเลย และการแก้ไขจะจัดการกับกรณีทั่วไปทั้งหมด
myDoggyWritesCode

1
คุณจะทำอย่างไรถ้าคุณมีสิ่งที่ชอบhttps://example.com/?c=Order+ID? เครื่องหมายบวกยังคงอยู่ในฟังก์ชันนี้
Volomike

47

นี่ไม่ใช่ตัวอย่างรหัสของฉัน แต่ฉันเคยใช้มาแล้วในอดีต

//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
คุณไม่ควรแยก '=' มันเป็นเทคนิคที่จะมีเครื่องหมายเท่ากับสองในค่าของคู่คีย์ / ค่าใด ๆ - เฉพาะเครื่องหมายเท่ากับแรกที่คุณพบ (ต่อคู่คีย์ / ค่า) ควรถูกใช้เป็นตัวคั่น (นอกจากนี้เครื่องหมายเท่ากับไม่จำเป็นต้องเคร่งครัดมันเป็นไปได้ที่จะมีกุญแจที่ไม่มีค่า)
BrainSlugs83

น้ำยาทำความสะอาด ทำงานอย่างสมบูรณ์แบบในกรณีของฉัน
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 = hash [i] .split (' = '); var k = hash.shift (); vars.push (k); vars [k] = hash.join ("");} return vars;}, getUrlVar: function (ชื่อ) {return $ .getUrlVars () [name];}});
Mupinc

15

ฉันเขียนฟังก์ชันเล็ก ๆ น้อย ๆ ที่คุณต้องแยกวิเคราะห์ชื่อของพารามิเตอร์การสืบค้น ดังนั้นหากคุณมี:? Project = 12 & Mode = 200 & date = 2013-05-27 และคุณต้องการพารามิเตอร์ 'Mode' คุณจะต้องแยกชื่อ 'Mode' ในฟังก์ชั่น:

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

หากชื่อของคุณไม่มีขยะคุณสามารถปล่อย regex แรกและมันก็สมเหตุสมผลที่จะเริ่มต้นจาก location.search
mplungjan

7

สร้างจากคำตอบของ @Rob Neild ด้านบนนี่คือการปรับ JS บริสุทธิ์ที่ส่งคืนออบเจ็กต์ที่เรียบง่ายของพารามิเตอร์สตริงการถอดรหัสที่ถอดรหัส (ไม่มี% 20 ฯลฯ )

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

ฉันไม่เห็นข้อผิดพลาดใด ๆ ในการใช้รหัสนี้ สิ่งที่เบราว์เซอร์ที่คุณใช้? ฉันทดสอบกับ Firefox, Chrome และ Safari ปัจจุบัน

ใช่ฉันอ่านผิด ฉันคิดว่าฉันเห็นมันเรียกวิธีการในสิ่งที่กลับไม่ได้กำหนด ดังนั้นมันจึงทำงานเพียงครั้งเดียวเมื่อไม่จำเป็นต้อง เมื่อค้นหา""แล้ว และคุณจะได้ {"": "undefined"}
Jerinaw

ใช่. นั่นอาจใช้การกลั่นบางอย่าง

1

เขียนใน 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;
}

ฉันใช้สิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.