Chrome не поддерживает эту строку запроса - PullRequest
0 голосов
/ 23 февраля 2009

Я извлекаю данные из ссылки, http://safalra.com/web-design/javascript/parsing-query-strings/. В Firefox работает нормально, но Google Chrome не поддерживает эту функцию Есть ли лучший способ или альтернативная процедура для извлечения содержимого строки запроса?

<script type="text/javascript">
    var _url = window.location
    alert(_url);
    var queryData = parseQueryString(_url.toString());
    var p = queryData['http://localhost/new_logic/test.php?a'];
    alert(queryData);
    var q = queryData['b'];
</script>

Ответы [ 4 ]

6 голосов
/ 23 февраля 2009

Функция parseQueryString(), созданная автором страницы, на которую вы ссылаетесь, явно вызывает некоторый код JavaScript, который не работает в Chrome.

Это не означает, что Chrome не поддерживает QueryStrings в целом. Похоже, вы предположили, что функция parseQueryString() носит глобальный характер и встроена во все браузеры. Напротив, это пользовательская функция, созданная автором.

Вам лучше всего написать автору по электронной почте, используя контактную форму на странице, или углубиться в файл JavaScript и выяснить, что именно не поддерживается.

5 голосов
/ 23 февраля 2009

ParseQueryString в http://safalra.com/web-design/javascript/parsing-query-strings/ содержит некоторые ошибки:

  • Несколько + не заменяются пробелом.
  • Множественные неэкранированные знаки равенства приводят к потере содержимого.
  • Пустой ввод приводит к объекту с ключом "".
  • Несколько пустых ключей не удаляются

В приведенной ниже функции указанные выше ошибки были удалены и протестированы в Firefox 3, Internet Explorer 7, Opera 9 и Google Chrome 1.

function parseQueryString(input){
    var out={}, decode=decodeURIComponent, s=input||location.search||"",
        kv=("?"===s.charAt(0)?s.slice(1):s).replace(/\+/g," ").split(/[&;]/g),
        idx=-1,key,value;
    while(++idx<kv.length){
        if (kv[idx]==="") continue;
        value=kv[idx].split("=");
        key=decode(value.shift());
        (out[key]||(out[key]=[])).push(decode(value.join("=")));
    }
    return out;
}

Функция выше (и оригинал) ожидает только часть запроса URL : от знака вопроса до конца строки или до первого #. Если аргумент не указан, он автоматически извлечет часть запроса из URL текущего местоположения браузера.

Результатом является объект с ключами из строки запроса, а значение всех ключей является массивом всех значений.

var data = parseQueryString("?a=test1&a=test2&b=test3");

//Result of data:
{
    a:["test1","test2"],
    b:["test3"]
}

Некоторые примеры:

// Alert all values of the a key:
if (data.a && data.a.length) {
  for (var i=0;i<data.a.length;++i)
    alert(data.a[i]);
}

// Get the first value of a-key:
var value_a = data.a && data.a[0];

// Get the first value of a-key or default:
var value_a = data.a && data.a[0] || "default";
1 голос
/ 23 февраля 2009

В коде, который вы использовали 'parseQuerySTring', ничего не будет возвращено для a в http://localhost/new_logic/test.php?a, потому что 'a' не имеет значения. Возможно, вам стоит попробовать http://localhost/new_logic/test.php?a=1&b=2&c=3. Теперь queryData.a должен вернуть 1, queryData.b 2 и т. Д.

0 голосов
/ 23 февраля 2009

Сценарий, кажется, ожидает только часть поиска в качестве входных данных, но он работает для меня в последней версии Chrome.

 <script type="text/javascript">
     var _url = window.location.search;
     alert(_url);
     var queryData = parseQueryString(_url.toString());
     var p = queryData['a'];
     alert(p);
     var q = queryData['b'];
     alert(q);
 </script>

Отображение

?a=aval&b=bval
aval
bval
...