0

我正在编写一些表单验证函数,由于灵活性,我决定使用 jQueryUI 来提示用户。

有一个小问题。我希望我的函数为我的错误报告系统返回一个由布尔值和字符串组成的数组。JQueryUI 对话框是异步的,这意味着浏览器不会像本机 prompt() 那样挂起并等待返回值。

这是一些示例代码:

验证器功能:

function verifyTOS_PVM_v2()
{
    verifyTOS_PVM_v2_callback = '';
    if(!empty($('#inputPVM').val())) {
        $('#inputPVM').val(date('d.m.Y', parseFinnishDate($('#inputPVM').val())));
        val = $('#inputPVM').val()
        date = parseFinnishDate($('#inputPVM').val());
        today = today();
        diff = Math.floor((date - today)/60/60/24);
        if(diff <= -14)
        {
            buttons = 
                [
                    {
                        text:"Kyllä",
                        click:function()
                        {
                            $(this).dialog('destroy');
                            verifyTOS_PVM_v2_callback = "Kyllä"
                        }
                    },
                    {
                        text:"Ei",
                        click:function()
                        {
                            $(this).dialog('destroy');
                            verifyTOS_PVM_v2_callback = "Ei"
                        }
                    }
                ]
            jQueryPrompt('Message', 'Koskien päivämäärää...', 400, buttons);
            while(verifyTOS_PVM_v2_callback != "Kyllä" && verifyTOS_PVM_v2_callback != "Ei")
            {
                setTimeout('i = i + 1', 50)
            }
            res = verifyTOS_PVM_v2_callback;
            if(res == "Kyllä")
            {
                error_occured = 2;
                error = 'Message'
            }
            else
            {
                error_occured = 1;
                error = 'Message'
            }
        }
    } else {
        error_occurred = 1;
        error = "Message";
    }
    reterr[0] = error_occurred;
    reterr[1] = error;
    return reterr;
}

提示功能:

function jQueryPrompt(msg, title, width, buttons)
{
    $('body').append('<div id="jQueryPromptHost"></div>');
    $('#jQueryPromptHost').append(msg);
    $('#jQueryPromptHost').dialog({
        title: title,
        resizable: false,
        width: width,
        daraggable: false,
        modal: true,
        buttons: buttons
    })
}

我曾尝试轮询一个变量,但失败得很惨(firefox 刚刚挂起并为自己占用了更多内存......)

你有什么建议吗?

问候,

阿克

编辑:

我选择了另一种方法来解决这个问题。我将最接近的解决方案标记为答案,以防其他人选择他的方法。谢谢你们!

4

2 回答 2

1

while 循环被锁定,你不能使用它。

将不得不将功能分成两部分。第一部分是调用对话框之前的代码,第二部分是对话框之后的部分。点击对话框按钮调用第二个函数。

如果代码必须是同步的,那么你有点不走运,并且卡在丑陋的 window.prompt 中。

于 2012-06-06T15:07:45.413 回答
1

在您的click事件处理程序中,只需调用一个函数而不是分配一个值。

buttons = [
    {
        text:"Kyllä",
        click: function() {
            $(this).dialog('destroy');
            handleButtonClick("Kyllä");
            //verifyTOS_PVM_v2_callback = "Kyllä"
        }
    },
    {
        text:"Ei",
        click: function() {
            $(this).dialog('destroy');
            handleButtonClick("Ei");
            //verifyTOS_PVM_v2_callback = "Ei"
        }
    }
]

//Somewhere else in the code
var handleButtonClick = function(value) {
    if (value == "Kyllä") {
        ...
    } else if (value == "Ei") {
        ...
    }
};
于 2012-06-07T02:17:44.860 回答