ජාවාස්ක්‍රිප්ට් හි විමසුම් වචන අගයන් ලබා ගන්නේ කෙසේද?


2697

JQuery (හෝ නැතිව) හරහා විමසුම් වචන අගයන් ලබා ගැනීමේ ප්ලගිනය අඩු ක්‍රමයක් තිබේද?

එසේ නම්, කෙසේද? එසේ නොවේ නම්, එසේ කළ හැකි ප්ලගිනයක් තිබේද?


මම jQuery-Plugin - getUrlParam (2 වන අනුවාදය) හි විස්තර කර ඇති getUrlParam ප්ලගිනය භාවිතා කරමි .
කෝමා

69
සරල ජාවාස්ක්රිප්ට් RegEx තොරව විසඳුම: css-tricks.com/snippets/javascript/get-url-variables
ලොරෙන්සෝ Polidori

6
JQuery අවශ්‍ය නොවන බවට ඇති විශිෂ්ට නිරීක්‍ෂණය නිසා ප්‍රශ්නයට ඉහළම විසඳුම එහි ජනප්‍රියතාවයට සුදුසු වුවද, නව නිත්‍ය ප්‍රකාශන නිර්මාණය කිරීම සහ අපේක්ෂිත සෑම පරාමිතියක් සඳහාම විමසුම් නූල නැවත විග්‍රහ කිරීම එහි ක්‍රමය අතිශයින්ම අකාර්යක්ෂම වේ. වඩා කාර්යක්ෂම (සහ බහුකාර්ය) විසඳුම් දීර්
ජෝශප් මයර්ස්


4
ජෝශප්, “jQuery අවශ්‍ය නොවන බවට විශිෂ්ට නිරීක්ෂණයක්”? ඇත්ත වශයෙන්ම එය අවශ්ය නොවේ. JQuery කරන සෑම දෙයක්ම, එය JavaScript භාවිතා කරයි. ජාවාස්ක්‍රිප්ට් හට කළ නොහැකි දේවල් කරන නිසා මිනිසුන් jQuery භාවිතා නොකරයි. JQuery හි ලක්ෂ්‍යය පහසුවයි.
ව්ලැඩිමීර් කෝර්නියා

Answers:


8357

යාවත්කාලීන කිරීම: 2018 සැප්තැම්බර්

ඔබට URLSearchParams භාවිතා කළ හැකි අතර එය සරල (නමුත් සම්පූර්ණ නොවේ) බ්‍රව්සර් සහාය ඇත.

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');

මුල්

ඒ සඳහා ඔබට jQuery අවශ්‍ය නොවේ. ඔබට පිරිසිදු ජාවාස්ක්‍රිප්ට් කිහිපයක් භාවිතා කළ හැකිය:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

භාවිතය:

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)


සටහන: පරාමිතියක් කිහිප වතාවක් ( ?foo=lorem&foo=ipsum) තිබේ නම්, ඔබට පළමු අගය ( lorem) ලැබෙනු ඇත . මේ පිළිබඳව ප්‍රමිතියක් නොමැති අතර භාවිතයන් වෙනස් වේ, උදාහරණයක් ලෙස මෙම ප්‍රශ්නය බලන්න: අනුපිටපත් HTTP GET විමසුම් යතුරු වල බලයලත් පිහිටීම .
සටහන: ශ්‍රිතය සිද්ධි සංවේදී ය. ඔබ සිද්ධි-සංවේදී නොවන පරාමිති නාමයට කැමති නම්, RegExp වෙත 'i' විකරණකාරකය එක් කරන්න


එකම ප්‍රති result ලය වඩාත් සංක්ෂිප්තව ලබා ගැනීම සඳහා මෙය නව URLSearchParams පිරිවිතර මත පදනම් වූ යාවත්කාලීන කිරීමකි . පහත දැක්වෙන " URLSearchParams " යන පිළිතුර බලන්න .


131
මෙම ශ්‍රිතය හැසිරවිය http://www.mysite.com/index.php?x=x1&x=x2&x=x3යුතු ආකාරය ක්ෂේත්‍රයේ වටිනාකම xඅපැහැදිලි ය.
dpp

94
මෙය ද බහු-වටිනා යතුරු හසුරුවන්නේ නැත , ඒවා ද නීත්‍යානුකූල ය.
කඩිමුඩියේ

17
ඔබ මේ සඳහා නිත්‍ය ප්‍රකාශනයක් භාවිතා කරන්නේ ඇයි?
රයි-

28
විමසීමක් සඳහා ?mykey=0&m.+key=1, ඇමතුම වෙනුවට getParameterByName("m.+key")නැවත පැමිණේ . ඔබේ නිත්‍ය ප්‍රකාශනය ගොඩනැගීමට පෙර නිත්‍ය ප්‍රකාශන මෙටාචරැක්ටර් වලින් ගැලවිය යුතුය . ඔබට අවශ්‍ය වන්නේ එක් වරක් පමණක් ගෝලීය ධජය භාවිතා කර ආදේශන ප්‍රකාශනය ලෙස භාවිතා කිරීමෙනි . ඒ වෙනුවට ඔබ සෙවිය යුතුය . උඩුකුරු 400 කට වඩා වැඩි පිළිතුරක් මෙම විස්තර සඳහා වගකිව යුතුය. 01name.replace()"\\$&"location.searchlocation.href
gilly3

7
ඒ සඳහා හෝ වෙනත් අරමුණක් සඳහා ඔබට jQuery අවශ්‍ය නොවේ. ඔබට එය ඇත්තෙන්ම අවශ්‍ය නොවේ.
gztomas

1710

මෙහි පළ කර ඇති සමහර විසඳුම් අකාර්යක්ෂම වේ. ස්ක්‍රිප්ටයට පරාමිතියකට ප්‍රවේශ වීමට අවශ්‍ය සෑම අවස්ථාවකම නිත්‍ය ප්‍රකාශන සෙවීම පුනරාවර්තනය කිරීම සම්පූර්ණයෙන්ම අනවශ්‍යය, පරාමිතීන් අනුබද්ධ-අරාව ශෛලීය වස්තුවකට බෙදීමට එක් කාර්යයක් ප්‍රමාණවත් වේ. ඔබ HTML 5 ඉතිහාස API සමඟ වැඩ නොකරන්නේ නම්, මෙය අවශ්‍ය වන්නේ පිටු පැටවීමකට එක් වරක් පමණි. මෙහි ඇති අනෙක් යෝජනා ද URL එක නිවැරදිව විකේතනය කිරීමට අසමත් වේ.

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = /\+/g,  // Regex for replacing addition symbol with a space
        search = /([^&=]+)=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

උදාහරණ විමසුම්:

?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc=+Hello%20&empty

ප්‍රති ult ලය:

 urlParams = {
    enc: " Hello ",
    i: "main",
    mode: "front",
    sid: "de8d49b78a85a322c4155015fdce22c4",
    empty: ""
}

alert(urlParams["mode"]);
// -> "front"

alert("empty" in urlParams);
// -> true

අරා-ශෛලියේ විමසුම් නූල් හැසිරවීමට මෙය පහසුවෙන් වැඩිදියුණු කළ හැකිය. මේ සඳහා උදාහරණයක් මෙහි ඇත , නමුත් අරාව-ශෛලීය පරාමිතීන් RFC 3986 හි අර්ථ දක්වා නොමැති බැවින් මම මෙම පිළිතුර ප්‍රභව කේතය සමඟ දූෂණය නොකරමි. "දූෂිත" අනුවාදයක් ගැන උනන්දුවක් දක්වන අය සඳහා, කැම්බල්ගේ පිළිතුර පහත බලන්න .

එසේම, අදහස් දැක්වීමේදී පෙන්වා ඇති පරිදි, යුගල ;සඳහා නෛතික පරිසීමකයකි key=value. එය හැසිරවීමට වඩාත් සංකීර්ණ රීජෙක්ස් අවශ්‍ය වනු ඇත , ;නැතහොත් &එය අනවශ්‍ය යැයි මා සිතන බැවින් එය ;භාවිතා කිරීම දුර්ලභ වන අතර ඒ දෙකම භාවිතා කිරීමට වඩා අඩු යැයි මම කියමි. ;ඒ වෙනුවට ඔබට සහාය වීමට අවශ්‍ය නම් &, ඒවා රීජෙක්ස් තුළට මාරු කරන්න.


ඔබ සේවාදායක පාර්ශවීය පෙර සැකසුම් භාෂාවක් භාවිතා කරන්නේ නම්, ඔබ වෙනුවෙන් බර ඉසිලීම සිදු කිරීම සඳහා එහි ස්වදේශීය JSON කාර්යයන් භාවිතා කිරීමට ඔබට අවශ්‍ය විය හැකිය. උදාහරණයක් ලෙස, PHP හි ඔබට ලිවිය හැකිය:

<script>var urlParams = <?php echo json_encode($_GET, JSON_HEX_TAG);?>;</script>

වඩා සරලයි!

යාවත්කාලීන කරන ලදි

