Возможный дубликат:
Как получить значения строки запроса?
Мне нужно проанализировать строку запроса www.mysite.com/default.aspx?dest=aboutus.aspx
.
Как получить переменную dest
в JavaScript?
Возможный дубликат:
Как получить значения строки запроса?
Мне нужно проанализировать строку запроса www.mysite.com/default.aspx?dest=aboutus.aspx
.
Как получить переменную dest
в JavaScript?
Вот быстрый и простой способ анализа строк запроса в JavaScript:
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', variable);
}
Теперь сделайте запрос page.html? x = Hello:
console.log(getQueryVariable('x'));
function parseQuery(queryString) {
var query = {};
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
}
return query;
}
Поворачивает строку запроса как hello=1&another=2
в объект {hello: 1, another: 2}
. Оттуда легко извлечь нужную переменную.
Тем не менее, это не касается случаев массива, таких как "hello=1&hello=2&hello=3"
. Чтобы работать с этим, вы должны проверить, существует ли свойство объекта, который вы создаете, перед его добавлением и превращать его в массив, нажимая любые дополнительные биты.
Вы также можете использовать отличную библиотеку URI.js Родни Ремм. Вот как: -
var qs = URI('www.mysite.com/default.aspx?dest=aboutus.aspx').query(true); // == { dest : 'aboutus.aspx' }
alert(qs.dest); // == aboutus.aspx
И проанализировать строку запроса текущей страницы: -
var $_GET = URI(document.URL).query(true); // ala PHP
alert($_GET['dest']); // == aboutus.aspx
Я тоже! http://jsfiddle.net/drzaus/8EE8k/
(Примечание: без причудливой вложенной или дублированной проверки)
deparam = function (querystring) {
// remove any preceding url and split
querystring = querystring.substring(querystring.indexOf('?')+1).split('&');
var params = {}, pair, d = decodeURIComponent;
// march and parse
for (var i = querystring.length - 1; i >= 0; i--) {
pair = querystring[i].split('=');
params[d(pair[0])] = d(pair[1] || '');
}
return params;
};//-- fn deparam
И тесты:
var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?" + tests["simple params"];
tests['just ?'] = '?' + tests['simple params'];
var $output = document.getElementById('output');
function output(msg) {
$output.innerHTML += "\n" + Array.prototype.slice.call(arguments, 0).join("\n");
}
$.each(tests, function(msg, test) {
var q = deparam(test);
// prompt, querystring, result, reverse
output(msg, test, JSON.stringify(q), $.param(q));
output('-------------------');
});
Результаты в:
simple params
ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
full url
http://blah.com/?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
just ?
?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
Здесь моя версия базируется на версии Braceyard выше, но разбирается в "словаре" и поддерживает поисковые args без '='. Используется в моей функции JQuery $(document).ready(). Аргументы хранятся в виде пар ключ/значение в argsParsed, которые вы можете где-то сохранить...
'use strict';
function parseQuery(search) {
var args = search.substring(1).split('&');
var argsParsed = {};
var i, arg, kvp, key, value;
for (i=0; i < args.length; i++) {
arg = args[i];
if (-1 === arg.indexOf('=')) {
argsParsed[decodeURIComponent(arg).trim()] = true;
}
else {
kvp = arg.split('=');
key = decodeURIComponent(kvp[0]).trim();
value = decodeURIComponent(kvp[1]).trim();
argsParsed[key] = value;
}
}
return argsParsed;
}
parseQuery(document.location.search);
Следуя за моим комментарием к сообщению @bobby, вот код, который я бы использовал:
function parseQuery(str)
{
if(typeof str != "string" || str.length == 0) return {};
var s = str.split("&");
var s_length = s.length;
var bit, query = {}, first, second;
for(var i = 0; i < s_length; i++)
{
bit = s[i].split("=");
first = decodeURIComponent(bit[0]);
if(first.length == 0) continue;
second = decodeURIComponent(bit[1]);
if(typeof query[first] == "undefined") query[first] = second;
else if(query[first] instanceof Array) query[first].push(second);
else query[first] = [query[first], second];
}
return query;
}
Этот код принимает предоставленную последовательность (как 'str') и возвращает объект. Строка разделяется на все входы &, в результате получается массив. массив затем перемещается, и каждый элемент в нем разделяется на "=". Это приводит к подсетям, в которых 0-й элемент является параметром, а 1-й элемент - значением (или undefined, если нет = знак). Они сопоставляются с объектными свойствами, поэтому, например, строка "hello = 1 & another = 2 & something" превращается в:
{
hello: "1",
another: "2",
something: undefined
}
Кроме того, этот код отмечает повторяющиеся повторения, такие как "hello = 1 & hello = 2" и преобразует результат в массив, например:
{
hello: ["1", "2"]
}
Вы также заметите, что это касается случаев, в которых знак = не используется. Он также игнорирует, если знак равенства равен символу a и.
Немного перехитрить исходный вопрос, но можно использовать многоразовое решение, если вам нужно работать с querystrings в javascript:)
Если вы знаете, что у вас будет только одна переменная с помощью querystring, которую вы можете просто сделать:
var dest = location.search.replace(/^.*?\=/, '');
Следующая функция будет анализировать строку поиска с помощью регулярного выражения, кэшировать результат и возвращать значение запрашиваемой переменной:
window.getSearch = function(variable) {
var parsedSearch;
parsedSearch = window.parsedSearch || (function() {
var match, re, ret;
re = /\??(.*?)=([^\&]*)&?/gi;
ret = {};
while (match = re.exec(document.location.search)) {
ret[match[1]] = match[2];
}
return window.parsedSearch = ret;
})();
return parsedSearch[variable];
};
Вы можете вызвать его один раз без каких-либо параметров и работать с объектом window.parsedSearch
или вызвать getSearch
впоследствии.
Я не полностью тестировал это, регулярное выражение может по-прежнему нуждаться в некоторой настройке...
Мне нужна простая функция, которая взяла URL-адрес в качестве ввода и вернула карту параметров запроса. Если бы я улучшил эту функцию, я бы поддержал стандарт для данных массива в URL-адресе и/или вложенных переменных.
Это должно работать и для функции jQuery.param(qparams).
function getQueryParams(url){
var qparams = {},
parts = (url||'').split('?'),
qparts, qpart,
i=0;
if(parts.length <= 1 ){
return qparams;
}else{
qparts = parts[1].split('&');
for(i in qparts){
qpart = qparts[i].split('=');
qparams[decodeURIComponent(qpart[0])] =
decodeURIComponent(qpart[1] || '');
}
}
return qparams;
};
Как насчет этого?
function getQueryVar(varName){
// Grab and unescape the query string - appending an '&' keeps the RegExp simple
// for the sake of this example.
var queryStr = unescape(window.location.search) + '&';
// Dynamic replacement RegExp
var regex = new RegExp('.*?[&\\?]' + varName + '=(.*?)&.*');
// Apply RegExp to the query string
val = queryStr.replace(regex, "$1");
// If the string is the same, we didn't find a match - return false
return val == queryStr ? false : val;
}
.. то просто назовите его с помощью:
alert('Var "dest" = ' + getQueryVar('dest'));
Приветствия
Я хотел выбрать определенные ссылки внутри элемента DOM на странице, отправить этих пользователей на страницу перенаправления по таймеру и затем передать их на исходный URL-адрес. Вот как я это сделал, используя обычный javascript, включающий один из вышеперечисленных методов.
Страница со ссылками: Голова
function replaceLinks() {
var content = document.getElementById('mainContent');
var nodes = content.getElementsByTagName('a');
for (var i = 0; i < document.getElementsByTagName('a').length; i++) {
{
href = nodes[i].href;
if (href.indexOf("thisurl.com") != -1) {
nodes[i].href="http://www.thisurl.com/redirect.aspx" + "?url=" + nodes[i];
nodes[i].target="_blank";
}
}
}
}
Тело
<body onload="replaceLinks()">
Страница перенаправления Руководитель
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', variable);
}
function delayer(){
window.location = getQueryVariable('url')
}
Тело
<body onload="setTimeout('delayer()', 1000)">
Посмотрите это решение. Используя его функцию, вы просто не вызываете gup('dest')
, чтобы получить параметр URL dest
.