我有一个空的form
标记,并且有一个函数可以生成4000个隐藏的输入,其中包含要由表单发送的数据。在不创建DOM输入的情况下设置表单数据
生成4000隐藏输入是相当快的(大约需要4ms
)。但是,当我在窗体标签中追加隐藏的输入时,浏览器冻结约1秒钟。
我还在<div/>
标签中隐藏了隐藏的输入,但没有太多帮助。
有没有什么办法以编程方式设置表单数据,而不使用输入DOM元素?
喜欢的东西:
$form[0].setData([{ id: 1, value: "A" }, { id: 2, value: "B" }]);
$form.submit();
这里是生成隐藏的输入
function saveUIPositions() {
var $form = $("#saveUIPositionsForm");
$form.empty();
console.time("ui");
var array = [];
array.push("<div>");
var items = dataTable.dataView.getItems();
for (var i = 0, len = items.length; i < len; i++) {
var item = items[i];
var index = dataTable.dataView.getRowById(item.Id) + 1;
array.push("<input type='hidden' name='[");
array.push(i);
array.push("].Item_Id' value='");
array.push(item.Id);
array.push("' />");
array.push("<input type='hidden' name='[");
array.push(i);
array.push("].Index' value='");
array.push(index);
array.push("' />");
}
array.push("</div>");
console.timeEnd("ui");
// here it gets very costly (and not because of array.join())
$form.append(array.join(""));
$form.submit();
};
是的。 Dom修改是昂贵的。一个需要结合变化并一次全部应用。 –
我已经添加了一个示例 – Catalin
真正的问题是您将** 8K **输入添加到DOM,这将始终需要时间。您绝对应该考虑使用另一种方法IMO。我仍然做一些测试(http://jsfiddle.net/wPfuq/1/)。还要注意,当输入处于表单中时,$ form.empty()会导致冻结(第二次单击)。 – rd3n