නව හැකියාවක් වනුයේ පහත දැක්වෙන පරිදි නැවත නැවතත් පරාමිතීන් ලබා ගැනීමයි myparam=1&myparam=2. එහි නො වේ පිරිවිතර , කෙසේ වෙතත්, වත්මන් ප්රවේශයන් බොහෝ රැසක් උත්පාදනය අනුගමනය කරන්න.

myparam = ["1", "2"]

එබැවින්, එය කළමනාකරණය කිරීමේ ප්‍රවේශය මෙයයි:

let urlParams = {};
(window.onpopstate = function () {
    let match,
        pl = /\+/g,  // Regex for replacing addition symbol with a space
        search = /([^&=]+)=?([^&]*)/g,
        decode = function (s) {
            return decodeURIComponent(s.replace(pl, " "));
        },
        query = window.location.search.substring(1);

    while (match = search.exec(query)) {
        if (decode(match[1]) in urlParams) {
            if (!Array.isArray(urlParams[decode(match[1])])) {
                urlParams[decode(match[1])] = [urlParams[decode(match[1])]];
            }
            urlParams[decode(match[1])].push(decode(match[2]));
        } else {
            urlParams[decode(match[1])] = decode(match[2]);
        }
    }
})();

11
ඔබ අධික ලෙස අජැක්ස් යෙදුමක් කරන්නේ නම්, ඔබ "පසුපස බොත්තම සක්‍රීය කිරීම" සඳහා හැෂ් (#) භාවිතා කරයි ... එවැනි අවස්ථාවකදී විමසුම් කාලය සෑම විටම වෙනස් වනු ඇත (ෆේස්බුක් එය කරන්නේ කෙසේදැයි බලන්න). .. මෙම විසඳුම් # මාර්ගයෙන් පසුව එන දේවල් නොසලකා හැරියද ...
නික් ෆ්‍රැන්චෙස්චිනා

100
Ick නික්: හැෂ් පසු ඕනෑම දෙයක් දේපලෙහි වෙන්ව ඇති අතර එය දේපලෙන් window.location.hashවෙන් වේ window.location.search. හැෂ් වෙනස් වුවහොත්, එය කිසිසේත්ම විමසුම් වලට බලපාන්නේ නැත.
ඇන්ඩි ඊ

27
මෙම අමතක කරන්න එපා ;කියන්නේ නීතිමය පරිසීමකය ලබා ගන්න සඳහා key=valueයුගල. එය දුර්ලභ ය, නමුත් එය ක්‍රියාත්මක කිරීමට තත්පර 5 ක් ගතවේ.
alex

4
සාධාරණ ලෙස කිවහොත්, විමසුම් නූල සඳහා නිශ්චිත ආකෘතියක් RFC3986 විසින් අර්ථ දක්වා නොමැත. ?a=b&c=dසාම්ප්‍රදායික වන අතර වෙබ් පෝරම සඳහා W3C නිර්දේශයකි, නමුත් URI පිරිවිතර අර්ථ දක්වයි query = *( pchar / "/" / "?" ).
මැතිව් ගිලියඩ්

21
JSHint හි තරමක් දැඩි සැකසුමක් භාවිතා කරන අප සඳහාwhile(match = search.exec(query))while((match = search.exec(query)) !== null)
ක්‍රේගට්ස්

1283

ES2015 (ES6)

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

JQuery නොමැතිව

var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i)
    {
        var p=a[i].split('=', 2);
        if (p.length == 1)
            b[p[0]] = "";
        else
            b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));

වැනි URL සමඟ ?topic=123&name=query+string, පහත සඳහන් දෑ නැවත ලැබෙනු ඇත:

qs["topic"];    // 123
qs["name"];     // query string
qs["nothere"];  // undefined (object)

ගූගල් ක්‍රමය

ගූගල් කේතය ඉරා දැමීමෙන් ඔවුන් භාවිතා කරන ක්‍රමය මට හමු විය: getUrlParameters

function (b) {
    var c = typeof b === "undefined";
    if (a !== h && c) return a;
    for (var d = {}, b = b || k[B][vb], e = b[p]("?"), f = b[p]("#"), b = (f === -1 ? b[Ya](e + 1) : [b[Ya](e + 1, f - e - 1), "&", b[Ya](f + 1)][K](""))[z]("&"), e = i.dd ? ia : unescape, f = 0, g = b[w]; f < g; ++f) {
        var l = b[f][p]("=");
        if (l !== -1) {
            var q = b[f][I](0, l),
                l = b[f][I](l + 1),
                l = l[Ca](/\+/g, " ");
            try {
                d[q] = e(l)
            } catch (A) {}
        }
    }
    c && (a = d);
    return d
}

එය අපැහැදිලි ය, නමුත් එය තේරුම්ගත හැකි ය. සමහර විචල්යයන් නිර්වචනය කර නොමැති නිසා එය ක්රියා නොකරයි.

ඔවුන් අතර, අදාල url එක මත පරාමිතීන් සොයා ගැනීමට ආරම්භ ?ද හැෂ් සිට #. ඉන්පසු සෑම පරාමිතියක් සඳහාම ඔවුන් සමාන ලකුණකට බෙදී යයි b[f][p]("=")(පෙනෙන ආකාරයට indexOf, යතුර / අගය ලබා ගැනීම සඳහා ඔවුන් වර්‍ගයේ පිහිටීම භාවිතා කරයි). එය බෙදී යාමෙන් ඔවුන් පරාමිතියට වටිනාකමක් තිබේද නැද්ද යන්න පරීක්ෂා කරයි, එය තිබේ නම් ඒවායේ වටිනාකම ගබඩා කරයි, එසේ නොමැතිනම් dඒවා දිගටම පවතී.

අවසානයේදී වස්තුව dආපසු ලබා දෙන අතර, පැන යාම සහ +ලකුණ හැසිරවීම . මෙම වස්තුව මගේ හා සමාන ය, එයට සමාන හැසිරීමක් ඇත.


JQuery ප්ලගිනයක් ලෙස මගේ ක්‍රමය

(function($) {
    $.QueryString = (function(paramsArray) {
        let params = {};

        for (let i = 0; i < paramsArray.length; ++i)
        {
            let param = paramsArray[i]
                .split('=', 2);
            
            if (param.length !== 2)
                continue;
            
            params[param[0]] = decodeURIComponent(param[1].replace(/\+/g, " "));
        }
            
        return params;
    })(window.location.search.substr(1).split('&'))
})(jQuery);

භාවිතය

//Get a param
$.QueryString.param
//-or-
$.QueryString["param"]
//This outputs something like...
//"val"

//Get all params as object
$.QueryString
//This outputs something like...
//Object { param: "val", param2: "val" }

//Set a param (only in the $.QueryString object, doesn't affect the browser's querystring)
$.QueryString.param = "newvalue"
//This doesn't output anything, it just updates the $.QueryString object

//Convert object into string suitable for url a querystring (Requires jQuery)
$.param($.QueryString)
//This outputs something like...
//"param=newvalue&param2=val"

//Update the url/querystring in the browser's location bar with the $.QueryString object
history.replaceState({}, '', "?" + $.param($.QueryString));
//-or-
history.pushState({}, '', "?" + $.param($.QueryString));

කාර්ය සාධන පරීක්ෂණය ( රීජෙක්ස් ක්‍රමයට එරෙහිව බෙදීම් ක්‍රමය) ( jsPerf )

සකස් කිරීමේ කේතය: ක්‍රම ප්‍රකාශනය

පරීක්ෂණ කේතය බෙදන්න

var qs = window.GetQueryString(query);

var search = qs["q"];
var value = qs["value"];
var undef = qs["undefinedstring"];

Regex පරීක්ෂණ කේතය

var search = window.getParameterByName("q");
var value = window.getParameterByName("value");
var undef = window.getParameterByName("undefinedstring");

වින්ඩෝස් සර්වර් 2008 R2 / 7 x64 හි ෆයර්ෆොක්ස් 4.0 x86 හි පරීක්ෂා කිරීම

  • බෙදීම් ක්‍රමය : 144,780 ± 2.17% වේගවත්ම
  • Regex ක්‍රමය : 13,891 ± 0.85% | 90% මන්දගාමී වේ

1
සාමාන්‍ය ප්‍රකාශන භාවිතා කරනවා වෙනුවට නූල් බෙදීමද මෙය කදිම ප්‍රවේශයකි. පෙන්වා දීමට වටින කරුණු කිහිපයක් ඇත, නමුත් :-) 1. unescapeඅවලංගු කරන ලද ශ්‍රිතයක් වන අතර එය ප්‍රතිස්ථාපනය වේ decodeURIComponent(), මෙම ශ්‍රිත කිසිවක් +අභ්‍යවකාශ අක්ෂරයකට නිවැරදිව විකේතනය නොකරන බව සලකන්න . 2. ඔබ ප්‍රති result ලය අරාවකට වඩා වස්තුවක් ලෙස ප්‍රකාශ කළ යුතුය, මන්ද ජාවාස්ක්‍රිප්ටයට අනුබද්ධ අරා නොමැති නිසා සහ ඔබ ප්‍රකාශ කරන අරාව කෙසේ හෝ නම් කරන ලද දේපල එයට පැවරීමෙන් වස්තුවක් ලෙස සලකනු ලැබේ.
ඇන්ඩි ඊ

