2016-08-10 131 views
-2

我有三個函數來處理url參數,但它不夠好,我的意思是它有點複雜,而我正在尋找簡單的函數來使用所有這三個。獲取多個url參數

function getUrlParameter(sParam) { // this function to get single parameter 
    var sPageURL = window.location.search.substring(1); 
    var sURLVariables = sPageURL.split('&'); 
    for (var i = 0; i < sURLVariables.length; i++) { 
     var sParameterName = sURLVariables[i].split('='); 
     if (sParameterName[0] == sParam) { 
      return sParameterName[1]; 
     } 
    } 
} 


function replaceUrlParam(paramName, paramValue) { // this to replace parameters value by other value 
    var currentUrl = window.location.href; 
    var pattern = new RegExp('(' + paramName + '=).*?(&|$)') 
    var newUrl = currentUrl.replace(pattern, '$1' + paramValue + '$2'); 
    if (newUrl == currentUrl && newUrl.indexOf(paramName + '=' + paramValue) == -1) { 
     newUrl = newUrl + (newUrl.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue 
    } 
    window.history.pushState('', document.title, newUrl); 
    return newUrl; 
} 



function getUrlParameters() { // this to get all parameters 
    var sParam = 'p'; var viewParam = 'v'; var lanPram = 'l'; var ukomPram = 'uk'; var catPram = 'ca'; var ucatPram = 'uc'; 

    l = getUrlParameter(lanPram); 
    ukmun = getUrlParameter(ukomPram); 
    kat = getUrlParameter(catPram); 
    uKat = getUrlParameter(ucatPram); 
    pagenumber = getUrlParameter(sParam); 
    viewIndex = getUrlParameter(viewParam); 
    if (l || l == 0) { l = l; } else { l = replaceUrlParam(lanPram, 0); } 
    if (ukmun) { ukmun = ukmun; } else { ukmun = replaceUrlParam(ukomPram, 0); } 
    if (kat) { kat = kat; } else { kat = replaceUrlParam(catPram, 0); } 
    if (uKat) { uKat = uKat; } else { uKat = replaceUrlParam(ucatPram, 0); } 
    if (viewIndex) { viewIndex = viewIndex; } else { viewIndex = 'l'; } 
    if (pagenumber) { pagenumber = pagenumber; } else { pagenumber = 1; } 
} 

這個工作,但它調用許多功能replaceUrlParam和功能​​而大的事情,我不喜歡的是當網頁加載時使用這些網址,然後,如果我想回到以前的頁面也被追溯到每個參數

例如:如果有這個網址myfile.php?p=1&v=l&l=0&uk=0&ca=0&uc=0

然後如果我點擊上一步上一個頁面的瀏覽器我回去一個參數一樣,

myfile.php?p=1&v=l&l=0&uk=0&ca=0然後再往前走,它停留在相同的頁面中,像下一個參數myfile.php?p=1&v=l&l=0&uk=0等等,直到參數消失。

圍繞這3個功能是否有簡單的工作使它更容易和簡單?

謝謝。

+0

可能是http://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-url-parameter的副本 – deltree

+0

@deltree沒有抱歉,它完全不同。看看他問的其他答案。不要只閱讀其他答案而不做重複。我想你只是閱讀tittle –

回答

-2

首先,每次獲取var時,查看整個查詢字符串似乎效率不高。我建議,分析整個查詢字符串轉換成一個對象了,就象這樣:

function getParameters() { 
    // Get just the query string, and split it on & 
    var param_arr = window.location.search.substring(1).split('&'), 
     param_obj = {}; 

    // Iterate through results 
    for (var i = 0; i < param_arr.length; i++) { 
     var param = param_arr[i].split('='); 

     if (param === param_arr[i]) 
      // If this did not have a value, it goes into the object as key = true 
      param_obj[param] = true; 
     else 
      // If this did have a value, we enter it into the object as key = value 
      param_obj[param[0]] = param[1]; 
    } 

    return param_obj; 
}; 

現在,getParameters會返回一個對象,看起來像這樣的例子:

{ 
    p: 1, 
    v: 1, 
    uk: 0 
} 

至於違約,簡單的方法是用默認值創建一個看起來像這樣的對象,然後將它們合併在一起。有很多可以做這件事有點更優雅和萬無一失庫,但這裏有一個簡單的例子:

function mergeParams(defaults, params) { 
    var obj = {}; 

    for (var i in defaults) { 
     if (i in params) 
      obj[i] = params[i]; 
     else 
      obj[i] = defaults[i]; 
    } 

    return obj; 
} 

所以,你會怎麼做:

var defaults = { 
    i: 0, 
    v: 1 
}; 

var params = getParameters(); 
params = mergeParams(defaults, params); 

所有這一切僅僅是一個開始。還有其他可能的考慮因素,具體取決於您的需求,例如解析查詢字符串編碼。我強烈建議尋找一個可以爲你做到這一點的圖書館。 URI.js可能很適合:http://medialize.github.io/URI.js/

+0

如何確定參數是否定義,如果沒有定義,我做了replaceparameter? –

+0

由於這將默認值與URL中的參數合併,因此我們可以獲取默認值,而不會更改URL。這意味着你不必反覆擊中'後退'。實際上,用戶甚至沒有看到URL中顯示的默認參數。 – Chazzu

+0

我如何合併一個參數的例子?你能給例子 –