【问题标题】:Dojo ajax call returns before Java code completes?在Java代码完成之前Dojo ajax调用返回?
【发布时间】:2012-10-25 16:17:16
【问题描述】:

我继承的 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,但将其更新到最新版本并没有解决问题。

谁能解释这种行为并告诉我如何解决这个问题?

【问题讨论】:

  • 如果您在选项卡中打开请求会发生什么?
  • @mschr 不确定你的意思。你能澄清一下吗?
  • 在开发者工具中右键状态=取消行,选择'在新标签中打开链接'
  • 整洁!没想到我能做到。我在期望空字符串变量(通常由 Struts2 框架设置)的代码中得到一个空指针错误
  • @mschr 当然,我似乎无法复制我之前评论中记录的行为。今天早上我尝试在新选项卡中打开请求时,应用程序现在将我重定向到另一个页面,因为它在会话中找不到它期望的内容。

标签: java javascript ajax google-chrome dojo


【解决方案1】:

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

  1. chrome 中的一个错误(不太可能)
  2. 您调用的 struts 页面中的一个错误,可能会发回一个奇怪的 HTTP 响应(检查服务器日志)
  3. 在表单提交中存在“抖动”,其中发送了多个请求。我猜,但也许 &lt;button type="submit"&lt;input type="submit" 在 chrome 中的处理方式不同

您在重定向到不同页面时遇到的情况可能是由于当您手动刷新新选项卡中的 URL 字段时 Struts 应用程序接收到 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 有一个可覆盖的函数“onClick”,请注意 camelCasing。您正在设置 DOM onclick 事件。在这种情况下,您的点击事件可能会在 dojo.xhr 触发后(函数返回时)立即由浏览器处理。看这个Q: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>

【讨论】:

  • return false; 添加到 onClick 代码为我解决了这个问题。感谢您的详尽回答。
  • 干杯 :) 起初让我失望,bcuz 表单提交按钮重新加载页面并通常重置开发者网络选项卡内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多