如何确保在导航到另一个页面之前完全执行某个功能?

时间:2012-05-07 10:08:24

标签: javascript jquery asp.net

我正在使用网络服务删除某些记录。 jquery ajax请求是在超链接的onclick中编写的。当我使用firebug逐行执行脚本时,它会被删除,否则它就不会被删除。以前有没有遇到过这样的情况?请帮忙

代码示例:

 $(".target").click(function() { 
            func();  //This function should be executed completely before navigating to another page
        });


 var func = function() {
            var items = $("#flag").find('td input.itemClass');
            id = items[0].value;
            var status = items[1].value;
            var type = items[2].value;
            var params = '{' +
                            'ID:"' + id + '" ,Type:"' + type + '" ,Status:"' + status + '"}';
            $.ajax({
                type: "POST",
                url: "WebMethodService.asmx/DeleteItem",
                data: params,
                //contentType: "plain/text",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                    $("#deleteNotificationMessage").val("Item has been removed"); // keep a separate label to display this message
                }

                //Event that'll be fired on Success

            });


    }

3 个答案:

答案 0 :(得分:3)

jQuery ajax函数返回延迟对象,因此我们return $.ajax。然后你应该使用deferred。done来在AJAX完全完成时执行回调。当AJAX为done时,请使用JS导航:

var func = function() {
    ...
    return $.ajax({...});                   //return our ajax deferred
}

$(".target").click(function() { 
    var target = this;                      //preserve "this" since this in the callback may be different 
    func().done(function(){                 //our done callback executed when ajax is done
        window.location.href = target.href; //assuming .target is a link
    });
    return false;                           //prevent the natural click action
});

答案 1 :(得分:0)

您可以在等待其完成通话的ajax呼叫上使用async: false

var func = function() {
            var items = $("#flag").find('td input.itemClass');
            id = items[0].value;
            var status = items[1].value;
            var type = items[2].value;
            var params = '{' +
                            'ID:"' + id + '" ,Type:"' + type + '" ,Status:"' + status + '"}';
            $.ajax({
                type: "POST",
                async: false,
                url: "WebMethodService.asmx/DeleteItem",
                data: params,
                //contentType: "plain/text",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                    $("#deleteNotificationMessage").val("Item has been removed"); // keep a separate label to display this message
                }

                //Event that'll be fired on Success

            });
    }

备选方案,您可以在请求后进行提交。

$(".target").click(function() { 
            func();  //This function should be executed completely before navigating to another page
            return false;
        });

var func = function() {
            var items = $("#flag").find('td input.itemClass');
            id = items[0].value;
            var status = items[1].value;
            var type = items[2].value;
            var params = '{' +
                            'ID:"' + id + '" ,Type:"' + type + '" ,Status:"' + status + '"}';
            $.ajax({
                type: "POST",
                async: true,
                url: "WebMethodService.asmx/DeleteItem",
                data: params,
                //contentType: "plain/text",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                    $("#deleteNotificationMessage").val("Item has been removed"); // keep a separate label to display this message
                    $("#YourFormID").submit();
                }

                //Event that'll be fired on Success

            });

    }

答案 2 :(得分:0)

只需将事件移动到ajax请求中的“success”处理程序:

 $.ajax({
            type: "POST",
            url: "WebMethodService.asmx/DeleteItem",
            data: params,
            //contentType: "plain/text",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                $("#deleteNotificationMessage").val("Item has been removed");
                //Event that'll be fired on Success
            }              

        });

或者使用jQuery ajax回调方法。