TLDR :onreadystatechange
事件是否可以在不冻结浏览器的情况下以其他方式模拟同步请求,因为它不会在Firefox中被触发?
~~~~~
我创建了一个需要验证的网络表单,并在实际提交之前从服务器获取一些元素。
我现在做的是'onsubmit'
我向我的服务器发出ajax请求,发送表单详细信息,解析服务器端,并向表单返回一个唯一的验证号和md5哈希。
它的工作方式是表格应该收到答复,然后继续提交表格。我必须注意,实际的表单提交是没有ajax的正常POST
提交 - 表单被发布到我无法控制的服务器上。
我想我需要做一个同步的ajax请求 - 不是异步的,因为它经常用于。关键是在收到回复之前永远不应该提交表单,因为它会失败,因为回复包含了另一方的服务器将要查找的重要字段。
我测试了Chrome,一切似乎都能正常处理同步请求。我做了请求,onreadystatechange
我解雇了处理程序来解析回复。
但Firefox不会在同步请求中触发onreadystatechange
事件。这种行为来自版本1.5或其他东西。
正如我所见,大多数人都会在某个时刻运行处理程序 - 因为收到了响应并且在DOM(responseText)中,只有onreadystatechange
事件才会被触发。
但是这对我不起作用:根据我运行代码的位置,响应可能还没有,所以解析它会失败。
我尝试了两种解决方案,两者都很糟糕:
这两个当然会导致Firefox冻结很长一段时间,因为Javascript在while
循环中等待。最后它工作正常,如果Firefox的防冻保护没有启动并说该页面上的脚本没有响应。
你会建议什么?我可以在不冻结浏览器的情况下进行while循环吗?也许是一个轮询的东西,它不会像while循环一样每毫秒轮询,但是每1秒就可以说,所以脚本不会冻结?
答案 0 :(得分:1)
如果您的请求是同步的,那么一旦send()调用返回,则回复完全可用。这就是同步请求的重点。在这种情况下,为什么你需要进行任何类型的循环?
答案 1 :(得分:0)
我对您使用拆分验证方法的原因感到有点困惑。典型案例通常更多的是:
但是,您不需要同步AJAX请求来获得所需内容。您需要做的就是在AJAX验证发生时取消onsubmit
事件,然后在从服务器获得响应后手动提交表单。因此,您可以将表单设置为:
<form id="myForm" onsubmit="doAjaxValidation(); return false;">
<!-- input fields, etc. -->
</form>
...然后您的响应处理程序可能会执行以下操作:
//check the response to make sure everything was valid, add required data to the form, etc.
if (validationWasSuccessful) {
//validation successful, submit the form
document.getElementById("myForm").submit();
}
请注意,在处理验证时,您很可能希望禁用表单中的所有输入字段。否则,如果您的服务器由于某种原因而处于缓慢的一天并且验证需要10秒,那么用户可能会在验证时更改表单中的数据,从而导致后续表单提交失败。另请注意,即使您停用表单,仍然无法阻止确定的用户使用Chrome的JavaScript控制台等功能来在验证阶段编辑字段值。
如果您能找到某种方法来摆脱拆分验证和提交方法,那么这两个问题都会消失。而且您的工作流程也变得更加高效。往返服务器的往返费用很高。