Почему функция запускается, когда элементы не найдены? - PullRequest
1 голос
/ 12 марта 2009

У меня есть следующий код, однако, если input.formdate не найден, он все равно будет запускать функцию getDateFormat. Это не имеет смысла для меня.

Кто-нибудь знает причину?

$(function() {
    $("input.formdate").datepicker({
        changeMonth: true,
        changeYear: true,
        dateFormat: getDateFormat()
    });
});

function getDateFormat()
{
    var format = 'DMY';

    if (document.edit_form && document.edit_form.date_format)
        format = document.edit_form.date_format.value;

    if (format = "DMY")
        return "dd-mm-yy";
    else
        return "mm-dd-yy";
}

Ответы [ 2 ]

6 голосов
/ 12 марта 2009

Старый ответ:
(на основе неправильного понимания вопроса - см. Комментарии)
Потому что вы вызываете функцию и передаете ее результат вместо того, что вы должны делать: передавать ссылку на функцию (то есть обрабатывать ее как переменную).

Сделайте это:

$(function() {
    $("input.formdate").datepicker({
        changeMonth: true,
        changeYear: true,
        dateFormat: getDateFormat
    });
});
<Ч />

Обновление:
После проверки API DatePicker пользовательского интерфейса jQuery необходимо передать строку в dateFormat.
Если вы не хотите, чтобы ваша функция выполнялась, если нет хотя бы одного ввода с классом formdate, вам нужно сделать это:

if ( $('input.formdate').length > 0 )
{
    $("input.formdate").datepicker
    (
        { changeMonth: true
        , changeYear: true
        , dateFormat: getDateFormat()
        }
    );
}

В качестве альтернативы, вы можете сделать это с помощью inline, если:

$("input.formdate").datepicker
(
    { changeMonth: true
    , changeYear: true
    , dateFormat:
        $('input.formdate').length > 0 ? getDateFormat() : 'dd-mm-yy'
    }
);

Хотя это спорно, если это более или менее читаемыми.


(Вероятно, есть еще более короткий путь, но мне нужно идти.)

5 голосов
/ 12 марта 2009

Функция getDateFormat запускается, как только Javascript анализируется, поскольку он находится в литеральной записи объекта.

Ваше выражение оценивается как

$(function() {
    $("input.formdate").datepicker({
        changeMonth: true,
        changeYear: true,
        dateFormat: <RESULT_FROM_CALLING_getDateFormat()>
    });
});
...