Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery表单发送ajax_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript jquery表单发送ajax

Javascript jquery表单发送ajax,javascript,jquery,ajax,Javascript,Jquery,Ajax,在提交表单之前,我要运行以下验证脚本: function validateMyForm(){ var numberTo = $('.to').length $('.to').each(function(){ var product_id = $(this).closest('tr').find('input').get(0).id; var todate = $(this).val(); var from = $(this

在提交表单之前,我要运行以下验证脚本:

    function validateMyForm(){
    var numberTo = $('.to').length

    $('.to').each(function(){
        var product_id = $(this).closest('tr').find('input').get(0).id;
        var todate = $(this).val();
        var from = $(this).prev().prev().val();
        $.ajax({
            type: 'POST',
            url: myBaseUrl + 'Products/ajax_change_date',
            dataType: 'json',
            data: {
                id: product_id,
                todate: todate,
                from: from

            },
            success: function (data) {
                numberTo--;
            }
        });
    });

    while(numberTo != 0){

    }
    return true;
}
然而,当我运行这个程序时,firefox中会出现一个消息框,说它正在等待脚本完成

如何在保留ajax的同时避免这种情况?

使用:

while(numberTo != 0){

}
您创建无限循环,并且您的纸条停止执行。这就是为什么在Firefox上出现此错误

您需要有回调来检查
numberTo
变量

例如:

function validateMyForm(){
    var numberTo = $('.to').length;

    function checkNumberTo() {
        if( numberTo ===  0 ) {
            alert( 'AJAX Completed' );
            // here you should include your code to manually submit the form
        }
    }

    $('.to').each(function(){
        var product_id = $(this).closest('tr').find('input').get(0).id;
        var todate = $(this).val();
        var from = $(this).prev().prev().val();
        $.ajax({
            type: 'POST',
            url: myBaseUrl + 'Products/ajax_change_date',
            dataType: 'json',
            data: {
                id: product_id,
                todate: todate,
                from: from

            },
            success: function (data) {
                numberTo--;
                checkNumberTo()
            }
        });
    });
    return false;
}
使用:

您创建无限循环,并且您的纸条停止执行。这就是为什么在Firefox上出现此错误

您需要有回调来检查
numberTo
变量

例如:

function validateMyForm(){
    var numberTo = $('.to').length;

    function checkNumberTo() {
        if( numberTo ===  0 ) {
            alert( 'AJAX Completed' );
            // here you should include your code to manually submit the form
        }
    }

    $('.to').each(function(){
        var product_id = $(this).closest('tr').find('input').get(0).id;
        var todate = $(this).val();
        var from = $(this).prev().prev().val();
        $.ajax({
            type: 'POST',
            url: myBaseUrl + 'Products/ajax_change_date',
            dataType: 'json',
            data: {
                id: product_id,
                todate: todate,
                from: from

            },
            success: function (data) {
                numberTo--;
                checkNumberTo()
            }
        });
    });
    return false;
}

如果您想要一个更优雅的解决方案,您可能需要尝试promise库。 下面是一篇文章,介绍了使用回调的缺点及其解决方案-承诺。这篇文章很长,但值得一读

要了解这一新概念如何应用于您,您应该尝试研究Promise composition,这是我在Google上找到的第一篇关于这一点的文章:

var x=10;var promise1=Q($.ajax(…)。然后(函数(){ x=20;}); var promise2=Q($.ajax(…)。然后(函数(){ x=30;})

var groupPromise=Q.all([promise1(),promise2()) groupPromise.then(函数(结果){},console.error)//Kris Kowal的示例

承诺l和承诺2并行执行,人们不知道哪一个将首先实现。 以下是两个相关的promise库:


如果您想要更优雅的解决方案,您可能需要尝试promise库。 下面是一篇文章,介绍了使用回调的缺点及其解决方案-承诺。这篇文章很长,但值得一读

要了解这一新概念如何应用于您,您应该尝试研究Promise composition,这是我在Google上找到的第一篇关于这一点的文章:

var x=10;var promise1=Q($.ajax(…)。然后(函数(){ x=20;}); var promise2=Q($.ajax(…)。然后(函数(){ x=30;})

var groupPromise=Q.all([promise1(),promise2()) groupPromise.then(函数(结果){},console.error)//Kris Kowal的示例

承诺l和承诺2并行执行,人们不知道哪一个将首先实现。 以下是两个相关的promise库:


那么,我如何确保ajax已完成?您可以在回调函数中执行所需操作。@Marcrasmusen查看我的更新应答。那么我如何确保ajax已完成?您可以在回调函数中执行所需操作。@Marcrasmusen查看我的更新应答。您等不及异步操作完成了。Javascript是单线程的,因此当主线程处于循环中时,它从不执行回调。根据页面中的$('.to')数量,最终可能会出现许多Ajax请求,这可能会显著降低应用程序的速度。您可能希望将一些请求组合在一起以节省性能。您不能等待异步操作完成。Javascript是单线程的,因此当主线程处于循环中时,它从不执行回调。根据页面中的$('.to')数量,最终可能会出现许多Ajax请求,这可能会显著降低应用程序的速度。您可能希望将一些请求组合在一起以节省性能。