55
කුතුහලයෙන් ඔබ එය jQuery විශේෂිත කේතයක් නොමැති විට මෙය jQuery ප්ලගිනයක් බවට පත් කරන්නේ ඇයි?
zachleat

63
ach සැච්ලීට් ඔබට රාමුවක් නොමැති නම් ඔබේ කාර්යයන් ඔබේ කේතය පුරා පැතිරෙනු ඇත. ඔබ jQuery දිගු කළහොත් ඔබේ කාර්යයන් සඳහා ඔබට විෂය පථයක් ඇත, එය ඔබගේ කේතයේ කොතැනක හෝ පාවෙන්නේ නැත. මම හිතන්නේ එකම හේතුව එයයි.
බ un නෝ එල්

6
මෙන්න jQuery අනුවාදය වේ සමත් මනා අවධානය JSLint (2011-06-15 දින JSLint.com අවම වශයෙන් අවසන් පූර්ව ගමන් ඉලක්කය). ක්‍රොක්ෆර්ඩ් සතුටු කිරීම සඳහා බොහෝ දුරට දේවල් ගෙනයාම.
patridge

3
En බෙන්ජමින් ග ru න්බෝම් විහිළුවට ලක් කළ පරිදි, URL විග්‍රහ කිරීමේ කාර්ය සාධනය මිණුම් සලකුණු කිරීමේ කාරණය මට ද නොපෙනේ. මෙය සමස්ථානික ජාවාස්ක්‍රිප්ට් මොඩියුලයක් බවට පත් කර ඇත්නම් එය නෝඩ් සිට විග්‍රහ කළ හැකි ල logs ු-සටහන් ලෙස හැඳින්විය හැක. නමුත් URL පරාමිතීන් උපුටා ගැනීම සඳහා එය භාවිතා කිරීම window.locationඕනෑම කාර්ය සාධනයක් ඇති කරයි, සේවාදායකයා URL වෙත සැරිසැරීම බොහෝ දුරට වඩා මිල අධික බැවින්.
ඩෑන් ඩස්කල්ස්කු

660

ආටෙම් බාර්ගර්ගේ පිළිතුරේ වැඩි දියුණු කළ අනුවාදය :

function getParameterByName(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

වැඩිදියුණු කිරීම පිළිබඳ වැඩි විස්තර සඳහා බලන්න: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/


23
ඔබට එය තව ටිකක් කෙටි කිරීමට අවශ්‍ය නම්, ඔබට ත්‍රිමාණ කොන්දේසි ඉවත් කර එම අන්තිම පේළියේ කෙටි පරිපථයක් ආදේශ කළ හැකිය - return match && decodeURIComponent(match[1].replace(/\+/g, ' '));.
ඇන්ඩි ඊ

nullපරාමිතිය '=' අනුගමනය නොකරන්නේ නම් එය නැවත පැමිණේ . පරාමිතිය කිසිසේත් නොමැති නම් if (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;එය නැවත ලබා දීමට ඔබට සූදානම් විය හැකිය boolean false.
commonpike

9
newරීජෙක්ස් නිර්මාණය කිරීමේදී මම උපසර්ගය භාවිතා කරමි :var match = new RegExp('...
පැට්‍රික් බර්ක්ලි

2
IE11 දෝෂය: ආපසු ලබා දුන් අගය ascii අක්ෂර 8206 සමඟ සකස් කිරීමට IE තීරණය කරයි (හෙක්ස්: 200E - “වමේ සිට දකුණට”). මෙය සොයා ගැනීම සඳහා මම පැය 6 කට වඩා නාස්ති කළෙමි! චිකිත්සක වාතාශ්‍රය .... නිවැරදි කිරීමට, අවසාන පේළියේ අවසානයට සම්බන්ධ වන්න:.replace('\u200E', '')
ජයරෝ-ග්‍රේබියර්ඩ්

මැක්හි ක්‍රෝම් හි අවම වශයෙන් (සමහර විට වෙනත් බ්‍රව්සර් ද විය හැකිය) අවසාන අගය එකතු වූයේ '/' එකතු කිරීමෙනි. එබැවින් මම එය නොසලකා හැරීම සඳහා රීජෙක්ස් වෙනස් කළෙමි. var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
කේසි බී

594

URLSearchParams

ෆයර්ෆොක්ස් 44+, ඔපෙරා 36+, එජ් 17+, සෆාරි 10.3+ සහ ක්‍රෝම් 49+ URLSearchParams API සඳහා සහය දක්වයි :

IE හි ස්ථාවර අනුවාදයන් සඳහා ගූගල් විසින් යෝජනා කරන ලද URLSearchParams පොලිෆිල් ඇත.

එය W3C මගින් ප්‍රමිතිකරණය කර නැත , නමුත් එය WhatWG විසින් ජීවන තත්වයකි .

ඔබට එය භාවිතා කළ හැකිය location:

let params = new URLSearchParams(location.search);

හෝ

let params = (new URL(location)).searchParams;

හෝ ඇත්ත වශයෙන්ම ඕනෑම URL එකක:

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

.searchParamsURL වස්තුවෙහි කෙටිමං දේපලක් භාවිතා කරමින් ඔබට පරාමිතීන් ලබා ගත හැකිය ,

let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); // "1"
params.get('bar'); // "2" 

ඔබ කියවා / හරහා කට්ටලයක් පරාමිතීන් get(KEY), set(KEY, VALUE), append(KEY, VALUE)API. ඔබට සියලු අගයන් ඉක්මවා නැවත කියවිය හැකිය for (let p of params) {}.

යොමු කිරීම සහ ආදර්ශ පිටුව විගණන හා පරීක්ෂා කිරීම සඳහා ලබා ගත හැකි වේ.


ඔබ .getවෙනුවට භාවිතා කළ යුතු කාරණය (මම කළාක් මෙන්) එම .
පසුබෑමට ලක්වූවන්

20
ඇත්ත වශයෙන්ම ඔබ අවශ්ය නැත slice(1)මත .searchඔබ එය සෘජුවම භාවිතා කළ හැකිය. URLSearchParams හට ප්‍රමුඛයා හැසිරවිය හැකිය ?.
ජේසන් සී

URLSearchParamsඑය හොඳ නැත, මන්ද එය URL හි පරාමිතීන්ගේ සත්‍ය අගයන් ලබා නොදේ.
මෙලාබ්

මෙය new URL('https://example.com?foo=1&bar=2') ඇන්ඩ්‍රොයිඩ් යූආර්එල් සඳහා ක්‍රියා නොකරයිfile:///android_asset/...
ෂා

E මෙලාබ් එය තවමත් හොඳයි, මෙහි ඇති අනෙක් පිළිතුරු වල ඇති අමුතුම නැවත සකස් කිරීම සඳහා සරල API එකක් සපයයි. හැඳුනුම්පත පෙරනිමියෙන් window.location.search නොකරන බවත් දැනට ඇතුළත් කර ඇති url එක යාවත්කාලීන කිරීමට ක්‍රමයක් නොමැති බවත් එය මා වෙහෙසට පත් කරයි.
ඩේමන්

400

තවත් නිර්දේශයක් පමණි. පර්ල් ප්ලගිනය මඟින් නැංගුරම, ධාරක යනාදිය ඇතුළුව URL හි සියලුම කොටස් ලබා ගැනීමට ඉඩ ලබා දේ.

එය jQuery සමඟ හෝ නැතිව භාවිතා කළ හැකිය.

භාවිතය ඉතා සරල හා සිසිල් ය:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value'); // jQuery version
var url = purl('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

කෙසේ වෙතත්, 2014 නොවැම්බර් 11 වන විට, පර්ල් තවදුරටත් නඩත්තු නොකරන අතර කතුවරයා ඒ වෙනුවට URI.js භාවිතා කිරීම නිර්දේශ කරයි . JQuery ප්ලගිනය මූලද්‍රව්‍ය කෙරෙහි අවධානය යොමු කරන ආකාරයට වෙනස් වේ - නූල් භාවිතා URIකිරීම සඳහා, jQuery සමඟ හෝ නැතිව කෙලින්ම භාවිතා කරන්න . සමාන කේතයක් මෙහි පෙනේ, සම්පූර්ණ ලියකියවිලි මෙහි :

var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'


238

tl; dr

බහුකාර්ය යතුරු සහ කේතනය කළ අක්ෂර හසුරුවන ඉක්මන්, සම්පූර්ණ විසඳුමක් .

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {var s = item.split("="), k = s[0], v = s[1] && decodeURIComponent(s[1]); (qd[k] = qd[k] || []).push(v)})

//using ES6   (23 characters cooler)
var qd = {};
if (location.search) location.search.substr(1).split`&`.forEach(item => {let [k,v] = item.split`=`; v = v && decodeURIComponent(v); (qd[k] = qd[k] || []).push(v)})
බහු-පේළි:
var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {
    var s = item.split("="),
        k = s[0],
        v = s[1] && decodeURIComponent(s[1]); //  null-coalescing / short-circuit
    //(k in qd) ? qd[k].push(v) : qd[k] = [v]
    (qd[k] = qd[k] || []).push(v) // null-coalescing / short-circuit
})

මේ සියලු කේතය කුමක්ද ...
"ශුන්‍ය- සමතුලිතතාවය " , කෙටි පරිපථ ඇගයීම
ES6 විනාශකාරී පැවරුම් , ඊතල කාර්යයන් , අච්චු නූල්

උදාහරණයක්:
"?a=1&b=0&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> qd.a[1]    // "5"
> qd["a"][1] // "5"



වැඩිදුර කියවන්න ... වැනිලා ජාවාස්ක්‍රිප්ට් විසඳුම ගැන.

URL භාවිතයේ විවිධ කොටස් වෙත ප්‍රවේශ වීමට location.(search|hash)

පහසුම (ව්‍යාජ) විසඳුම

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • හිස් යතුරු නිවැරදිව හසුරුවයි .
  • යටපත් කිරීම් බහු-යතුරු සමග පසුගිය වටිනාකම.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

බහු-වටිනා යතුරු

සරල යතුරු පරීක්ෂාව (item in dict) ? dict.item.push(val) : dict.item = [val]

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {(item.split("=")[0] in qd) ? qd[item.split("=")[0]].push(item.split("=")[1]) : qd[item.split("=")[0]] = [item.split("=")[1]]})
  • දැන් ඒ වෙනුවට අරා ලබා දෙයි .
  • අගයන් වෙත ප්‍රවේශ වීම qd.key[index]හෝqd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

