2016-04-22 42 views
1

我在我的應用中使用了Ext JS的routing,但這是一個更基本的問題......只知道在Ext JS中的路由設置就像http://url/#area1/subarea1,其中#area1將帶我到父級別區域,subarea1將帶我到area1的第一個子項目。JavaScript:從URL中獲取查詢字符串,使用#號的路由

無論如何,我試圖完成的是將查詢參數添加到我的URL ...所以它會像http://url/#area1/subarea1?startDate=03/03/2014&isDraft=true,但它看起來像location.search是FF和Chrome中的空字符串,假設這是設計。我知道我可以解析location.href,但這看起來很愚蠢。我基本上想知道如果我做錯了什麼,或者如果有一些其他屬性我可以使用?

+0

[ExtJS路由指南](https://docs.sencha.com/extjs/6.0/application_architecture/router.html)演示了框架如何處理參數化的URL。 – Emissary

+0

不是我正在尋找的......看起來不像他們處理查詢字符串,但無論如何感謝。 – incutonez

+0

根據規範,查詢字符串在**片段之前屬於**。你可以定義你希望在哈希後管理數據的任何方案,但爲什麼重新發明輪子?這個問題被標記爲「extjs」,並且該框架具有用於處理片段URI /路由的良好API。目前尚不清楚你想通過鏈接中的例子來達到目標​​嗎? – Emissary

回答

0

我剛剛在Angular中遇到過同樣的問題。這是我的解決方案:

function getParameterByName(name, url) { 
    if (!url) url = window.location.href; 
    url = url.toLowerCase(); 
    name = name.replace(/[\[\]]/g, "\\$&").toLowerCase(); 
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), 
     results = regex.exec(url); 
    if (!results) return null; 
    if (!results[2]) return ''; 
    return decodeURIComponent(results[2].replace(/\+/g, " ")); 
} 
1

位置URL總是按照以下順序:協議主機名路徑名搜索哈希。在你的情況下,搜索是空的,因爲#在第一個?之前。

所以,在http://url/#area1/subarea1?startDate=03/03/2014&isDraft=true

  • location.protocolhttp:
  • location.hostnameurl
  • location.pathname/
  • location.search是空
  • location.hash#area1/subarea1?startDate=03/03/2014&isDraft=true

因此location.hash.split('?')[1]應該包含您想要的「查詢參數」,或者如果您希望它們作爲對象,Ext.Object.fromQueryString(location.hash.split('?')[1] || {})

+0

在您指定的URL順序中是否存在RFC或某種文檔?我有興趣閱讀。 – incutonez

+0

速度更快,使用更少的內存:'Ext.Object.fromQueryString(location.hash.replace(/^.+\?/,''))''。看基準:https://jsperf.com/hash-replace-vs-split#area1/subarea1?startDate=03/03/2014&isDraft=true – Nux

相關問題