2012-06-26 53 views
2

我很害怕試圖找到解決我的問題的好方法。什麼是序列化數組並傳遞給get方法的最好方法

所以我使用ajax請求傳遞一些數據用於過濾目的。

然後我使用history.js,所以我可以更改網址並向瀏覽器添加一個狀態,從而可以返回,前進等。這樣,我可以使用ajax請求或正常請求。到現在爲止還挺好。

我的問題是,在我通過Ajax請求的數據有一個數組:

function updateContent(url, state) { 
    $.ajax({ 
     type: 'GET', 
     data: {name: state.filter_name, num: state.filter_number, 
      data: state.filter_data, array: state.filter_array}, 
     url: url, 
     success: function(msg) { 
       $('#ajax').html(msg); 
     } 
    }); 

} 

這會令到這個網址 HTTP請求://本地主機/項目/控制器/ filter_array %5B%5D = 1 & filter_array%5B%5D = 50 & filter_array%5B%5D = 70。

的問題是,我想這個網址傳給history.pushstate

如果我使用,然後jsenconde手工打造的網址,該網址會輕微不同,會是這樣的: HTTP://本地主機/項目/控制器/?filter_array = [「1」,「50」,「70」]

雖然它更清潔,我讀的地方,你不應該[]在url的,但即使我用這個我會得到兩種類型的GET url,ajax URL?filter_array%5B%5D = 1 & filter_array%5B%5D = 50 & filter_array%5B%5D = 70。和json url?filter_array = [「1」,「50」,「70」]。

所以我只需要一個解決方案,讓我只是一種類型的GET url,所以我可以使用相同的URL到ajax和普通的請求。

我希望我已經說清楚了..

+0

沒有什麼錯* *使用'[]'在URL中,它只是不與本地PHP比任何其他兼容。但是,如果你在這裏困擾的是['history.pushstate()'](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().C2.A0方法),爲什麼不直接存儲數據在'stateObj'中,當你得到一個狀態彈出事件時,檢查這個而不是URL?這樣你就可以使用一個PHP友好的URL,並且仍然可以輕鬆訪問JS中的數據。 – DaveRandom

回答

0

標準的方式來傳遞值的數組是與[]的傳遞等名義進行重複(URL編碼)作爲你的第一個例子。

你需要生成URL以這樣一種方式,它與這符合...

filter_array[]=1&filter_array[]=2&filter_array[]=3 

其中,當然,編碼爲你呈現....

filter_array%5B%5D=1&filter_array%5B%5D=2&filter_array%5B%5D=3 

如果你堅持使用這種格式,你的代碼將更加便攜(例如ASP.Net將自動執行到許多PHP庫的轉換)。

是否有任何理由不能以這種格式生成網址?

的這裏不同的是,一個是使用標準的形式編碼,另一種是轉換JSON

+1

'[]'不是*標準的方式 - 它甚至不是標準的方式,它只是PHP的做法。 – DaveRandom

+0

@DaveRandom PHP,ASP.Net和RoR都支持它。我承認我不瞭解其他人,所以會接受它可能不是*標準,但它絕對是一個*標準,它的工作原理。 – Basic

+0

哦,它確實有效,並且得到很多系統的支持,但是當你不能引用RFC時,要謹慎地做出「這是*標準」的評論,這是我的觀點。缺乏標準促成創意實施...... – DaveRandom

0

jQuery是編碼JSON對象,使得沒有非法字符URL。如果您想使用javascript檢索該GET變量,則必須從URL中獲取數據,然後使用URL進行解碼,然後使用JSON.parse()將其重新轉換爲JavaScript對象。

http://www.w3schools.com/jsref/jsref_encodeuri.asp

相關問題