【问题标题】:AJAX not working without alert box [duplicate]AJAX 在没有警报框的情况下无法工作 [重复]
【发布时间】:2013-07-05 03:55:43
【问题描述】:

我正在尝试使用此代码:

$('#form1').on('submit', function(){
    var txtItemCode = $('#txtItemCode').val();
    $.post("userExist.php", {
        txtItemCode: txtItemCode,
    }, function(data,status){
        //alert("Data: " + data + "\nStatus: " + status);
        $('#status').html(data);    
        reply = data;
        //alert(reply);
    });
    alert('');
    if (reply=='OK'){
        return false;
    }
});

我需要检查data=="OK" 是否返回false,但是当我删除alert 时,它不再起作用。为什么会这样,我怎样才能让它发挥作用?

【问题讨论】:

标签: javascript jquery ajax


【解决方案1】:

在您引入警报时它起作用的原因是因为它会停止执行并为异步调用提供足够的时间来完成。

您没有得到正确的值,因为在发布请求完成并执行回调时,您的 javascript 已经完成执行。

你有几个选择:

  1. 声明一个全局变量并执行同步调用,您可以使用发布的代码 ABC 或在 POST 调用之前调用 $.ajaxSetup({ async: false })。将返回值分配给全局变量并对其进行验证。
  2. 使用jQuery的ajaxStop:$(document).ajaxStop(function() { //check your values here, still need to declare a global });
  3. 将值写入隐藏的 div/作为 DOM 中任何位置的属性,并有一个计时器定期检查它,直到有值为止。

【讨论】:

  • 我认为 JavaScript 引擎会允许在 alert 正在进行时调用 AJAX 事件处理程序,这很奇怪。
  • 是的,它与您的选项一一起使用,在 POST 调用之前添加 $.ajaxSetup({ async: false }) 。感谢所有帮助初学者。
【解决方案2】:

在您的代码中,ajax 调用是异步工作的,因此无论您是否得到响应,您的下一行都将被执行。在同步调用之前,您的下一行将不会被执行,直到您得到响应。 您可以从 $.post 变成 $.ajax 并使异步属性为 false。然后就可以get,然后ajax调用响应后就可以得到"reply"的值了。

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

【讨论】:

  • 如果它是同步的,它会工作,但它是一个糟糕的用户体验。
  • 另一种方法是你应该重构你的代码。并使用 ajax 的 done 功能
  • 这是正确的答案,我敢肯定,如果您认为这是一个糟糕的用户体验,您可以使用beforeSend 告诉人们它仍在传输,然后使用complete 将其删除跨度>
  • @5-T:不;同步 AJAX 队列会阻塞 UI 线程。如果在beforeSend 中添加一个元素,然后进行同步AJAX 调用,然后将其删除,则该元素永远不会出现;您从未释放 UI 线程以允许它重绘页面。
【解决方案3】:

我想到了一个新想法,请检查一下。

/**
 * form submit
 */
$('#form1').on('submit', function() {
    if (checkExistence()) {
        return false;
    }
});

/**
 * check existence in db
 * @returns {Boolean}
 */
function checkExistence() {
    var txtItemCode = $('#txtItemCode').val();
    var result = true;
    $.post("http://localhost/test.php", {
        txtItemCode: txtItemCode,
    }, function(data, status) {
        //alert("Data: " + data + "\nStatus: " + status);

        if (data == 'OK') {
            $('#status').html(data);
            result = true;
        } else {
            $('#txtItemCode').val('').focus();
            $('#status').html("Code is already existing, please provide another one:)")
            result = false;
        }
    });

    return result;
}

注意:你可以交换结果的值并检查。

【讨论】:

  • 这行不通。由于 Ajax 是异步的,checkExistence 将始终返回 true
  • 是的,你是对的。然后可以使用malsup.com/jquery/form表单提交方法代替普通的表单提交。
  • 这不行,你的结果没问题,但我需要提交带有数据的表单。结果到达#status,但表单未提交。
  • 在这两种情况下都可以使用 ajax 表单提交。使用 jquery 表单提交 (malsup.com/jquery/form) 提交表单而不是普通表单提交。这会帮助你。
猜你喜欢
  • 2012-12-21
  • 2014-07-11
  • 1970-01-01
  • 2016-06-16
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多