7

可能的解决方案

各位程序员,您好!

我写信给你是为了请求一些我最近遇到的问题的帮助。问题如下:

1) 我有一个 ajax 请求,用 jQuery 实现。

2) 在返回成功响应后,脚本应该重新加载相应更改的页面,如果有任何验证错误,则将它们插入隐藏字段之后,用于存储非关键杂项数据。如果有任何验证错误,则不会保存更改,页面只是重新加载验证错误消息。验证本身由 servlet 负责。

3) 我注意到在实际附加错误消息之前出现任何类型的 alert() 时一切正常,但我不希望有这样的警报。

这是 JavaScript 代码:

$('#randomFormElement').submit(function() {
        $(this).ajaxSubmit({
            success: function (data, status) {
                randomFunctionToReloadThePage(arg1, arg2, arg3);
                var errors = $(data).find('.classNameOfTheErrors').xml();
                //alert(something);
                $(errors).insertAfter('#idOfTheHiddenField');
            },
            error: function (jqXHR, textStatus, thrownError) {
            //Error handling if the ajax response fails.
            }
         });
});

所以,主要的问题是:alert() 让它工作的原因是什么?

===========================

在 Chrome 上,这两种方法都不起作用。

在 FF 上,它仅在存在一些 alert() 时才起作用。

提前致谢!

4

5 回答 5

5

alert()函数阻止代码执行并延迟其底部的javascript代码的处理。这可以让 ajax 请求有时间完成。

于 2013-07-31T07:56:24.450 回答
3

这不是一个答案,而是一个调试提示(无法在注释中进行正确的代码格式化)。

在之后添加这两个调用alert()

console.log( "errors:", errors );
console.log( "hidden:", $('#idOfTheHiddenField')[0] );

将警报注释掉并运行它。它在开发者控制台中显示什么?

然后为了比较,取消注释警报,使其在这两个调用之前运行,并在 Firefox 中运行。现在控制台中有什么?

于 2013-07-31T09:08:31.833 回答
2

感谢大家的回答,特别是 gvee 的回答,我设法让它工作。显然,randomFunctionToReloadThePage() 中确实发生了一些异步操作,我设法使用.ajaxStop() 方法修复了它。

编辑:使用 ajaxStop() 时发现了第二个错误。我发现工作正常的解决方案如下:

1) 向 randomFunctionToReloadThePage 添加一个额外的参数

2) 在相应页面中使用该额外参数调用该函数。

于 2013-07-31T13:55:15.340 回答
1

尝试添加:缓存:false

$('#randomFormElement').submit(function() {
    $(this).ajaxSubmit({
        cache: false,
        success: function (data, status) {
            randomFunctionToReloadThePage(arg1, arg2, arg3);
            var errors = $(data).find('.classNameOfTheErrors').xml();
            //alert(something);
            $(errors).insertAfter('#idOfTheHiddenField');
        },
        error: function (jqXHR, textStatus, thrownError) {
        //Error handling if the ajax response fails.
        }
     });

});

于 2013-07-31T08:38:01.893 回答
0

它也发生在我身上。我们的代码中不能有警报。 Settimeout功能解决了我的问题。用函数替换“警报”,"setTimeOut"并在其中添加其余代码。

setTimeout(function(){ //your code here }, 300);
于 2019-10-29T07:12:36.807 回答