为什么FormData如此秘密/私密?

时间:2013-06-19 21:28:30

标签: javascript

创建FormData后

var form = new FormData();
form.append("hash", this.S.Storage.get('h_token'));

我无法将其字符串化:

JSON.stringify(form) // returns "{}"

我无法遍历它:

_.each(form, function(val){
    // nope
})

我无法将其记录到控制台(带有任何有用的结果)。

console.log(form);

我还没有在JavaScript中遇到这种秘密类型。

2 个答案:

答案 0 :(得分:3)

  

我无法将其字符串化

因为它是“主机对象”(由主机环境,浏览器提供),并且主机对象无法进行字符串化。

  

我无法循环播放

这可能意味着它没有可枚举的属性。

  

我无法将其记录到控制台(带有任何有用的结果)。

实际上,console.log显示了specification.append中定义的唯一方法。

为什么没有可枚举的属性?我不知道,但考虑到你负责填充FormData,你应该事先知道它的内容,不是吗?

答案 1 :(得分:3)

它是如此秘密,因为它只是用于将数据传递给AJAX请求,并使您不必自己编码“multipart / form-data”中的数据,就像定期提交表单时所做的那样。因此,您只应在发送AJAX请求的最后时刻使用它,而不是将其传递给其他函数。

如果您需要访问其他相同的数据,您可以传递一个简单的JS对象并编写一个简单的帮助程序,如:

function createFormData(myData) {
   // It could also take an existing form for some values from the user
   var formData = new FormData(/** FormElement form */);
   for  (var key in myData) {
      formData.append(key, myData[key]);
   }
   return formData;
}

sendMyInfo: function(params)
  // Add some data to the default params
  params.hash = this.S.Storage.get('h_token'));
  params.cacheBuster = (new Date()).valueOf();

  // Inspect it
  console.log(myData);

  // Wherever you actually need FormData, create it for that purpose only....
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "stash.php", true);
  oReq.send(createFormData(myData));
};