У меня есть элемент управления выбора даты jQuery, который отлично работает на один экземпляр экземпляра, но я не уверен, как заставить его работать для нескольких экземпляров.
<script type="text/javascript">
$(function() {
$('#my_date').datepicker();
});
</script>
<% Using Html.BeginForm()%>
<% For Each item In Model.MyRecords%>
<%=Html.TextBox("my_date")%> <br/>
<% Next%>
<% End Using%>
Без цикла For Each он работает нормально, но если в коллекции "MyRecords" есть более одного элемента, тогда только первое текстовое поле получает выбор даты (что имеет смысл, поскольку оно связано с идентификатором). Я попытался присвоить класс текстовому полю и указать:
$('.my_class').datepicker();
но пока отображается сборщик дат, все они обновляют первое текстовое поле.
Каков правильный способ сделать эту работу?
Ответ 1
HTML:
<input type="text" class="datepick" id="date_1" />
<input type="text" class="datepick" id="date_2" />
<input type="text" class="datepick" id="date_3" />
script:
$('.datepick').each(function(){
$(this).datepicker();
});
(псевдокодировано немного, чтобы упростить его)
Ответ 2
У меня была такая же проблема.
Правильный способ использования выбора даты - $('.my_class').datepicker();
, но вам нужно убедиться, что вы не назначаете один и тот же идентификатор нескольким фидапикам.
Ответ 3
Очевидным ответом будет генерация разных идентификаторов, отдельный идентификатор для каждого текстового поля, что-то вроде
[int i=0]
<% Using Html.BeginForm()%>
<% For Each item In Model.MyRecords%>
[i++]
<%=Html.TextBox("my_date[i]")%> <br/>
<% Next%>
<% End Using%>
Я не знаю ASP.net, поэтому я просто добавил общий код синтаксиса типа C в квадратных скобках. Перевод его в реальный код ASP.net не должен быть проблемой.
Затем вам нужно найти способ генерации как можно большего количества
$('#my_date[i]').datepicker();
в качестве элементов в Model.MyRecords
. Опять же, в квадратных скобках находится ваш счетчик, поэтому ваша функция jQuery будет выглядеть примерно так:
<script type="text/javascript">
$(function() {
$('#my_date1').datepicker();
$('#my_date2').datepicker();
$('#my_date3').datepicker();
...
});
</script>
Ответ 4
<html>
<head>
<!-- jQuery JS Includes -->
<script type="text/javascript" src="jquery/jquery-1.3.2.js"></script>
<script type="text/javascript" src="jquery/ui/ui.core.js"></script>
<script type="text/javascript" src="jquery/ui/ui.datepicker.js"></script>
<!-- jQuery CSS Includes -->
<link type="text/css" href="jquery/themes/base/ui.core.css" rel="stylesheet" />
<link type="text/css" href="jquery/themes/base/ui.datepicker.css" rel="stylesheet" />
<link type="text/css" href="jquery/themes/base/ui.theme.css" rel="stylesheet" />
<!-- Setup Datepicker -->
<script type="text/javascript"><!--
$(function() {
$('input').filter('.datepicker').datepicker({
changeMonth: true,
changeYear: true,
showOn: 'button',
buttonImage: 'jquery/images/calendar.gif',
buttonImageOnly: true
});
});
--></script>
</head>
<body>
<!-- Each input field needs a unique id, but all need to be datepicker -->
<p>Date 1: <input id="one" class="datepicker" type="text" readonly="true"></p>
<p>Date 2: <input id="two" class="datepicker" type="text" readonly="true"></p>
<p>Date 3: <input id="three" class="datepicker" type="text" readonly="true"></p>
</body>
</html>
Ответ 5
Существует простое решение.
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"> </script>
<script type="text/javascript" src="../js/jquery.min.js"></script>
<script type="text/javascript" src="../js/flexcroll.js"></script>
<script type="text/javascript" src="../js/jquery-ui-1.8.18.custom.min.js"></script>
<script type="text/javascript" src="../js/JScript.js"></script>
<title>calendar</title>
<script type="text/javascript">
$(function(){$('.dateTxt').datepicker(); });
</script>
</head>
<body>
<p>Date 1: <input id="one" class="dateTxt" type="text" ></p>
<p>Date 2: <input id="two" class="dateTxt" type="text" ></p>
<p>Date 3: <input id="three" class="dateTxt" type="text" ></p>
</body>
</html>
Ответ 6
При добавлении datepicker во время выполнения генерируемых входных текстовых полей вы должны проверить, содержит ли он уже datepicker, а затем сначала удалить класс hasDatepicker, а затем применить datePicker к нему.
function convertTxtToDate() {
$('.dateTxt').each(function () {
if ($(this).hasClass('hasDatepicker')) {
$(this).removeClass('hasDatepicker');
}
$(this).datepicker();
});
}
Ответ 7
Небольшое примечание к ответу SeanJA.
Интересно, что если вы используете KnockoutJS и jQuery вместе
следующие входы с разными идентификаторами, но с те же данные привязываются наблюдаемые:
<data-bind="value: first_dt" id="date_1" class="datepick" />
<data-bind="value: first_dt" id="date_2" class="datepick" />
свяжет один (тот же) datepicker с обоими входами (даже если они имеют разные идентификаторы или имена).
Используйте отдельные наблюдаемые в ViewModel для привязки отдельного параметра datepicker к каждому входу:
<data-bind="value: first_dt" id="date_1" class="datepick" />
<data-bind="value: second_dt" id="date_2" class="datepick" />
Инициализация:
$('.datepick').each(function(){
$(this).datepicker();
});
Ответ 8
Решение здесь состоит в том, чтобы иметь разные идентификаторы, как многие из вас заявили. Проблема все еще лежит глубже в datepicker. Пожалуйста, поправьте меня, но у datepicker нет одного идентификатора обертки - "ui-datepicker-div". Это видно на http://jqueryui.com/demos/datepicker/#option-showOptions в тематике.
Есть ли опция, которая может изменить этот идентификатор как класс? Я не хочу раскошеливать этот script только для этого очевидного исправления!
Ответ 9
Чтобы изменить использование класса вместо ID
<script type="text/javascript">
$(function() {
$('.my_date1').datepicker();
$('.my_date2').datepicker();
$('.my_date3').datepicker();
...
});
</script>
Ответ 10
У меня была такая же проблема, но, наконец, я обнаружил, что это проблема с тем, как я вызывал script из пользовательского элемента управления ASP. Я использовал ClientScript.RegisterStartupScript()
, но забыл дать script уникальный ключ (второй аргумент). С обоими сценариями назначается один и тот же ключ, только первый ящик фактически преобразуется в datepicker. Поэтому я решил добавить идентификатор текстового поля к ключу, чтобы сделать его уникальным:
Page.ClientScript.RegisterStartupScript(this.GetType(), "DPSetup" + DPTextbox.ClientID, dpScript);
Ответ 11
У меня была аналогичная проблема с динамическим добавлением классов датпикера. Решение, которое я нашел, это прокомментировать строку 46 datepicker.js
// this.element.on('click', $.proxy(this.show, this));
Ответ 12
В моем случае я не присвоил элементам <input>
никакого идентификатора и использовал класс для применения datepicker, как в ответе SeanJA, но datepicker применялся только к первому. Я обнаружил, что JQuery автоматически добавлял идентификатор, и он был одним и тем же во всех элементах, что объясняло, почему только первое было получено datepickered.