සංකේතාත්මක අක්ෂර?

decodeURIComponent()දෙවන හෝ දෙකෙහි බෙදීම් සඳහා භාවිතා කරන්න .

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {var k = item.split("=")[0], v = decodeURIComponent(item.split("=")[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v]})
උදාහරණයක්:
"?a=1&b=0&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: ["undefined"]  // decodeURIComponent(undefined) returns "undefined" !!!*
e: ["undefined", "http://w3schools.com/my test.asp?name=ståle&car=saab"]



අදහස් වලින්

* !!! කරුණාකර එය සටහන් කරන්නdecodeURIComponent(undefined) නැවත ලබා දෙයි "undefined". විසඳුම පවතින්නේ සරල භාවිතයක වන &&අතර එමඟින් decodeURIComponent()නිර්වචනය නොකළ අගයන් නොකියයි. (ඉහළින් ඇති “සම්පූර්ණ විසඳුම” බලන්න.)

v = v && decodeURIComponent(v);


විමසුම් හිස් ( location.search == "") නම්, ප්‍රති result ලය තරමක් නොමඟ යවන සුළුයqd == {"": undefined} . විග්‍රහ කිරීමේ ශ්‍රිතය likeo දියත් කිරීමට පෙර විමසුම පරීක්ෂා කිරීමට යෝජනා කෙරේ:

if (location.search) location.search.substr(1).split("&").forEach(...)

1
හොඳයි. මම වෙනස් කළ හැකි එකම දෙය - යතුරක් සඳහා අගයන් එකකට වඩා නොමැති නම් එය අරාවක් වීමට අවශ්‍ය නොවේ. යතුරකට එක් අගයකට වඩා තිබේ නම් පමණක් අරාව භාවිතා කරන්න.
පවෙල් නිකොලොව්

2
APavelNikolov මම හිතන්නේ එය සමහර විට අරාව සහ සමහර විට වටිනාකමක් ලබා ගැනීමේ දුෂ්කරතා හඳුන්වා දෙනු ඇත. ඔබ මුලින්ම ඒ සඳහා පරික්ෂා කළ යුතුය, දැන් ඔබ දිග පමණක් පරික්ෂා කරයි, මන්ද ඔබ කෙසේ හෝ එම අගයන් ලබා ගැනීම සඳහා චක්‍ර භාවිතා කරනු ඇත. එසේම මෙය මෙහි ඇති පහසුම, නමුත් ක්‍රියාකාරී විසඳුම ලෙස අදහස් කෙරිණි.
Qwerty

atskatsh ඔව්, එය ක්‍රියාත්මක වන්නේ> = IE9, කෙසේ වෙතත්, array.forEach()ඔබේ ස්ක්‍රිප්ටයේ ආරම්භයේ දී යම් කේතයක් එන්නත් කිරීමෙන් ඔබට ඔබේ ජාවාස්ක්‍රිප්ට් ප්‍රොසෙසරය ඉගැන්විය හැකිය . පොලිෆිල් සංවර්ධක
Qwerty

1
කියවීමේ හැකියාව සඳහා මඳක් සමතලා කර, ශ්‍රිතයක් බවට පත් කර, නැවත භාවිතා කරන ලද බෙදීම් ඇමතුම: ශ්‍රිතය parseQueryString () {var qd = {}; සෑම (ශ්‍රිතයක්ම (අයිතමයක්) 1]); (kd qd)? Qd [k] .පුෂ් (v): qd [k] = [v,]}); ආපසු qd; }
කේසි

1
decodeDocumentURI (නිර්වචනය නොකළ) නිර්වචනය නොකළ වෙනුවට "නිර්වචනය නොකළ" ප්‍රතිලාභ ලබා දෙයි. ක්රියාකාරී නමුත් ඉතා අලංකාර පරිමාවට var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] })
පුඩුවක්

218

විස්තර කර ඇති මෙය සාක්ෂාත් කර ගැනීම සඳහා snipplr.com හි රොෂම්බෝට සරල පිටපතක් ඇත ලබා ගත හැකි URL පරාමිතීන් සමඟ jQuery | වැඩි දියුණු කරන ලදි . ඔහුගේ පිටපත සමඟ ඔබට අවශ්‍ය පරාමිතීන් පහසුවෙන් ඉවත් කර ගත හැකිය.

සාරාංශය මෙන්න:

$.urlParam = function(name, url) {
    if (!url) {
     url = window.location.href;
    }
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url);
    if (!results) { 
        return undefined;
    }
    return results[1] || undefined;
}

විමසුම් දාමයෙන් ඔබේ පරාමිතීන් ලබා ගන්න.

එබැවින් URL / විමසුම් නූල නම් xyz.com/index.html?lang=de.

අමතන්න var langval = $.urlParam('lang'); , ඔබට එය තිබේ.

UZBEKJON හි මේ පිළිබඳව ද හොඳ බ්ලොග් සටහනක් ඇත, jQuery සමඟ URL පරාමිතීන් සහ අගයන් ලබා ගන්න .


13
jQuery සමඟ jQuery වස්තුවට ශ්‍රිතය නම් කිරීම අදහස් කරයි. එසේම, අවලංගු වටිනාකම වන්නේ 0ඇයි? ෂුවර්, මට දැඩි සමානාත්මතා පරීක්‍ෂණයක් භාවිතා කළ හැකිය, නමුත් එසේ නොවිය nullයුතුද?
ඇලෙක්ස්

එකඟ විය. එය සාමාන්‍ය ජාවාස්ක්‍රිප්ට් විචල්‍ය යොමුවකට සමානව ක්‍රියා කරයි (සමහර විට නිර්වචනය නොකොට නැවත පැමිණීම වඩා නිවැරදි වනු ඇත).
සමස්ථානික

'නම' නිසියාකාරව ගැලවී නැත, එය කෙලින්ම RegExp තුළට එන්නත් කරනු ලැබේ. මෙය අසමත් වේ. අනෙක් අය පවසා ඇති පරිදි, මෙම පිළිතුරු රෝදය ප්‍රතිනිර්මාණය කිරීම සහ බොහෝ ඡන්ද ලබා ගැනීම විශ්වාස කළ නොහැකි ය, මෙය හොඳින් පරීක්ෂා කළ පුස්තකාලයක ක්‍රියාත්මක කළ යුතු විට.
ට්‍රයින්කෝ

167

ඔබ jQuery භාවිතා කරන්නේ නම්, ඔබට jQuery BBQ: Back බොත්තම සහ විමසුම් පුස්තකාලය වැනි පුස්තකාලයක් භාවිතා කළ හැකිය .

... jQuery BBQ .deparam()හෑෂ් රාජ්‍ය කළමනාකරණය මෙන්ම කොටස් / විමසුම් නූල් විග්‍රහ කිරීම සහ උපයෝගීතා ක්‍රම ඒකාබද්ධ කිරීම සමඟ සම්පූර්ණ ක්‍රමයක් සපයයි .

සංස්කරණය කරන්න: ඩෙපරම් එකතු කිරීම උදාහරණය:

 var DeparamExample = function() {
            var params = $.deparam.querystring();

            //nameofparam is the name of a param from url
            //code below will get param if ajax refresh with hash
            if (typeof params.nameofparam == 'undefined') {
                params = jQuery.deparam.fragment(window.location.href);
            }
            
            if (typeof params.nameofparam != 'undefined') {
                var paramValue = params.nameofparam.toString();
                  
            }
        };

ඔබට සරල ජාවාස්ක්‍රිප්ට් භාවිතා කිරීමට අවශ්‍ය නම්, ඔබට භාවිතා කළ හැකිය ...

