使用ajax同步请求验证html表单

时间:2011-07-02 12:45:17

标签: html ajax firefox synchronous

TLDR onreadystatechange事件是否可以在不冻结浏览器的情况下以其他方式模拟同步请求,因为它不会在Firefox中被触发?

~~~~~

我创建了一个需要验证的网络表单,并在实际提交之前从服务器获取一些元素。

我现在做的是'onsubmit'我向我的服务器发出ajax请求,发送表单详细信息,解析服务器端,并向表单返回一个唯一的验证号和md5哈希。

它的工作方式是表格应该收到答复,然后继续提交表格。我必须注意,实际的表单提交是没有ajax的正常POST提交 - 表单被发布到我无法控制的服务器上。

我想我需要做一个同步的ajax请求 - 不是异步的,因为它经常用于。关键是在收到回复之前永远不应该提交表单,因为它会失败,因为回复包含了另一方的服务器将要查找的重要字段。

我测试了Chrome,一切似乎都能正常处理同步请求。我做了请求,onreadystatechange我解雇了处理程序来解析回复。

但Firefox不会在同步请求中触发onreadystatechange事件。这种行为来自版本1.5或其他东西。

正如我所见,大多数人都会在某个时刻运行处理程序 - 因为收到了响应并且在DOM(responseText)中,只有onreadystatechange事件才会被触发。

但是这对我不起作用:根据我运行代码的位置,响应可能还没有,所以解析它会失败。

我尝试了两种解决方案,两者都很糟糕:

  • 使用同步请求,并将处理程序置于while循环中,等待回复。
  • 使用异步请求,并且有一段时间(myvariable);等到回复到达那里(myvariable是我在处理responseText后从服务器得到的回复。

这两个当然会导致Firefox冻结很长一段时间,因为Javascript在while循环中等待。最后它工作正常,如果Firefox的防冻保护没有启动并说该页面上的脚本没有响应。

你会建议什么?我可以在不冻结浏览器的情况下进行while循环吗?也许是一个轮询的东西,它不会像while循环一样每毫秒轮询,但是每1秒就可以说,所以脚本不会冻结?

2 个答案:

答案 0 :(得分:1)

如果您的请求是同步的,那么一旦send()调用返回,则回复完全可用。这就是同步请求的重点。在这种情况下,为什么你需要进行任何类型的循环?

答案 1 :(得分:0)

我对您使用拆分验证方法的原因感到有点困惑。典型案例通常更多的是:

  1. 使用一些JavaScript代码来捕获非常明显的错误(丢失/空字段等)。
  2. 如果没有明显错误,请提交表单。如果服务器端验证失败,则服务器将用户发送回相同的表单,并标记/解释错误。
  3. 但是,您不需要同步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控制台等功能来在验证阶段编辑字段值。

    如果您能找到某种方法来摆脱拆分验证和提交方法,那么这两个问题都会消失。而且您的工作流程也变得更加高效。往返服务器的往返费用很高。