4

一旦我创建了 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 中遇到过这么神秘的类型。

4

2 回答 2

3

我不能把它串起来

因为它是一个“宿主对象”(由宿主环境,浏览器提供),宿主对象不能被字符串化。

我无法循环通过它

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

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

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

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

于 2013-06-19T21:40:53.113 回答
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));
};
于 2013-06-19T21:41:33.010 回答