Javascript 没有警报框,AJAX无法工作

Javascript 没有警报框,AJAX无法工作,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在尝试使用以下代码: $('#form1').on('submit', function(){ var txtItemCode = $('#txtItemCode').val(); $.post("userExist.php", { txtItemCode: txtItemCode, }, function(data,status){ //alert("Data: " + data + "\nStatus: " + status);

我正在尝试使用以下代码:

$('#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,但是当我删除
警报时,它就不再工作了。这是为什么?我该如何使其工作?

在您的代码中,ajax调用是异步工作的,因此无论您是否得到响应,都将执行下一行。在同步呼叫中,在得到响应之前,不会执行下一行。 您可以从$.post转换为$.ajax,并将async属性设置为false。然后,您将能够获得,然后在响应ajax调用之后,您可以获得“reply”的值

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

在您的代码中,ajax调用是异步工作的,因此无论您是否得到响应,下一行都将被执行。在同步呼叫中,在得到响应之前,不会执行下一行。 您可以从$.post转换为$.ajax,并将async属性设置为false。然后,您将能够获得,然后在响应ajax调用之后,您可以获得“reply”的值

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

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

您没有得到正确的值,因为当post请求完成并执行回调时,您的javascript已经完成了执行

您在这里有几个选项:

  • 声明一个全局变量并执行一个同步调用,您可以使用代码ABC POST来执行,也可以在POST调用之前调用
    $.ajaxSetup({async:false})
    。将返回值分配给全局变量,并根据该值进行验证
  • 使用jQuery的ajaxStop:
    $(document).ajaxStop(函数(){//在这里检查您的值,仍然需要声明一个全局})
  • 将该值作为属性写入DOM中的任意位置的隐藏div/中,并使用计时器定期检查该值,直到有值为止

  • 引入警报时它工作的原因是它停止执行,并为异步调用提供足够的时间来完成

    您没有得到正确的值,因为当post请求完成并执行回调时,您的javascript已经完成了执行

    您在这里有几个选项:

  • 声明一个全局变量并执行一个同步调用,您可以使用代码ABC POST来执行,也可以在POST调用之前调用
    $.ajaxSetup({async:false})
    。将返回值分配给全局变量,并根据该值进行验证
  • 使用jQuery的ajaxStop:
    $(document).ajaxStop(函数(){//在这里检查您的值,仍然需要声明一个全局})
  • 将该值作为属性写入DOM中的任意位置的隐藏div/中,并使用计时器定期检查该值,直到有值为止

  • 我有了新的想法,请检查一下

    /**
     * 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;
    }
    

    注意:您可以交换结果的值并进行检查。

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

    /**
     * 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;
    }
    


    注意:您可以交换result的值并进行检查。

    如果它是同步的,它会起作用,但这是一种糟糕的用户体验。另一种方法是您应该重新构建代码。使用Ajax的done功能我相信这是正确的答案,如果你认为这是一个糟糕的用户体验,你可以在发送之前使用
    告诉人们它仍在传输,然后删除它使用
    完成
    @5-T:No;同步AJAX队列阻塞UI线程。如果在发送之前在
    中添加一个元素,然后执行同步AJAX调用,然后将其删除,那么该元素将永远不会显示;您从未释放UI线程以允许它重新绘制页面。如果它是同步的,它会工作,但这是一种糟糕的用户体验。另一种方法是您应该重新构建代码。使用Ajax的done功能我相信这是正确的答案,如果你认为这是一个糟糕的用户体验,你可以在发送之前使用
    告诉人们它仍在传输,然后删除它使用
    完成
    @5-T:No;同步AJAX队列阻塞UI线程。如果在发送之前在
    中添加一个元素,然后执行同步AJAX调用,然后将其删除,那么该元素将永远不会显示;您从未发布过UI线程以允许它重新绘制页面。如果您向JSFIDLE发布一个完整的示例,这将非常好,我们确实需要更多的信息,但您应该现在就在线程中获得所有信息。请查看以下问题:,尤其是此答案:。你在这里得到的所有答案都不如我。如果你在JSFIDLE上发布了一个完整的示例,那就太好了,我们确实需要更多的信息,但是你现在应该在线程中有你所知道的所有信息。看看这个问题:,尤其是这个答案:。您在这里得到的所有答案都不如我。我认为JavaScript引擎会让AJAX事件处理程序在
    警报
    进行时被调用,这很奇怪。是的,它正在使用您的选项一,在POST调用之前添加$.ajaxSetup({async:false})。感谢所有初学者的帮助。我想JavaScript引擎会让AJAX事件处理程序在
    警报
    进行时被调用,这很奇怪。是的,它正在使用您的选项一,在POST调用之前添加$.ajaxSetup({async:false})。谢谢大家对初学者的帮助。这行不通。由于Ajax是异步的,
    checkExistence
    将始终返回
    true
    。是的,u是正确的。然后可以使用表单提交方法代替普通表单提交。这不起作用,你的结果还可以,但我需要提交带有数据的表单。结果为#状态,但表单未提交。两种情况下都可以使用ajax表单提交。使用jquery form submit()提交表单,而不是使用普通表单提交。这会帮你的,这行不通。由于Ajax是异步的,
    checkExistence
    将始终返回
    true
    。是的,u是正确的。然后可以使用表单提交方法代替普通表单提交。这不起作用,你的结果还可以,但我需要用d提交表单