由于异步表单提交,结果不一致
Unconsistent results because of asynchronous form submit?
我正试图将画布转换为Jpeg图像,并将其放入表单的隐藏字段中,然后提交表单。
function createBlob() {
var imageblob = canvas.toDataURL('image/jpeg', 0.5);
document.getElementById("id_hidden_preview_field").value = imageblob; // Here we put the imageurl blob into the hidden_preview_field.
// Here we submit the form with the
$("#design").submit();
alert("after submit");
}
这是表单的代码:
<div class="container">
<h2>Add a design</h2>
<form id="design" enctype="multipart/form-data" method="post"><input type="hidden" name="csrfmiddlewaretoken" value="qrGJSSQADxYItnN0TKUUPJA3JExfaFaP">
<input id="id_hidden_preview_field" name="hidden_preview_field" type="hidden"></p>
<!--<input type='submit' value='Save' />-->
<button id="gif" onclick="createBlob()">Save</button>
</form></div>
出于某种原因,当我不放警报(alert("after-submit"+new Date().getTime();)时,发送表单时,隐藏字段中没有图像。
当我发出警报时,它会毫无问题地发送出去。
这让我认为表单提交存在问题,它破坏了它需要发送的一个DOM元素。
现在有人知道吗,如果它真的是异步的,如果不是异步的,我如何确保$("#design).submit();只有在图像被复制到隐藏字段后才被调用,或者可能不破坏DOM元素。
非常感谢!
我修改了代码的某些部分,并使用JavaScript的addEventListener
函数将click
事件侦听器添加到button
,而不是HTML的onclick
属性。
这是代码:
HTML
<canvas id="myCanvas"></canvas>
<div class="container">
<h2>Add a design</h2>
<form id="design" enctype="multipart/form-data" method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="qrGJSSQADxYItnN0TKUUPJA3JExfaFaP" />
<input id="id_hidden_preview_field" name="hidden_preview_field" type="hidden" />
<button id="gif">Save</button>
</form>
</div>
如您所见,我添加了canvas
标签(仅用于演示),并删除了Save
按钮的onclick
。
JavaScript
/* Some drawing on canvas */
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
ctx.font = "30px Arial";
ctx.strokeText("Hello World", 10, 50);
/* Get the needed elements from the DOM */
var form = document.getElementById('design'),
saveButton = document.getElementById('gif'),
hiddenField = document.getElementById('id_hidden_preview_field');
/* Add click listener on save button click */
saveButton.addEventListener('click', createBlob, false);
/* The click handler function */
function createBlob() {
var imageblob = canvas.toDataURL('image/jpeg', 0.5);
hiddenField.value = imageblob; // Here we put the imageurl blob into the hidden_preview_field.
// Here we submit the form with the
form.submit();
}
在这里,我添加了一些在canvas
上绘制的代码,提取并缓存了elements
,在保存按钮上添加了事件侦听器。createBlob
与您的代码几乎相同。
您可以在这里的JSFiddle中查看实际示例。
当您点击Save
按钮时,JSFiddle会给出一个错误,因为您无法在那里提交表单。
但是,如果您打开Chrome开发工具并转到"网络"选项卡,您可以看到request
包含blob。您也可以在Firefox中使用Firefox开发工具或使用Firebug扩展(选项卡名称为Net)进行检查。
相关文章:
- HTML表单提交时未执行外部函数
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 将图像上传ajax与表单提交ajax相结合
- Javascript无法处理表单提交
- 如何在我的情况下禁用表单提交
- 加载后的页面与ajax表单提交不起作用
- iFrame表单提交并在结果后发出警报
- 表单提交后保留数据库查询结果
- 将HTML文件中的表单提交到PHP文件,并以相同的HTML显示结果
- 2表单提交显示相同的AJAX结果
- 在跨域表单提交和处理结果方面需要帮助
- 如何使用jQuery表单插件获取表单提交结果
- 由于异步表单提交,结果不一致
- html表单提交不会在元素中永久显示javascript的结果
- Javascript表单提交没有'不能给出正确的结果
- 返回表单提交的结果从 PHP 到 JavaScript,区分成功和失败
- 在新选项卡或窗口显示表单提交的结果
- 如何在表单提交后停止重定向到API调用结果
- 如何使表单提交返回指定的结果使用AJAX &JSON
- 使用AJAX显示表单提交结果