Проблемы с простой проверкой формы Javascript - PullRequest
0 голосов
/ 27 января 2012

Я работаю над созданием многостраничного набора форм, которые связаны между собой сеансом, и использую Javascript для проверки формы при отправке каждого раздела.Моя первая форма работает фантастически.Мой второй, не так много.Это динамически создаваемая форма, которая зависит от предыдущей формы от количества раскрывающихся списков (от 1 до 20), которые заполняются из базы данных.Я избавлю вас от всего кода запроса, чтобы создать массив, который заполняет мои выпадающие списки, и сразу перейти к сценарию проверки формы, а затем к самой форме.

Сценарий проверки из головы без тегов <script>:

function validateForm()
{
    var count = <?php echo $_SESSION['credits']; ?>;
    var i = 1;

    for (i = 1; i <= count; i++)
    {
        var j = i;
        for (j++; j <= count; j++)
        {
            var a = document.forms["addcredits"]["creditdropdown_"+i].value;
            var b = document.forms["addcredits"]["creditdropdown_"+j].value;
            if ((a == b) && (a != 0))
            {
                alert('Cannot select the same writer more than once.');
                return false;
            }           
        }
    } 

    var foundOne = false;
    var h = 1;

    while (h <= count && !foundOne)
    {
        if (document.forms["addcredits"]["creditdropdown_"+h].value != 0)
        {
            foundOne = true;
        }
        h++;
    }
    if (!foundOne)
    {
        alert('You must select at least one writer to credit.');
        return false;
    }
}

Код формы:

<form id="addcredits" class="appintro" method="post" action="recordcheck.php" onsubmit="return validateForm()">
<div class="form_description">
    <h2>Song Title Submission</h2>
    <p>Step 2: Select writing credits for song title</p>
</div>
<ul>
    <?php 
        for ($i = 1; $i <= $_SESSION['credits']; $i++)
        { ?>
    <li id="li_<?php echo $i; ?>">
        <label class="description" for="creditdropdown_<?php echo $i; ?>">Song Credit #<?php echo $i; ?>:</label>
        <select "creditdropdown_<?php echo $i; ?>">
            <option value="0">Select a writer</option>
            <?php foreach ($writers as $key => $writer) { ?>
                <option value="<?php echo $key; ?>"><?php echo $writer; ?></option>
            <?php } ?>
        </select>
        <p class="guidelines" id="guidelines_<?php echo $i; ?>">Writer not found in database? Add them <a href="" target="_blank">here</a>.</p>
    </li>
    <?php } ?>
    <li id="buttons">
        <input type="hidden" name="form_id" value="2">
        <input type="hidden" name="submit" value="1">
        <input id="nextButton" class="button_text" type="submit" name="submit" value="Next">
    </li>
</ul>
</form>

Ни одно из окон предупреждений не появляется, когда я нажимаю Далее, и если я вставляю случайные окна предупреждений об отладке в сценарий проверки,только те, которые мне удалось найти, были теми, которые я застрял в начале кода.Дальше я заставил их работать, это было первое назначение a после этого, даже отладчики не показывали.Я предполагаю, что я делаю что-то неправильно в назначении или что-то не так со значениями в раскрывающемся списке?В любом случае, я в тупике.

1 Ответ

0 голосов
/ 27 января 2012

Я бы сказал, что проблема в вашем HTML:

<select "creditdropdown_<?php echo $i; ?>"> 

Вы указываете, вероятно, атрибут name, но вы забыли часть name=.Попробуйте это:

<select name="creditdropdown_<?php echo $i; ?>">

В вашей функции проверки, когда вы попадете на эту строку:

var a = document.forms["addcredits"]["creditdropdown_"+i].value;

Вы обнаружите, что у вас есть ошибка, потому что document.forms["addcredits"]["creditdropdown_"+i] это undefined из-заотсутствующие name= в html и undefined не могут иметь свойства .value.

(Кстати, отладка с помощью alert() полезна очень иногда, новам гораздо лучше использовать встроенные инструменты разработчика в Chrome - просто нажмите (я думаю) ctrl-shift-J, чтобы получить консоль JS - или загрузите FireBug для Firefox. Или используйте панель инструментов разработчика IE. Используйте console.log() вместоalert() и / или пошагово просматривайте код, пока не найдете проблему.)

...