不知何故,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中不起作用。
经过一些快速搜索后,我发现了一些可能有用的有趣信息
如果URL的哈希部分包含编码字符(请参阅Core_JavaScript_1.5_Reference:Global_Functions:encodeURIComponent),则哈希返回已解码的URL部分。这是Firefox中的一个错误。 href,search和pathname返回正确的编码URL部分。
如果我想在正常表达式之外的#parcel / history /和?as = json ....之间提取字符串,是否有更好的方法?!
答案 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);