Javascript 为什么FormData如此秘密/私密?
一旦我创建FormDataJavascript 为什么FormData如此秘密/私密?,javascript,Javascript,一旦我创建FormData var form = new FormData(); form.append("hash", this.S.Storage.get('h_token')); 我不能把它严格化: JSON.stringify(form) // returns "{}" 我无法循环通过它: _.each(form, function(val){ // nope }) 我无法将其记录到控制台(有任何有用的结果) 我还没有在JavaScript中遇到过这样一种神秘的类型 我不能
var form = new FormData();
form.append("hash", this.S.Storage.get('h_token'));
我不能把它严格化:
JSON.stringify(form) // returns "{}"
我无法循环通过它:
_.each(form, function(val){
// nope
})
我无法将其记录到控制台(有任何有用的结果)
我还没有在JavaScript中遇到过这样一种神秘的类型
我不能把它严格化
因为它是一个“主机对象”(由主机环境、浏览器提供),并且主机对象无法字符串化
我无法循环通过它
这可能意味着它没有可枚举属性
我无法将其记录到控制台(有任何有用的结果)
实际上,console.log显示了,.append
中定义的唯一方法
为什么没有可枚举属性?我不知道,但考虑到你负责填充FormData,你应该事先知道它的内容,不是吗?它非常保密,因为它只用于将数据传递给AJAX请求,并使你不必自己在“多部分/表单数据”中编码数据,就像你定期提交表格一样。因此,您应该只在发送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));
};
它只用于使用XHRs发送数据,似乎它应该有一种方法来检查它,但没有。。。所以解决办法是。。。除了发送XHR之外,不要使用
FormData
进行任何操作,在创建FormData
实例之前,请检查任何值。是的,它是基于键的,所以为什么我不能使用对其进行循环,因为在中有没有快速检查可枚举属性的方法?因为它是私有实现的,他们不想让你进入内部,你试图用它做一些不想做的事情…我想检查它,而不是修改它,这没什么错,只是我做不到。你在抱怨一些你做不到的事情。愿你学会接受你不能改变的东西:)我建议了一种解决方法,不要到处传递FormData
见我的答案属性应该是可枚举和可读的。确切地说,如果我填充它,我应该可以随时读取它。您必须对myData的内容进行表单编码,API并没有说您可以将普通对象传递给FormData
。我认为关键是您应该只使用FormData将数据传递给XHR.send()
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));
};