在Java代码完成之前,Dojo ajax调用会返回吗?

时间:2012-10-25 16:17:16

标签: java javascript ajax google-chrome dojo

我对我继承的Struts2 + dojo Web应用程序有疑问。该应用程序适用于IE9和Firefox,但在Chrome中无效。

这是提交按钮代码:

<button dojoType="dijit.form.Button" 
        type="submit" 
        onclick="sendRuleForm('requestSubmitForm', 'resultDiv', 'RequestSubmit.action');">Submit</button>

以下是sendRuleForm函数的javascript代码:

function sendRuleForm(formId, id, actionNm) {
    var bindArgs = {
        url: actionNm,
        form: document.getElementById(formId),
        handleAs: "text",
        load: function(data) {
            document.getElementById(id).innerHTML = data;            
        },
        error: function(data) {
            alert(data);
            return;
        }
    }
    dojo.xhrPost(bindArgs);
    document.getElementById(id).innerHTML = ajaxLoader;
}

我注意到,如果我在我的Java代码中设置了断点,那么即使操作完成,网页也会返回错误,甚至

Chrome开发者工具指示已取消操作/请求的状态(What does status=canceled for a resource mean in Chrome Developer Tools?

我使用的是旧版本的dojo 1.3.1,但将其更新到最新版本并没有解决问题。

任何人都可以解释这种行为,让我知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以排除此错误的ajax / javascript位。它要么是

  1. Chrome中的错误(不太可能)
  2. 你正在调用的struts页面中的一个错误,可能会发回一个奇怪的HTTP响应(检查服务器日志)
  3. 有一个&#39;抖动&#39;在表单提交中,发送多个请求。即时猜测,但在Chrome
  4. 中处理<button type="submit"<input type="submit"的方式可能不同

    您在重定向到其他页面时遇到的问题可能是由于Struts应用程序在您手动刷新新选项卡中的URL字段时收到GET。也可能是由于缺少登录cookie等原因。

    要从应用程序获得真实的回复,请尝试使用target添加form属性,然后以正常方式提交(不使用XHR)。

    <form action="RequestSubmit.action" method="POST" target="_debugwin">
        <input type="submit" value="DebugSubmit" name="debugbutton" />
         ... remainder of form code
    

    另外,你的dijit Button有一个可覆盖的功能&#39; onClick&#39;,请注意camelCasing。您正在设置DOM onclick事件。在这种情况下,在dojo.xhr触发后(当函数返回时),您可以立即通过浏览器处理click事件。请参阅此问:Preventing form submission with Dojo

    然而,只有这样才能成为这种情况 - 同时你会看到“已取消”这样的情况。如果在(i)帧中加载表单,则调试窗口中的错误。否则整页将刷新,网络监控将重置。作为一种简单,双赢的解决方法,请按如下方式调整onclick属性:

    <button dojoType="dijit.form.Button" 
            type="submit" 
            onClick="sendRuleForm('requestSubmitForm', 'resultDiv', 'RequestSubmit.action'); /* NOTE */ return false;">Submit</button>