如何让JQuery语句等到它完成后再继续?>

时间:2011-02-25 00:49:43

标签: javascript jquery jquery-ui

首先,我是Javascript / Jquery的新手,所以这可能是一个愚蠢的问题......

我正在使用JQuery UI集合中的对话框。我有一个按钮,当点击它时,它会显示一个确认框或一个警告框。我的代码如下......

            function checkfn() {

            if (document.getElementById('<%=HomeInstSelected.ClientID%>').value == 'False') {

                var dialogResult = false;

                $("#dialog-confirm").dialog({
                    resizable: false,
                    height: 140,
                    modal: true,
                    buttons: {
                        Continue: function () {
                            dialogResult = true;
                            $(this).dialog("close");

                        },
                        Cancel: function () {
                            $(this).dialog("close").slideUp();
                        }
                    }
                });

                // alert just debug code!
                alert(dialogResult);
                return dialogResult;

            }
            else {
                $("#dialog-HomeInstitutionPrompt").dialog({
                    height: 140,
                    modal: true
                });

            } 
        }

我的问题在于确认部分,似乎确认框没有等待我点击继续或取消 - 它只是直接进入警报部分并返回dialogResult = false。

在我运行$('#dialog-confirm')命令之前,是否可以暂停执行?

或者,是否可以在Continue函数中为checkfn()函数返回true?这样,我根本不需要dialogResult var吗?

4 个答案:

答案 0 :(得分:4)

之前我没有在jQuery UI中使用.dialog,但是,通常使用jQuery,函数是异步运行的。这意味着你需要将你想要的代码放在Continue函数中。

一种可能性是发送成功/取消功能以检查您是否可以通过“继续”和“取消”功能进行调用。

function checkfn(success, cancel) {

if (document.getElementById('<%=HomeInstSelected.ClientID%>').value == 'False') {

    var dialogResult = false;

    $("#dialog-confirm").dialog({
        resizable: false,
        height: 140,
        modal: true,
        buttons: {
            Continue: function () {
                if(success) success();
                $(this).dialog("close");

            },
            Cancel: function () {
                if(cancel) cancel();
                $(this).dialog("close").slideUp();
            }
        }
    });
}

你可以这样调用这个函数:

checkfn(function () {
    alert('success!');
}, function () {
    alert('failure!');
});

答案 1 :(得分:1)

只需在“继续”和“取消”按钮定义中输入您想要执行的操作即可。因此,您不需要dialogResult,并且在需要时会发出警报。

if (document.getElementById('<%=HomeInstSelected.ClientID%>').value == 'False') {

                var dialogResult = false;

                $("#dialog-confirm").dialog({
                    resizable: false,
                    height: 140,
                    modal: true,
                    buttons: {
                        Continue: function () {
                            alert('Dialog result is true. I can do whatever I want here');
                            $(this).dialog("close");

                        },
                        Cancel: function () {
                            alert('Cancel is clicked. I should go on my life');
                            $(this).dialog("close").slideUp();
                        }
                    }
                });
            }
            else {
                $("#dialog-HomeInstitutionPrompt").dialog({
                    height: 140,
                    modal: true
                });
            } 

- 您无法为函数返回值,因为在函数初始化之后,代码会继续。您需要填写继续按钮定义。

答案 2 :(得分:1)

这也是我在开始时遇到的问题,代码没有像在页面上读取的那样运行。当您调用对话框函数时,它将异步执行。 continue和cancel函数绑定到按钮上的单击操作,同时对话框函数下面的代码运行而不等待事件。

长话短说,结果需要在取消和继续回调中发生。

问题是当你真的应该传递结果函数时,你试图返回一个布尔值。 jquery和javascript中的很多东西一般都是这样工作的。值得庆幸的是,该语言提供了以这种方式编程的能力。

    function checkfn( resultfn(boolval) ) {

    if (document.getElementById('<%=HomeInstSelected.ClientID%>').value == 'False') {

        var dialogResult = false;

        $("#dialog-confirm").dialog({
            resizable: false,
            height: 140,
            modal: true,
            buttons: {
                Continue: function () {
                    resultfn.call( this, true );
                    $(this).dialog("close");

                },
                Cancel: function () {
                    resultfn.call( this, false );
                    $(this).dialog("close").slideUp();
                }
            }
        });

}

将if语句放在“resultfn”

答案 3 :(得分:0)

我有一个类似的令人沮丧的问题,即jQuery对话框在用户有机会选择是或否之前提交表单。

示例HTML:

<form id="myForm" method="POST" action="/Where/To/Go">
    <input type="submit" value="Submit" onclick="submitForm()"/>
</form>

和jQuery:

function submitForm() {
    $('<div title="Submit Form>Are you sure you wish to submit the form?</div>').dialog({
        modal: true,
        buttons: [
            {
                text: "Yes",
                click: function () {
                    $('#myForm').submit();
                    $(this).dialog("close");
                }
            }, {
                text: "No",
                click: function () {
                    $(this).dialog("close");
                }
            }
        ]
    });
}

要解决此问题,我将按钮从submit类型更改为button类型,这样就停止了它同时提交和触发jQuery对话框:

    <input type="button" value="Submit" onclick="submitForm()"/>