Почему jQuery не принимает мой # ID из массива?


Я пытаюсь добавить 3 datepickers в 3 из моих полей ввода, поэтому я повторяю следующий код:

Это работает:

jQuery(function(){
    jQuery("#newnessdate").datepicker({
        dateFormat: 'yy-mm-dd',
        monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
        dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag','Samstag'],
        dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
    });
});

jQuery(function(){
    jQuery("#availabilitydate").datepicker({
        dateFormat: 'yy-mm-dd',
        monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
        dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag','Samstag'],
        dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
    });
});

jQuery(function(){
    jQuery("#expirydate").datepicker({
        dateFormat: 'yy-mm-dd',
        monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
        dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag','Samstag'],
        dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
    });
});

Это не означает:

var dateIds = [
    "#newnessdate", 
    "#availabilitydate",
    "#expirydate"
];

for (var i = 0; i < dateIds.length; i++)
{
    jQuery(function(){
        jQuery(dateIds[i]).datepicker({
            dateFormat: 'yy-mm-dd',
            monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
            dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag','Samstag'],
            dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
        });
    });
}

Я много тестировал его и не понимаю, почему он не работает, но в строке

jQuery(dateIds[i]).datepicker({

Похоже, что функция jQuery не принимает строки из массива в качестве строк. Вы не могли бы мне помочь?

4 3

4 ответа:

$("#newnessdate, #availabilitydate, #expirydate").datepicker({
            dateFormat: \'yy-mm-dd\',
            monthNames: [\'Januar\',\'Februar\',\'März\',\'April\',\'Mai\',\'Juni\',\'Juli\',\'August\',\'September\',\'Oktober\',\'November\',\'Dezember\'],
            dayNames: [\'Sonntag\', \'Montag\', \'Dienstag\', \'Mittwoch\', \'Donnerstag\', \'Freitag\',\'Samstag\'],
            dayNamesMin: [\'So\', \'Mo\', \'Di\', \'Mi\', \'Do\', \'Fr\', \'Sa\']
        });
    });
}

Проблема заключается в том, что цикл завершается, когда вызывается обратный вызов, и значение i является значением конца цикла.

Простое исправление (с дополнительным преимуществом не умножать вызовы на $.ready) :

jQuery(function(){
    for (var i = 0; i < dateIds.length; i++)
    {
            jQuery(dateIds[i]).datepicker({
                dateFormat: \'yy-mm-dd\',
                monthNames: [\'Januar\',\'Februar\',\'März\',\'April\',\'Mai\',\'Juni\',\'Juli\',\'August\',\'September\',\'Oktober\',\'November\',\'Dezember\'],
                dayNames: [\'Sonntag\', \'Montag\', \'Dienstag\', \'Mittwoch\', \'Donnerstag\', \'Freitag\',\'Samstag\'],
                dayNamesMin: [\'So\', \'Mo\', \'Di\', \'Mi\', \'Do\', \'Fr\', \'Sa\']
            });
        }
    }
);

Демо

var dateIds = [
    "#newnessdate", 
    "#availabilitydate",
    "#expirydate"
];

var options = {
    dateFormat: 'yy-mm-dd',
    monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
    dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag','Samstag'],
    dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
};

$.each(dateIds, function(k, v) {
    $(v).datepicker(options); 
});

Согласно документации "jQuery (callback) "является аналогом" jQuery(document).готов (обратный вызов)". Вы теряете контекст (итератор цикла "i"), поэтому лучше сделать это так:

jQuery(function(){
    var dateIds = [
        "#newnessdate", 
        "#availabilitydate",
        "#expirydate"
    ];

    for (var i = 0; i < dateIds.length; i++)
    {
        jQuery(dateIds[i]).datepicker({
            .......
        });
    }
});

Это сохраняет контекст цикла и предотвращает создание нескольких слушателей события (документ готов). Если вам нужен доступ к массиву данных из глобального контекста, просто поместите его вне функции обратного вызова, но использование глобального контекста для хранения данных-плохая практика.