2011-02-13 39 views
4

我正在爲Facebook Feed Dialog設置一個URL的格式。儘管有很多參數。我想有這些對話框的功能,如:將JSON鍵值對象轉換爲查詢字符串的JavaScript函數

function generateDialogUrl(dialog, params) { 
    base = "http://www.facebook.com/dialog/" + dialog + "?"; 
    tail = []; 
    for (var p in params) { 
    if (params.hasOwnProperty(p)) { 
     tail.push(p + "=" + escape(params[p])); 
    } 
    } 
    return base + tail.join("&") 
} 

哦哇......我想我只是回答了我自己的問題。是對的嗎?是escape()正確的功能使用?

我被困在Lovers source code

更新:因爲我們使用的是jQuery,所以我使用jQuery.each重寫了該方法。根據@galambalazs & @ T.J的建議,我也將escape()替換爲encodeURIComponent()。克勞德。多謝你們!

var generateDialogUrl = function (dialog, params) { 
    base = "http://www.facebook.com/dialog/" + dialog + "?"; 
    tail = []; 
    $.each(params, function(key, value) { 
    tail.push(key + "=" + encodeURIComponent(value)); 
    }) 
    return base + tail.join("&"); 
} 

它的工作!

+2

您可以接受的答案,如果它解決您的問題。 :) – galambalazs 2011-05-26 14:01:55

+0

另外,答案不應放在問題主體中;相反,所有者應該回答它自己的問題並標記爲已接受。 – igorsantos07 2012-11-23 20:12:15

回答

7

更好的是,使用encodeURIComponent來代替。看到此article比較兩個:

逃逸()方法不編碼 ,其與空間中 解釋 作爲空間在服務器端,以及 作爲生成由形成+字符他們的領域。由於這個缺陷 和事實,這個功能失敗 正確處理非ASCII字符 ,你應該避免使用 escape()只要有可能。 最好的 替代通常是 encodeURIComponent()

逃逸()將不編碼:@ */+

2

是一個jQuery方法來實現:$.param。它的工作是這樣的:

var generateDialogUrl = function (dialog, params) { 
    base = 'http://www.facebook.com/dialog/' + dialog + '?'; 
    return base + $.param(params); 
} 
0
convertJsonToQueryString: function (json, prefix) { 
    //convertJsonToQueryString({ Name: 1, Children: [{ Age: 1 }, { Age: 2, Hoobbie: "eat" }], Info: { Age: 1, Height: 80 } }) 
    if (!json) return null; 
    var str = ""; 
    for (var key in json) { 
     var val = json[key]; 
     if (isJson(val)) { 
      str += convertJsonToQueryString(val, ((prefix || key) + ".")); 
     } else if (typeof (val) == "object" && ("length" in val)) { 
      for (var i = 0; i < val.length; i++) { 
       //debugger 
       str += convertJsonToQueryString(val[i], ((prefix || key) + "[" + i + "].")); 
      } 
     } 
     else { 
      str += "&" + ((prefix || "") + key) + "=" + val; 
     } 
    } 
    return str ? str.substring(1) : str; 
} 

isJson = function (obj) { 
    return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; 
}; 

例如:

convertJsonToQueryString({Name:1,Children:[{Age:1},{Age:2,Hoobbie:"eat"}],Info:{Age:1,Height:80}}) 

結果:

"Name=1Children[0].Age=1Children[1].Age=2&Children[1].Hoobbie=eatInfo.Age=1&Info.Height=80" 
相關問題