我遇到一种情况,我需要使用 JavaScript 动态创建表单,以支持某些旧版浏览器。我需要通过表单发送的数据当前位于一个对象中,因此,例如:
var data = { name: 'John Doe', age: 35 };
var myForm = document.createElement("form");
myForm.setAttribute("action", myPostActionPath);
myForm.setAttribute("method", "post");
// Append data to the form somehow.
myForm.submit();
我觉得这应该是一件简单的事情,但我一定错过了一些明显的事情。我想要的是将数据作为每个数据属性的键传递,例如上面的示例中的“name=John%20Doe&age=35”。我想这样做而不必执行以下操作:
var data = { name: 'John Doe', age: 35 };
var myForm = document.createElement("form");
myForm.setAttribute("action", myPostActionPath);
myForm.setAttribute("method", "post");
// NOT what I would like:
var formField1 = document.createElement("input");
formField1.setAttribute("type", "hidden");
formField1.setAttribute("name", "name");
formField1.setAttribute("value", data.name);
myForm.appendChild(formField1);
var formField2 = document.createElement("input");
formField2.setAttribute("type", "hidden");
formField2.setAttribute("name", "age");
formField2.setAttribute("value", data.age);
myForm.appendChild(formField2);
myForm.submit();
那么,有没有什么方法可以以这种方式附加我的数据,而无需循环遍历数据的属性以将每个属性添加为隐藏字段?
另外,请注意我的数据属性本身可能是对象或数组。
更新
这是我当前的解决方案,但我一直在寻找一种更直接的方法来传递数据,而不必迭代数据对象,但从这里的所有答案来看,似乎没有其他方法:
var data = { name: 'John Doe', age: 35 };
var myForm = document.createElement("form");
myForm.setAttribute("action", myPostActionPath);
myForm.setAttribute("method", "post");
$.each(data, function(name, value) {
var formInput = document.createElement("input");
formInput.setAttribute("type", "hidden");
formInput.setAttribute("name", name);
formInput.setAttribute("value", value);
myForm.appendChild(formInput);
});
myForm.submit();
为了更好地解释一下,我在将一些数据发送回 Controller 后使用此操作来下载文件,而 IE8 和 IE9 不允许通过 AJAX 帖子下载文件,所以这是一个失败-back 允许我下载文件,而无需提交原始表单,否则会导致不良的全页刷新。
最佳答案
So, is there any way to append my data that way without looping through data's properties to add each one as a hidden field?
不幸的是没有:HTMLFormElement API .
关于javascript - 如何获取一个对象,其中每个元素作为键传递到帖子表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320331/