var getParamValue = (function() {
    var params;
    var resetParams = function() {
            var query = window.location.search;
            var regex = /[?&;](.+?)=([^&;]+)/g;
            var match;

            params = {};

            if (query) {
                while (match = regex.exec(query)) {
                    params[match[1]] = decodeURIComponent(match[2]);
                }
            }    
        };

    window.addEventListener
    && window.addEventListener('popstate', resetParams);

    resetParams();

    return function(param) {
        return params.hasOwnProperty(param) ? params[param] : null;
    }

})();​

නව HTML ඉතිහාස API සහ විශේෂයෙන් history.pushState()සහhistory.replaceState() , URL වෙනස් කළ හැකි අතර එමඟින් පරාමිති හැඹිලිය සහ ඒවායේ අගයන් අවලංගු වේ.

ඉතිහාසය වෙනස් වන සෑම අවස්ථාවකම මෙම අනුවාදය එහි අභ්‍යන්තර පරාමිතීන් යාවත්කාලීන කරයි.


100

බෙදීම් දෙකක් භාවිතා කරන්න :

function get(n) {
    var half = location.search.split(n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

මම පෙර සහ වඩා සම්පූර්ණ පිළිතුරු කියවමින් සිටියෙමි. නමුත් මම හිතන්නේ එය සරලම හා වේගවත් ක්‍රමයයි. ඔබට මෙම jsPerf මිණුම් ලකුණෙන් පරීක්ෂා කළ හැකිය

රූප්ගේ ප්‍රකාශයේ ඇති ගැටළුව විසඳීම සඳහා, පළමු පේළිය පහත දෙකට වෙනස් කිරීමෙන් කොන්දේසි සහිත බෙදීමක් එක් කරන්න. නමුත් නිරපේක්ෂ නිරවද්‍යතාව යන්නෙන් අදහස් වන්නේ එය දැන් regexp ට වඩා මන්දගාමී බවයි ( jsPerf බලන්න ).

function get(n) {
    var half = location.search.split('&' + n + '=')[1];
    if (!half) half = location.search.split('?' + n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

එබැවින් ඔබ රූප්ගේ ප්‍රති-නඩුවට නොයන බව ඔබ දන්නේ නම්, මෙය ජය ගනී. එසේ නොමැති නම්, regexp.

නැතහොත් ඔබට විමසුම් පාලනයේ පාලනය තිබේ නම් සහ ඔබ ලබා ගැනීමට උත්සාහ කරන අගයක කිසි විටෙක URL සංකේතාත්මක අක්ෂර අඩංගු නොවන බවට සහතික විය හැකි නම් (මේවා වටිනාකමින් තිබීම නරක අදහසක් වනු ඇත) - ඔබට පහත තරමක් සරල හා කියවිය හැකි අනුවාදය භාවිතා කළ හැකිය 1 වන විකල්පයේ:

    function getQueryStringValueByName(name) {
        var queryStringFromStartOfValue = location.search.split(name + '=')[1];
         return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;

7
ඉතා පිළිවෙලට! එය ඔබ, ඔබ සොයන තැනැත්තා, උදා: අවසන් බව ප්රධාන නම සමඟ මීට පෙර අගය තිබේ නම් නමුත් වැඩ නෑ get('value')මත http://the-url?oldvalue=1&value=2.
රූප්

3
කෙසේ වෙතත්, පරාමිති නාමය අපේක්ෂා කරන බව ඔබ දන්නේ නම්, මෙය වේගවත් ප්‍රවේශය වනු ඇත.
මාටින් බෝර්තිරි

සංස්කරණය කරන ලදි: ඔබ එය සත්‍ය බව පරීක්‍ෂා halfකළහොත්, මෙය වැනි හිස් පරාමිතියක් සඳහා ශුන්‍ය වේ ?param=. එය මෙම නඩුවේ හිස් නූල නැවත ලබා දිය යුතු අතර, පරීක්ෂා කිරීමෙන් එය half !== undefinedවිසඳනු ඇත.
philh

සිසිල්! මම එක ලයිනර් එකක් function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
හැදුවා

එය ක්‍රියාත්මක කිරීම සඳහා මට දෙවන පේළිය වෙනස් return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;කිරීමට සිදු විය
divillysausages

95

මෙන්න ඇන්ඩි ඊ ගේ විශිෂ්ට විසඳුම අංග සම්පූර්ණ jQuery ප්ලගිනයක් බවට පත්කිරීමේ මගේ පිහිය:

;(function ($) {
    $.extend({      
        getQueryString: function (name) {           
            function parseParams() {
                var params = {},
                    e,
                    a = /\+/g,  // Regex for replacing addition symbol with a space
                    r = /([^&=]+)=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    params[d(e[1])] = d(e[2]);

                return params;
            }

            if (!this.queryStringParams)
                this.queryStringParams = parseParams(); 

            return this.queryStringParams[name];
        }
    });
})(jQuery);

වාක්‍ය ඛණ්ඩය:

var someVar = $.getQueryString('myParam');

ලෝක දෙකෙහිම හොඳම!


76

ඔබ හුදෙක් විමසුම් විග්‍රහ කිරීමට වඩා URL හැසිරවීමක් කරන්නේ නම්, ඔබට URI.js ප්‍රයෝජනවත් විය හැකිය . එය URL හැසිරවීම සඳහා පුස්තකාලයක් වන අතර එය සියලු සීනු හා විස්ල් සමඟ පැමිණේ. (මෙහි ස්වයං ප්‍රචාරණය සඳහා කණගාටුයි)

ඔබේ විමසුම් සිතියම බවට පරිවර්තනය කිරීමට:

var data = URI('?foo=bar&bar=baz&foo=world').query(true);
data == {
  "foo": ["bar", "world"],
  "bar": "baz"
}

(URI.js කැමති නරක විමසුම් ද නිවැරදි ?&foo&&bar=baz&කරයි ?foo&bar=baz)


// අවශ්‍ය src / URI.fragmentURI.js පැටවීම
JoeB

1
+1 URI.js යනු විශිෂ්ට කුඩා ප්ලගිනයකි. ඔබට var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');එකම ප්‍රති result සඳහාද කළ හැකිය ( ලියකියවිලි ).
යරින්

62

මම කැමතියි රයන් ෆෙලන්ගේ විසඳුමට . නමුත් ඒ සඳහා jQuery දීර් ing කිරීමේ කිසිදු කරුණක් මා දකින්නේ නැද්ද? JQuery ක්‍රියාකාරීත්වයේ භාවිතයක් නොමැත.

අනෙක් අතට, මම Google Chrome: window.location.getParameter හි සාදන ලද ශ්‍රිතයට කැමතියි.

ඉතින් මෙය භාවිතා නොකරන්නේ ඇයි? හරි, වෙනත් බ්‍රව්සර් නොමැත. එබැවින් මෙම ශ්‍රිතය නොපවතී නම් එය නිර්මාණය කරමු:

if (!window.location.getParameter ) {
  window.location.getParameter = function(key) {
    function parseParams() {
        var params = {},
            e,
            a = /\+/g,  // Regex for replacing addition symbol with a space
            r = /([^&=]+)=?([^&]*)/g,
            d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
            q = window.location.search.substring(1);

        while (e = r.exec(q))
            params[d(e[1])] = d(e[2]);

        return params;
    }

    if (!this.queryStringParams)
        this.queryStringParams = parseParams(); 

    return this.queryStringParams[key];
  };
}

මෙම ශ්‍රිතය රයන් ෆෙලන්ගෙන් වැඩි හෝ අඩු වේ, නමුත් එය වෙනස් ආකාරයකින් ඔතා ඇත: පැහැදිලි නම සහ වෙනත් ජාවාස්ක්‍රිප්ට් පුස්තකාලවල යැපීම් නොමැත. මගේ බ්ලොග් අඩවියේ මෙම කාර්යය පිළිබඳ වැඩි විස්තර .


3
Windows.location.getParameter () Chrome වෙතින් ඉවත් කර ඇති බව පෙනේ.
mhenry1384

54

PHP G _GET අරාවට සමාන වස්තුවක් ලබා ගැනීමට වේගවත් ක්‍රමයක් මෙන්න :

function get_query(){
    var url = location.search;
    var qs = url.substring(url.indexOf('?') + 1).split('&');
    for(var i = 0, result = {}; i < qs.length; i++){
        qs[i] = qs[i].split('=');
        result[qs[i][0]] = decodeURIComponent(qs[i][1]);
    }
    return result;
}

භාවිතය:

var $_GET = get_query();

විමසුම් නූල සඳහා x=5&y&z=hello&x=6මෙය වස්තුව නැවත ලබා දෙයි:

{
  x: "6",
  y: undefined,
  z: "hello"
}

ඔබට එය jQuery ප්ලගිනයක් ලෙස අවශ්‍ය නම්, මෙන්න එයයි: (function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery);සහ මේ ආකාරයට භාවිතා කරන්න:$.get_query()
tim

ස්තූතියි. මමත් මේක පාවිච්චි කළා. ඔබගේ ආපසු ප්‍රකාශයට පෙර මම මෙය එකතු කළෙමි: (පරාමි) ප්‍රතිලාභ ප්‍රති result ලය [පරාමිතිය] නම්, අවශ්‍ය නම් මට get_query ('foo') ද කළ හැකිය
වර්ග

1
ඔබට හැෂ් තිබේ නම් ක්‍රියා නොකරයි. උදාහරණයක් ලෙස: test.aspx? Test = t1 # පෙරනිමි . {පරීක්ෂණය: "t1 # පෙරනිමි" return නැවත ලබා දෙනු ඇතැයි මම බලාපොරොත්තු වෙමි {පරීක්ෂණය: "t1"}
බොග්ඩන් එම්.

Og බොග්ඩන් එම්: ඇත්ත වශයෙන්ම. location.hrefආදේශ කිරීමට සිදුවනු ඇත location.search.
ඩෑන් ඩස්කල්ස්කු

53

සරල ජාවාස්ක්‍රිප්ට් කේතයෙන් එය සරලව තබා ගන්න:

function qs(key) {
    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[key];
}

ජාවාස්ක්‍රිප්ට් කේතයේ ඕනෑම තැනක සිට එය අමතන්න:

var result = qs('someKey');

1
මම හිතන්නේ ඔබ මා හා සමාන දෙයක් කරනවා, නමුත් මම හිතන්නේ මගේ ප්‍රවේශය වඩාත් සරල stackoverflow.com/a/21152762/985454
Qwerty

මම ඔබට හඳුන්වා දෙන්නම් (කරුණාකර ඩ්‍රම්රෝල්) window.location.search!
එරික්

46

මේ සියල්ලම විශිෂ්ට පිළිතුරු, නමුත් මට මීට වඩා ශක්තිමත් යමක් අවශ්‍ය වූ අතර, මා විසින් නිර්මාණය කරන ලද දේ ලබා ගැනීමට ඔබ සැවොම කැමති යැයි සිතුවා.

එය සරල පුස්තකාල ක්‍රමයක් වන අතර එය URL පරාමිතීන් වි ection ටනය කිරීම සහ හැසිරවීම සිදු කරයි. ස්ථිතික ක්‍රමයට පහත දැක්වෙන උප ක්‍රම ඇත, ඒවා විෂය URL වෙත කැඳවිය හැකිය:

  • getHost
  • getPath
  • getHash
  • setHash
  • getParams
  • getQuery
  • setParam
  • getParam
  • hasParam
  • removeParam

උදාහරණයක්:

URLParser(url).getParam('myparam1')

var url = "http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";

function URLParser(u){
    var path="",query="",hash="",params;
    if(u.indexOf("#") > 0){
        hash = u.substr(u.indexOf("#") + 1);
        u = u.substr(0 , u.indexOf("#"));
    }
    if(u.indexOf("?") > 0){
        path = u.substr(0 , u.indexOf("?"));
        query = u.substr(u.indexOf("?") + 1);
        params= query.split('&');
    }else
        path = u;
    return {
        getHost: function(){
            var hostexp = /\/\/([\w.-]*)/;
            var match = hostexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getPath: function(){
            var pathexp = /\/\/[\w.-]*(?:\/([^?]*))/;
            var match = pathexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getHash: function(){
            return hash;
        },
        getParams: function(){
            return params
        },
        getQuery: function(){
            return query;
        },
        setHash: function(value){
            if(query.length > 0)
                query = "?" + query;
            if(value.length > 0)
                query = query + "#" + value;
            return path + query;
        },
        setParam: function(name, value){
            if(!params){
                params= new Array();
            }
            params.push(name + '=' + value);
            for (var i = 0; i < params.length; i++) {
                if(query.length > 0)
                    query += "&";
                query += params[i];
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
        getParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return decodeURIComponent(pair[1]);
                }
            }
            console.log('Query variable %s not found', name);
        },
        hasParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return true;
                }
            }
            console.log('Query variable %s not found', name);
        },
        removeParam: function(name){
            query = "";
            if(params){
                var newparams = new Array();
                for (var i = 0;i < params.length;i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) != name)
                          newparams .push(params[i]);
                }
                params = newparams;
                for (var i = 0; i < params.length; i++) {
                    if(query.length > 0)
                        query += "&";
                    query += params[i];
                }
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
    }
}


document.write("Host: " + URLParser(url).getHost() + '<br>');
document.write("Path: " + URLParser(url).getPath() + '<br>');
document.write("Query: " + URLParser(url).getQuery() + '<br>');
document.write("Hash: " + URLParser(url).getHash() + '<br>');
document.write("Params Array: " + URLParser(url).getParams() + '<br>');
document.write("Param: " + URLParser(url).getParam('myparam1') + '<br>');
document.write("Has Param: " + URLParser(url).hasParam('myparam1') + '<br>');

document.write(url + '<br>');

// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url + ' - Remove the first parameter<br>');

// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url + ' - Add a third parameter<br>');

// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url + ' - Remove the second parameter<br>');

// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url + ' - Set Hash<br>');

// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove the last parameter<br>');

// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove a parameter that doesn\"t exist<br>');

44

MDN වෙතින් :

function loadPageVar (sVar) {
  return unescape(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + escape(sVar).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
}

alert(loadPageVar("name"));

39

කේත ගොල්ෆ්:

var a = location.search&&location.search.substr(1).replace(/\+/gi," ").split("&");
for (var i in a) {
    var s = a[i].split("=");
    a[i]  = a[unescape(s[0])] = unescape(s[1]);
}

එය ප්‍රදර්ශනය කරන්න!

for (i in a) {
    document.write(i + ":" + a[i] + "<br/>");   
};

මගේ මැක් මත: test.htm?i=can&has=cheezburgerදර්ශන

0:can
1:cheezburger
i:can
has:cheezburger

9
මම ඔබේ පිළිතුරට කැමතියි, විශේෂයෙන් තිර රචනය කෙතරම් සංයුක්තද, නමුත් ඔබ බොහෝ විට විකේතනය භාවිතා කළ යුතුය. Xkr.us/articles/javascript/encode-compare සහ බලන්න stackoverflow.com/questions/619323/…
pluckyglen

39

මම සාමාන්‍ය ප්‍රකාශන ගොඩක් භාවිතා කරනවා, නමුත් ඒ සඳහා නොවේ.

මගේ යෙදුමට වරක් විමසුම් දාමය කියවීම මට පහසු සහ කාර්යක්ෂම බව පෙනේ, සහ සියලු යතුරු / අගය යුගල වලින් වස්තුවක් තැනීම:

var search = function() {
  var s = window.location.search.substr(1),
    p = s.split(/\&/), l = p.length, kv, r = {};
  if (l === 0) {return false;}
  while (l--) {
    kv = p[l].split(/\=/);
    r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
  }
  return r;
}();

වැනි URL සඳහා http://domain.com?param1=val1&param2=val2ඔබට පසුව ඔබගේ කේතය මෙන් ඔවුන්ගේ අගය ලබා ගත හැක search.param1හා search.param2.


38
function GET() {
        var data = [];
        for(x = 0; x < arguments.length; ++x)
            data.push(location.href.match(new RegExp("/\?".concat(arguments[x],"=","([^\n&]*)")))[1])
                return data;
    }


example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
    data[0] // 3
    data[1] // jet
    data[2] // b
or
    alert(GET("id")[0]) // return 3

5
මෙය සිත්ගන්නාසුලු ප්‍රවේශයකි, නිශ්චිත පරාමිතීන්ගෙන් අගයන් අඩංගු අරාවක් නැවත ලබා දේ. එයට අවම වශයෙන් එක් ගැටළුවක්වත් ඇත - අගයන් නිවැරදිව විකේතනය නොකරන URL ය, එයට ගැලපෙන විට භාවිතා වන පරාමිති නාමයන් URL කේතනය කිරීම අවශ්‍ය වේ. එය වර්තමාන ස්වරූපයෙන් වුවද සරල විමසුම් නූල් මත ක්‍රියා කරනු ඇත. ps දී විචල්යයන් ප්රකාශ විට var ඉඟි පද භාවිතා කරන්න අමතක කරන්න එපා සඳහා ප්රකාශ.
ඇන්ඩි ඊ

38

රොෂම්බෝ jQuery ක්‍රමය විකේතන URL ගැන සැලකිලිමත් වූයේ නැත

http://snipplr.com/view/26662/get-url-parameters-with-jquery--improved/

ආපසු ප්‍රකාශයේ එකතු කරන අතරම එම හැකියාවද එක් කර ඇත

return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;

දැන් ඔබට යාවත්කාලීන කළ සාරාංශය සොයාගත හැකිය:

$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (!results) { return 0; }
return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;
}

36

මම කැමතියි මේ එක (jquery-howto.blogspot.co.uk ගෙන):

// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
function getUrlVars() {
    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;
}

මට හොඳට වැඩ කරනවා.


36

මෙන්න මෙම විශිෂ්ට පිළිතුර සඳහා මගේ සංස්කරණය - අගයන් නොමැතිව යතුරු සමඟ විමසුම් නූල් විග්‍රහ කිරීමට අමතර හැකියාවක් ඇත.

var url = 'http://sb.com/reg/step1?param';
var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i) {
        var p=a[i].split('=', 2);
        if (p[1]) p[1] = decodeURIComponent(p[1].replace(/\+/g, " "));
        b[p[0]] = p[1];
    }
    return b;
})((url.split('?'))[1].split('&'));

