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がハングし、それ自体のためにより多くのメモリを消費しました...)

何か提案はありますか?

よろしく、

Akke

編集:

私はこの問題に対して別のアプローチを選びました。他の誰かが彼のアプローチを選んだ場合に備えて、私は最も近い解決策を答えとしてマークしました。皆さん、ありがとうございました!

4

2 に答える 2

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 に答える
1

ループがロックされている間は使用できません。

関数を 2 つの部分に分割する必要があります。最初の部分はダイアログを呼び出す前のコードで、2 番目の部分はダイアログの後の部分です。ダイアログ ボタンをクリックすると、2 番目の関数が呼び出されます。

コードを同期する必要がある場合は、運が悪く、見苦しい window.prompt で立ち往生しています。

于 2012-06-06T15:07:45.413 に答える