2010-10-31 44 views
1

我有代码锚获取部分:如何编辑锚的一部分,URL

function _get_part(queryString, name) { 
    var match = '&' + name + '='; 
    var i = queryString.indexOf(match); 

    if(i < 0) { 
    match = name + '='; 
    if(queryString.slice(0, match.length) == match) 
     i = 0; 
    } 

    if(i > -1) { 
    i += match.length; 
    return queryString.slice(i, queryString.indexOf('&', i) >>> 0); 
    } 
}; 

function get_location_hash() { 
    return window.location.hash.substr(2); 
} 

function get_part(name) { 
    return _get_part(get_location_hash(), name); 
} 

我需要改变锚的一部分的功能,如果这部分不存在,或者如果它添加零件不存在。

这时我使用下面的代码:

function set_part(queryString, key, value) { 
    var oldv = key + '=' + get_part(key); 
    var newv = key + '=' + value; 
    window.location.hash = '/' + queryString.replace(oldv, newv); 
} 

但是,如果锚的部分不存在,锚不会改变。

URL格式:...页/#/ VAR1 = blablabla & VAR2 = var2text & gghh = edere

锚 - #/ VAR1 = blablabla & VAR2 = var2text & gghh = edere

对不起我的英文。

非常感谢!

更新:

它真棒,非常感谢你! 只有一个问题: ... /页/ NEX使用以下代码::withoud任何锚我加载页面

set_part(get_location_hash(), 'filter', 'data'); 
set_part(get_location_hash(), 'filter2', 'data2'); 
set_part(get_location_hash(), 'fdgfg', 'fdgfdg'); 
alert(get_part('fdgfg')); 

和接收... /页/#/ = &滤波器=数据&过滤器2 = data2 & fdgfg = fdgfdg

如何删除第一个'='符号?

回答

2

如果key已存在于网址哈希中,您的函数将正常工作。

例如,如果您的网址是:

http://example.com/whatever.html#/var1=blablabla&var2=var2text&gghh=edere 

然后调用set_part()这样的:

set_part(get_location_hash(), 'var2', 'bar'); 

将改变哈希如下:

http://example.com/whatever.html#//var1=blablabla&var2=bar&gghh=edere 

注意:它正确更改了var2的值。但它确实在开始时增加了一个额外的斜线。

问题是如果以前不存在这样的密钥,它将不会添加参数。如果你想这样做,那么我建议你像下面这样:现在

function _parseQueryString(queryString) { 
    var pairs = queryString.split('&'); 
    var params = {}; 
    for(var i=0; i<pairs.length; ++i) { 
     pairs[i] = pairs[i].trim(); 
     if(pairs[i] == '') continue; 

     var parts = pairs[i].split('='); 
     if(parts.length == 0) continue; 
     var name = parts.shift(); 
     var value = ''; 
     while(parts.length) { 
      value += parts.shift(); 
     } 
     params[name]=value; 
    } 
    return params; 
} 

function _buildQueryString(params) { 
    var queryString = ""; 
    for(var i in params) { 
     if(queryString.length > 0) queryString += "&"; 
     queryString += (i + '=' +params[i]); 
    } 
    return queryString; 
} 

function set_part(queryString, key, value) { 
    /* first remove the leading '#/', if any */ 
    if(queryString.indexOf('#')==0) { 
     queryString = queryString.substring(1); 
    } 
    if(queryString.indexOf('/')==0) { 
     queryString = queryString.substring(1); 
    } 

    /* now parse the hash (in queryString format) into 
     an object containing all the parts */ 
    var params = _parseQueryString(queryString); 

    /* finally, just set the value in the params object, 
     and rebuild the query string, adding 
     in the slash again 
    */ 
    params[key]=value; 
    window.location.hash = '/' + _buildQueryString(params); 
} 

,如果你的页面的URL是

http://example.com/whatever.html#/var1=blablabla&var2=var2text&gghh=edere 

,你这样称呼它:

alert('hash before: '+window.location.hash); 

set_part(window.location.hash, 'var2', 'bar'); 
set_part(window.location.hash, 'foo', 'foovalue'); 

alert('hash after: '+window.location.hash); 

然后你就可以看到两个表单都能正常工作。你可以see this example in action at jsfiddle

+0

太棒了,非常感谢你! 只有一个问题:我加载页面withoud任何锚点: http://.../page/ nex使用此代码: set_part(get_location_hash(),'filter','data'); set_part(get_location_hash(),'filter2','data2'); set_part(get_location_hash(),'fdgfg','fdgfdg'); alert(get_part('fdgfg')); 并收到http://.../page/#/=&filter=data&filter2=data2&fdgfg=fdgfdg 如何删除第一个'='符号? – user492996 2010-10-31 22:13:27

+0

oops。我在'_parseQueryString()'的for循环的开头添加了两行。这将解决这个问题。 – Lee 2010-10-31 22:39:30

+0

非常感谢你! – user492996 2010-10-31 22:43:52