වැදගත්!අවසාන පේළියේ එම ශ්‍රිතය සඳහා පරාමිතිය වෙනස් වේ. අත්තනෝමතික URL එකක් එයට යැවිය හැකි ආකාරය පිළිබඳ උදාහරණයක් පමණි. වත්මන් URL විග්‍රහ කිරීමට ඔබට බ un නෝගේ පිළිතුරෙන් අවසාන පේළිය භාවිතා කළ හැකිය.

ඉතින් හරියටම වෙනස් වී ඇත්තේ කුමක්ද? Url ප්‍රති http://sb.com/reg/step1?param=results ල සමඟ සමාන වේ. නමුත් url සමඟ බ un http://sb.com/reg/step1?paramනෝගේ විසඳුම යතුරු නොමැතිව වස්තුවක් ආපසු ලබා දෙන අතර මගේ යතුර යතුර paramසහ undefinedවටිනාකම සහිත වස්තුවක් ආපසු ලබා දෙයි.


34

විමසුම් නූලෙන් මට වස්තුවක් අවශ්‍ය වූ අතර මම බොහෝ කේත වලට වෛර කරමි. එය විශ්වයේ වඩාත්ම ශක්තිමත් නොවිය හැකි නමුත් එය කේත පේළි කිහිපයක් පමණි.

