在window.location.hash中执行子字符串

时间:2009-05-05 09:19:49

标签: javascript

不知何故,window.location.hash在不同浏览器中的处理方式不同。如果我有如下网址

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

我有兴趣在#parcel / history /和?as = json之间获取值...所以substring语句类似于

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

我在firefox 3.0.10中有这个工作没有问题但是相同的子字符串语句在Opera 9.60中不起作用。

经过一些快速搜索后,我发现了一些可能有用的有趣信息

  • window.location.hash应该始终返回urlencoded字符串,但这是bug中的Firefox
  

如果URL的哈希部分包含编码字符(请参阅Core_JavaScript_1.5_Reference:Global_Functions:encodeURIComponent),则哈希返回已解码的URL部分。这是Firefox中的一个错误。 href,search和pathname返回正确的编码URL部分。

  • Opera仅返回#parcel / history / 1并忽略剩余的字符串,这是我的substring语句失败的主要原因......

如果我想在正常表达式之外的#parcel / history /和?as = json ....之间提取字符串,是否有更好的方法?!

4 个答案:

答案 0 :(得分:4)

试试这个:

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 :(得分:1)

这是我目前解决问题的方法

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

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

        return result;
    };

答案 2 :(得分:0)

您可以使用window.location.href代替哈希,但为什么不使用正则表达式呢?比基于字符N的子串的方法更可靠,更安全。尝试:

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

正则表达式不是一直都是正确的答案,但有时它恰到好处。

编辑:清理方法封装

function GetValue()
{
    var m = window.location.href.match(/#parcel\/history\/(.*?)(\?|$)/);
    return m ? m[1] : null;
}

答案 3 :(得分:0)

您也可以这样做:

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