2011-02-13 45 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" 
相关问题