var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
    q[i.split('=')[0]]=i.split('=')[1];
});

වැනි URL එකක් this.htm?hello=world&foo=barනිර්මාණය වනු ඇත:

{hello:'world', foo:'bar'}

4
පිළිවෙලට. මොසිල්ලාට අනුව, කෙසේ වෙතත්, සෑම එකක්ම IE7 හෝ 8 මත ක්‍රියා නොකරන අතර , කිසිදු විමසුම් දාමයක් නොමැති නම් එය වැටෙනු ඇතැයි මම සැක කරමි. තවත් අවස්ථා ආවරණය වන එක් අවම වැඩිදියුණු කිරීමක් වනුයේ decodeURIComponentඔබ එය ගබඩා කරන විට වටිනාකමටය - සහ තර්කානුකූලව යතුර ද වේ, නමුත් ඔබ ඒ තුළ අමුතු නූල් භාවිතා කිරීමට ඇති ඉඩකඩ අඩුය.
රූප්

1
ලස්සන හා සරලයි. අරාව පරාමිතීන් හසුරුවන්නේ නැත, ?a&b&cනමුත් මෙය සැබවින්ම කියවිය හැකි ය (අහම්බෙන් මගේ පළමු අදහසට සමාන ය). එසේම splitඑය අතිරික්තය, නමුත් මට අක්ෂර 10 කින් යුත් නූලක් දෙවරක් බෙදීමට වඩා ෆ්‍රයි කිරීමට විශාල කාර්ය සාධන මාළු ඇත.
cod3monk3y

