2010-10-31 83 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