делать подстроку в window.location.hash - PullRequest
2 голосов
/ 05 мая 2009

Каким-то образом window.location.hash обрабатывается по-разному в разных браузерах. Если у меня есть URL-адрес следующим образом

http://maps-demo.bytecraft.com.my/postdemo/parcel
    #parcel/history/1?as=json&desc[]=ctime&desc[]=history_id

и я заинтересован в получении значений между # parcel / history / и? As = json ... поэтому оператор подстроки будет чем-то похожим на

window.location.hash.substring(14, window.location.hash.search(/\?/g));

У меня есть такая работа в Firefox 3.0.10 без проблем, но тот же оператор подстроки не работает в Opera 9.60.

После быстрого поиска я нашел интересную информацию, которая может помочь

  • window.location.hash всегда должен возвращать строку в кодировке urlencoded, но это ошибка в Firefox

Если хеш-часть URL-адреса содержит закодированные символы (см. Core_JavaScript_1.5_Reference: Global_Functions: encodeURIComponent), хеш-функция возвращает декодированную часть URL-адреса. Это ошибка в Firefox. href, search и pathname возвращают правильные, закодированные части URL.

  • Opera возвращает только # parcel / history / 1 и игнорирует оставшуюся строку, и это главная причина, по которой мой оператор подстроки не удался ...

Есть ли лучший способ, если я хочу извлечь строку между # parcel / history / и? As = json .... помимо регулярного выражения?!

Ответы [ 4 ]

4 голосов
/ 05 мая 2009

Попробуйте это:

var match = window.location.href.match(/^[^#]+#([^?]*)\??(.*)/);
var hashPath = match[1];
var hashQuery = match[2];

Это соответствует следующим частям хэша:

…#parcel/history/1?as=json&desc[]=ctime&desc[]=history_id
  \______________/ \____________________________________/
   hashPath         hashQuery
1 голос
/ 05 мая 2009

Это мое текущее решение проблемы

    var get_hash_end = function(_hash) {
        var result = _hash.length;

        if(_hash.search(/\?/g) != -1) {
            result = _hash.search(/\?/g);
        }

        return result;
    };
0 голосов
/ 05 мая 2009

Вы также можете сделать это:

var whatYouWant = window.location.hash.split ('?') [0] .substring (14);

0 голосов
/ 05 мая 2009

Вы можете просто использовать window.location.href вместо хеша, но почему бы не использовать регулярные выражения? Более надежный и безопасный для будущего, чем метод, основанный на подстроке из символа N. Попробуйте:

window.location.href.match(/#parcel\/history\/(.*?)(\?|$)/)[1]

Regex не всегда правильный ответ, но иногда он просто правильный.

Редактировать: очищенный метод инкапсуляции

function GetValue()
{
    var m = window.location.href.match(/#parcel\/history\/(.*?)(\?|$)/);
    return m ? m[1] : null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...