1
විමසුම් "? hello = world & one = a = b & two = 2" වන විට ඔබ 'එක' හි අගය අල්ලා ගන්නා විට ඔබට ලැබෙන්නේ පළමු '=' අගයට පෙර කොටස පමණි. එහි අගය ෂඩ් 'a = b' විය හැකි නමුත් ඔබට ලැබෙන්නේ 'a' පමණක් 'a = a = b' මත '=' බෙදූ නිසාය. මෙය හුදෙක් දෝෂ සහිතය. : ((
ෂෝන් කොවාක්

2
මම භාවිතා කරන location.search.substr(1)වෙනුවට location.href.split('?')[1]එහි පූරක අහුලා (වළක්වා ගැනීමට #anchorපසුගිය විමසුම පරාමිතිය සමඟ).
mlt

ඔව්, මම ඔබට හඳුන්වා දෙන්නම් location.search!
එරික්

32

මෙන්න ඇන්ඩි ඊ ගේ සම්බන්ධිත "අරා-ශෛලියේ විමසුම් නූල් හසුරුවන්න" -වර්ෂන් හි දීර් version සංස්කරණයකි. ස්ථාවර දෝෂය ( ?key=1&key[]=2&key[]=3; 1සමග අහිමි වූ අතර ප්රතිස්ථාපනය කරනු [2,3]), ( "[" තත්වය, ආදිය recalculating, සාරධර්ම නැවත ප්රහේලිකාව ලිහා) සුළු කාර්ය සාධනය කිහිපයක් වැඩි දියුණු කළහ සහ (functionalized, සහයෝගය වැඩි දියුණු කිරීම රාශියක් එකතු ?key=1&key=2, සහයෝගය ;ක්රමයන්හි) . මම විචල්‍යයන් කරදරකාරී ලෙස කෙටියෙන් තැබුවෙමි, නමුත් ඒවා කියවිය හැකි වන පරිදි අදහස් විශාල ප්‍රමාණයක් එක් කළෙමි (ඔහ්, මම නැවත භාවිතා කළෙමිv දේශීය කාර්යයන් තුළ , එය අවුල් සහගත නම් කණගාටුයි;).

එය පහත සඳහන් විමසුම් හසුරුවනු ඇත ...

? test = ආයුබෝවන් & පුද්ගලයා = නෙක් සහ පුද්ගලයා [] = ජෙෆ් සහ පුද්ගලයා [] = ජිම් සහ පුද්ගලයා [අමතර] = ජෝන් සහ ටෙස්ට් 3 සහ නොකාච් = 1398914891264

... එය පෙනෙන වස්තුවක් බවට පත් කිරීම ...

{
    "test": "Hello",
    "person": {
        "0": "neek",
        "1": "jeff",
        "2": "jim",
        "length": 3,
        "extra": "john"
    },
    "test3": "",
    "nocache": "1398914891264"
}

ඔබට ඉහත දැකිය හැකි පරිදි, මෙම අනුවාදය යම් ආකාරයක "විකෘති" අරා හසුරුවයි, එනම් - person=neek&person[]=jeff&person[]=jimහෝ person=neek&person=jeff&person=jimයතුර හඳුනාගත හැකි සහ වලංගු බැවින් (අවම වශයෙන් dotNet හි NameValueCollection.Add ):

ඉලක්කගත NameValueCollection නිදසුනෙහි නිශ්චිත යතුර දැනටමත් තිබේ නම්, නිශ්චිත අගය "අගය 1, අගය 2, අගය 3" ආකාරයෙන් දැනට පවතින කොමා මඟින් වෙන් කරන ලද අගයන් ලැයිස්තුවට එකතු කරනු ලැබේ.

පිරිවිතරයක් නොමැති බැවින් ජූරි සභාව නැවත නැවත යතුරු මත තරමක් දුරස් වී ඇති බව පෙනේ . මෙම අවස්ථාවේදී, බහු යතුරු (ව්‍යාජ) අරාවක් ලෙස ගබඩා කර ඇත. නමුත් මා එසේ නොකරන බව සලකන්න කොමාව මත පදනම් වූ අගයන් අරා වලට සකසන්නේ .

කේතය:

getQueryStringKey = function(key) {
    return getQueryStringAsObject()[key];
};


getQueryStringAsObject = function() {
    var b, cv, e, k, ma, sk, v, r = {},
        d = function (v) { return decodeURIComponent(v).replace(/\+/g, " "); }, //# d(ecode) the v(alue)
        q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
        s = /([^&;=]+)=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter:   /([^&=]+)=?([^&]*)/g
    ;

    //# ma(make array) out of the v(alue)
    ma = function(v) {
        //# If the passed v(alue) hasn't been setup as an object
        if (typeof v != "object") {
            //# Grab the cv(current value) then setup the v(alue) as an object
            cv = v;
            v = {};
            v.length = 0;

            //# If there was a cv(current value), .push it into the new v(alue)'s array
            //#     NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
            if (cv) { Array.prototype.push.call(v, cv); }
        }
        return v;
    };

    //# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
    while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
        //# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry) 
        b = e[1].indexOf("[");
        v = d(e[2]);

        //# As long as this is NOT a hash[]-style key-value e(ntry)
        if (b < 0) { //# b == "-1"
            //# d(ecode) the simple k(ey)
            k = d(e[1]);

            //# If the k(ey) already exists
            if (r[k]) {
                //# ma(make array) out of the k(ey) then .push the v(alue) into the k(ey)'s array in the r(eturn value)
                r[k] = ma(r[k]);
                Array.prototype.push.call(r[k], v);
            }
            //# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
            else {
                r[k] = v;
            }
        }
        //# Else we've got ourselves a hash[]-style key-value e(ntry) 
        else {
            //# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
            k = d(e[1].slice(0, b));
            sk = d(e[1].slice(b + 1, e[1].indexOf("]", b)));

            //# ma(make array) out of the k(ey) 
            r[k] = ma(r[k]);

            //# If we have a sk(sub-key), plug the v(alue) into it
            if (sk) { r[k][sk] = v; }
            //# Else .push the v(alue) into the k(ey)'s array
            else { Array.prototype.push.call(r[k], v); }
        }
    }

    //# Return the r(eturn value)
    return r;
};

විමසුම් නූල් අගයන් ලබා ගැනීම සඳහා ඔබට මෙම "GetParameterValues" ශ්‍රිතය භාවිතා කළ හැකිය. මෙහිදී ඔබට විමසුම් කලවම් පරාමිති නාමය ලබා දිය යුතු අතර එය ඔබට value (ලේඛනය) අගය ලබා දෙනු ඇත. සූදානම් (ශ්‍රිතය () {var bid = GetParameterValues ​​('ටෝකන්');}); GetParameterValues ​​(param) function var url = decodeURIComponent (window.location.href); url = url.slice (url.indexOf ('?') + 1) .split ('&'); සඳහා (var i = 0; i <url.length; i ++) {var urlparam = url [i] .split ('='); if (urlparam [0] == param) {ආපසු urlparam [1]; }}
මයික් ක්ලාක්

1
මම දැන් මෙය කාලයක් තිස්සේ භාවිතා කර ඇති අතර, එය මෙතෙක් විශාල වී ඇත. Urlencoded අරා හැසිරවීම හැර. භාවිතා කිරීම q = decodeURIComponent(window.location.search.substring(1)),එය ද එය කිරීමට උපකාරී වේ.
ව්ලැඩිස්ලාව් ඩිමිට්‍රොව්

31

මෙය මා කලකට පෙර නිර්මාණය කළ කාර්යයක් වන අතර මම ඒ ගැන සෑහීමකට පත්වෙමි. එය සිද්ධි සංවේදී නොවේ - එය පහසුය. එසේම, ඉල්ලූ QS නොපවතී නම්, එය හිස් නූලක් ලබා දෙයි.

මම මෙහි සම්පීඩිත අනුවාදයක් භාවිතා කරමි. සිදුවන්නේ කුමක්ද යන්න වඩා හොඳින් පැහැදිලි කිරීම සඳහා නවකතා වර්ග සඳහා මම සම්පීඩනය නොකර පළ කරමි.

වේගයෙන් වැඩ කිරීම සඳහා මෙය ප්‍රශස්තිකරණය කළ හැකි හෝ වෙනස් ආකාරයකින් කළ හැකි බව මට විශ්වාසයි, නමුත් එය සෑම විටම මට අවශ්‍ය දේ සඳහා විශිෂ්ට ලෙස ක්‍රියා කරයි.

විනෝද වන්න.

function getQSP(sName, sURL) {
    var theItmToRtn = "";
    var theSrchStrg = location.search;
    if (sURL) theSrchStrg = sURL;
    var sOrig = theSrchStrg;
    theSrchStrg = theSrchStrg.toUpperCase();
    sName = sName.toUpperCase();
    theSrchStrg = theSrchStrg.replace("?", "&") theSrchStrg = theSrchStrg + "&";
    var theSrchToken = "&" + sName + "=";
    if (theSrchStrg.indexOf(theSrchToken) != -1) {
        var theSrchTokenLth = theSrchToken.length;
        var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken) + theSrchTokenLth;
        var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
        theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
    }
    return unescape(theItmToRtn);
}

එසේම, unescape () වෙනුවට decodeURI () හෝ decodeURIComponent () සඳහා යාම වඩා හොඳය. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ආදර්ශ Konchady

27

මෙම ගැටළුව එකවරම විසඳීම අරමුණු කරගත් ව්‍යාපෘතියක් වන arg.js අපි දැන් නිකුත් කර ඇත්තෙමු . එය සාම්ප්‍රදායිකව එතරම් අපහසු වූ නමුත් දැන් ඔබට එය කළ හැකිය:

var name = Arg.get("name");

හෝ මුළු මුදලම ලබා ගැනීම:

var params = Arg.all();

ඔබ අතර ඇති වෙනස ගැන සැලකිලිමත් නම් ?query=trueහා #hash=trueඔබ එය භාවිතා කළ හැක Arg.query()සහ Arg.hash()ක්රම.


ඔබ මාව බේරා ගත්තා .. arg.js යනු විසඳුම කිසිවක් IE 8 හි # වෙතින් අගයන් ලබා ගන්නේ නැත .. :( IE8 # සොයන ඕනෑම අයෙක් ඉල්ලීමෙන් ලබා ගන්න මෙය විසඳුමයි ..
දිලිප් රාජ්කුමාර්

27

එම ප්‍රශ්නයේ ඉහළම පිළිතුරේ ඇති ගැටළුව නම්, එය # ට පසුව තබා ඇති සහය නොදක්වන පරාමිතීන් වීමයි, නමුත් සමහර විට මෙම අගය ලබා ගැනීමටද අවශ්‍ය වේ.

හැෂ් ලකුණක් සහිත සම්පූර්ණ විමසුම් නූලක් විග්‍රහ කිරීමට ඉඩ දීම සඳහා මම පිළිතුර වෙනස් කළෙමි:

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

1
ඔබට එය අවශ්‍ය නම් එය සිත්ගන්නා සුළු නමුත් AFAIK නම් හැෂ් කොටසෙහි ආකෘතිය සඳහා ප්‍රමිතියක් නොමැති බැවින් අනෙක් පිළිතුරේ දුර්වලතාවයක් ලෙස එය හැඳින්වීම සාධාරණ නොවේ.
රූප්

2
ඔව් මම දන්නවා. නමුත් මගේ යෙදුමේ මම හැෂ් ලකුණෙන් පසු පරාමිතීන් ඇති තෙවන පාර්ශවීය js සංචලනය ඒකාබද්ධ කරමි.
Ph0en1x

උදාහරණයක් ලෙස, ගූගල් සෙවුම් පිටුවේ, සෙවුම් විමසුම '#' හෑෂ් ලකුණ අනුගමනය කරයි.
etlds

25
function GetQueryStringParams(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');

    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

URL එක යැයි උපකල්පනය කරමින් ඔබට මෙම ශ්‍රිතය භාවිතා කළ හැකි ආකාරය මෙයයි

http://dummy.com/?stringtext=jquery&stringword=jquerybyexample

var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');

මෙම ප්‍රවේශය දැනටමත් ක්‍රියාත්මක කිරීම කිහිපයක් තිබේ. අවම වශයෙන් ඔබට ප්‍රති ri ල අගයන් විකේතනය කළ යුතුය. ඔබ වටිනාකමක් සඳහන් නොකරන්නේ නම් මෙයද වැරදි ලෙස හැසිරෙනු ඇත, උදා ?stringtext&stringword=foo.
රූප්

25

ඔබ Browserify භාවිතා කරන්නේ නම්, ඔබට Node.jsurl වෙතින් මොඩියුලය භාවිතා කළ හැකිය :

var url = require('url');

url.parse('http://example.com/?bob=123', true).query;

// returns { "bob": "123" }

වැඩිදුර කියවීම: URL Node.js v0.12.2 අත්පොත සහ ප්‍රලේඛනය

සංස්කරණය කරන්න: ඔබට යූආර්එල් අතුරුමුහුණත භාවිතා කළ හැකිය , එය සෑම නව බ්‍රව්සරයකම පාහේ භාවිතා කර ඇති අතර කේතය පැරණි බ්‍රව්සරයක ක්‍රියාත්මක වීමට යන්නේ නම් ඔබට මේ වගේ පොලිෆිල් එකක් භාවිතා කළ හැකිය . විමසුම් පරාමිතීන් ලබා ගැනීමට URL අතුරුමුහුණත භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ කේත උදාහරණයක් මෙන්න (සෙවුම් පරාමිතීන්)

const url = new URL('http://example.com/?bob=123');
url.searchParams.get('bob'); 

ඔබට ඒ සඳහා URLSearchParams භාවිතා කළ හැකිය, URLSearchParams සමඟ එය කිරීමට MDN වෙතින් උදාහරණයක් මෙන්න:

var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}

searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"

urlමොඩියුලයේ API සඳහා වන ලියකියවිලි මෙහි ඇත: nodejs.org/api/url.html
andrezsanchez

Nw.js සංවර්ධනය සඳහා මෙය කදිමයි. බොහෝ නෝඩ් මොඩියුලයන් nw.js කවුළුවක මෙන් ක්‍රියා කරන බැවින් බ්‍රව්සරකරණය අවශ්‍ය නොවේ. මම මෙම කේතය පරීක්‍ෂා කර ඇති අතර කිසිදු වෙනස් කිරීමකින් තොරව එය විස්මයජනක ලෙස ක්‍රියා කරමි.
ඇන්ඩ rew ග්‍රෝත්

ඔහ්, මෙය නියමයි! URLSearchParams පරිපූර්ණ ලෙස ක්‍රියා කරයි. බොහෝම ස්තූතියි!
බරන් එම්‍රේ

1
බොහෝ විට හොඳම ඡන්දය ප්‍රකාශ කළ යුතුය, අභිරුචි කාර්යයන් සහ අමතර පුස්තකාල සමඟ කරදරයක් නැත. එය ද බොහෝ දුරට බ්‍රව්සර් විසින් අනුගමනය කරන බව පෙනේ.
TheWhiteLlama
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.