0

私はここでこれをあまりにも長い間見てきました。2つのフィールドで2セットの検証を使用しようとしています(両方の日付、検証はonblur、検証エンジンのデフォルトイベントで発生します)。

最初の一連の検証は常に行われ、ユーザーが有効な入力日付を持っていることを確認します。

2 番目の検証セットは、両方のフィールドの日付が正しい場合にのみ発生します。両方の日付セットに検索対象の有効な日付範囲があることを確認するためのチェックが実行されます。

しかし、私が現在atmに問題を抱えているのは2番目です。FuncCalls が何らかの理由で認識されません。私はドキュメントとソースを見てきましたが、これを行う適切な方法が正確に何であるか、または相互に依存するフィールドを処理するという点で、これを処理するより良い方法があるかどうかはまだわかりません.

<html>
    <head>
        <script src="../../inc/functions.js" type="text/javascript"></script>
        <script src="../../inc/jquery-min.js" type="text/javascript"></script>
        <script src="../../inc/jquery.validationEngine.js" type="text/javascript"></script>
        <script src="../../inc/jquery.validationEngine-en.js" type="text/javascript"></script>
        <link href="../../inc/validationEngine.jquery.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript">

        //returns true if end is later than start
            function dateCompare(start, end) {
                if (isDate(start) && isDate(end)) {
                    return (new Date(start.toString()) < new Date(end.toString()))
                }
            }

            $(document).ready(function () {
                $("#arbitraryForm").validationEngine('attach');

                function rangeCheck(field, rules, i, options) {
                    alert("rangeCheck caLLEd");
                    var inDate1 = $("#inDate1").val();
                    var inDate2 = $("#inDate2").val();

                    if (!dateCompare(inDate1, inDate2)) {
                        return "arbitarty error";
                    }
                }

                $("#inDate1").blur(function (e) {
                    var inDate1 = PadDate($("#inDate1").val());
                    var inDate2 = PadDate($("#inDate2").val());
                    if (isDate(inDate1)) {
                        document.getElementById("inDate1").value = inDate1;
                        if (isDate(inDate2)) {
                            if (dateCompare(inDate1, inDate2)) {

                            }
                        }
                    }
                }),

                $("#inDate2").blur(function (e) {

                    var inDate2 = PadDate($("#inDate2").val());
                    if (isDate(inDate2)) {
                        document.getElementById("inDate2").value = inDate2;
                    }
                })
            });
        </script>
    </head>
    <form id="arbitraryForm" action="whatever_page.html">
        <div>
            <input type="text" id="inDate1" name="inDate1"  value="" class="validate[required,custom[dateFormat],funcCall[rangeCheck]]" /> 
            <input type="text" id="inDate2" name="inDate1"  value="" class="validate[required,custom[dateFormat],funcCall[rangeCheck]]" /> 
        </div>
            <input id="subbtn" type="submit" value="Run Report" name="subbtn"/>
    </form>
</html>
4

2 に答える 2

2

本当に必要のない複雑さを追加していると思います(これはjQueryでよく起こるようです)。次のようなものを使用しないのはなぜですか:

        function rangeCheck() {
            alert("rangeCheck caLLEd");
            var inDate1 = $("#inDate1").val();
            var inDate2 = $("#inDate2").val();

            if (!dateCompare(inDate1, inDate2)) {
                //flag the error in the form here, if you want
                return false;
            }
            return true;
        }

        function blur1() {
            var inDate1 = PadDate($("#inDate1").val());
            var inDate2 = PadDate($("#inDate2").val());
            if (isDate(inDate1)) {
                document.getElementById("inDate1").value = inDate1;
                if (isDate(inDate2)) {
                    if (dateCompare(inDate1, inDate2)) {

                    }
                }
            }
        }

        function blur2() {
            var inDate2 = PadDate($("#inDate2").val());
            if (isDate(inDate2)) {
                document.getElementById("inDate2").value = inDate2;
            }
        }

<form id="arbitraryForm" action="whatever_page.html" onSubmit="return rangeCheck();">
    <div>
        <input type="text" id="inDate1" name="inDate1"  value="" onBlur="blur1();" /> 
        <input type="text" id="inDate2" name="inDate1"  value="" onBlur="blur2();" /> 
    </div>
        <input id="subbtn" type="submit" value="Run Report" name="subbtn"/>
</form>

...より短く、何をしているのかがより明確になります。

また、ブロックrangeCheck()内で名前付き関数 (この場合)を定義する必要はありません。document.ready必要に応じて可能ですが、そうする場合は、次のように明示的にグローバル スコープに割り当てることができます。

        window.rangeCheck = function(field, rules, i, options) {
            alert("rangeCheck caLLEd");
            var inDate1 = $("#inDate1").val();
            var inDate2 = $("#inDate2").val();

            if (!dateCompare(inDate1, inDate2)) {
                return "arbitarty error";
            }
        };
于 2011-04-12T23:32:55.313 に答える
2

関数をラッパーrangeCheckの外に移動します(たとえば、関数のすぐ下)。$(document).readydateCompare

メソッド内で宣言すると、$(document).readyそのスコープがそのメソッドに制限されます。

于 2011-04-12T23:21:21.537 に答える