1

フォームのドロップダウン リストを JavaScript で生成しました。ただし、フォームを投稿すると、ドロップダウン リストの値が null になります。リストから別のオプションを選択しても、デフォルトにすることはできません。これが私のPHPです:

    $BirthDays = ($_POST['Days']);
    $BirthMonths = ($_POST['Months']);
    $BirthYears = ($_POST['Years']);

そして、これはJavaScriptです:

    function runcalender() {
        var calendar = [
            ["January", 31],
            ["February", 28],
            ["March", 31],
            ["April", 30],
            ["May", 31],
            ["June", 30],
            ["July", 31],
            ["August", 31],
            ["September", 30],
            ["October", 31],
            ["November", 30],
            ["December", 31]
            ],
            cont = document.getElementById('calender');
        //set variables for calender
        var sel_year = document.createElement('select'),
            sel_month = document.createElement('select'),
            sel_day = document.createElement('select');
            sel_year.setAttribute("id", "Years");
            sel_month.setAttribute("id", "Months");
            sel_day.setAttribute("id", "Days");
            sel_year.setAttribute("name", "Years");
            sel_month.setAttribute("name", "Months");
            sel_day.setAttribute("name", "Days");
        function createOption(txt, val) {
            var option = document.createElement('option');
            option.value = val;
            option.appendChild(document.createTextNode(txt));
            return option;
        }

        function clearChildren(ele) {
            while (ele.hasChildNodes()) {
                ele.removeChild(ele.lastChild);
            }
        }

        function recalculateDays() {
            var month_index = sel_month.value,
                df = document.createDocumentFragment();
            for (var i = 0, l = calendar[month_index][1]; i < l; i++) {
                df.appendChild(createOption(i + 1, i));
            }
            clearChildren(sel_day);
            sel_day.appendChild(df);
        }

        function generateMonths() {
            var df = document.createDocumentFragment();
            calendar.forEach(function(info, i) {
                df.appendChild(createOption(info[0], i));
            });
            clearChildren(sel_month);
            sel_month.appendChild(df);
        }

        function generateYears(){
            var dateForYear = new Date();
            var x = dateForYear.getFullYear();
            var y = x - 100;
            var df = document.createDocumentFragment();
            for (i = x; i >= y; i--){
                df.appendChild(createOption(i, i));
            }
            clearChildren(sel_year);
            sel_year.appendChild(df);
        }

        sel_month.onchange = recalculateDays;

        generateMonths();
        recalculateDays();
        generateYears();

        cont.appendChild(sel_day);
        cont.appendChild(sel_month);
        cont.appendChild(sel_year);
    }

PHPが結果を認識するために手動で結果を選択するには、javascriptを取得する必要がありますか?

4

1 に答える 1

2

PHP が POST された変数を受け取っていることを意味していると思いますが、ドロップダウン リストには選択した結果が表示されていません。

その場合 (そして、ページの読み込み時に JS を介して HTML をレンダリングしているため)、選択された結果であることを示すために、PHP が JavaScript に情報を提供する必要があります。以下を提案します。関数を編集createOption...

function createOption(txt, val, isSelected) {
    var option = document.createElement('option');
    option.value = val;
    if(isSelected) option.selected = 'selected'
    option.appendChild(document.createTextNode(txt));
    return option;
}

次に、POST された変数の値を読み取る Javascript をページに書き込みます。これが機能するには、ページが *.php である必要があります (サーバーの構成によって異なります)。

<script language='text/javascript'>
   //Don't forget to sanitize your data, I won't cover that here...
   var postDays = <?php print $_POST['Days']; ?>;
   var postMonths = <?php print $_POST['Months']; ?>;
   var postYears = <?php print $_POST['Years']; ?>;
</script>

最後に、関数を実行するときにcreateOption、ブールisSelected値 (true または false) を指定して、値 ( createOption()「val」パラメーター) と新しい関連する JS 変数 (postDaysたとえば) を比較します。val一致する場合はpostDaystrue、そうでない場合は false を指定します。

また、jQuery の学習を強くお勧めします。おそらく、同じコード ブロックを 4 分の 1 の時間で記述できたはずです。あなたがやろうとしていることを自動化するための多くの機能があります。

于 2013-10-17T04:16:27.510 に答える