Применить jQuery datepicker к нескольким экземплярам



у меня есть элемент управления jQuery date picker, который отлично работает для одного экземпляра, но я не уверен, как заставить его работать для нескольких экземпляров.



<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();


но пока это показывает выбор даты везде они все обновляют первое текстовое поле.



Как правильно сделать эту работу?

543   12  

12 ответов:

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" />

сценарий:

$('.datepick').each(function(){
    $(this).datepicker();
});

(псевдо кодируется немного, чтобы держать его проще)

У меня просто была такая же проблема.

правильный способ использовать выбор даты -$('.my_class').datepicker(); но вы должны убедиться, что вы не присвоить один и тот же ID для нескольких datepickers.

очевидным ответом было бы генерировать разные идентификаторы, отдельный идентификатор для каждого текстового поля, что-то вроде

[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-like в квадратных скобках. Перевод его на фактический ASP.net код не должен быть проблемой.

затем, вы должны найти способ, чтобы создать как можно больше

$('#my_date[i]').datepicker();

в виде элементов Model.MyRecords. Опять же, в квадратных скобках находится ваш счетчик, поэтому ваша функция jQuery будет что-то вроде:

<script type="text/javascript">
    $(function() {
        $('#my_date1').datepicker();
        $('#my_date2').datepicker();
        $('#my_date3').datepicker();
        ...
    });
</script>
<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>

есть простое решение.

<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>

при добавлении datepicker во время выполнения сгенерированных входных текстовых полей вы должны проверить, если он уже содержит datepicker затем сначала удалить класс hasDatepicker затем применить datePicker к нему.

function convertTxtToDate() {
        $('.dateTxt').each(function () {
            if ($(this).hasClass('hasDatepicker')) {
                $(this).removeClass('hasDatepicker');
            } 
             $(this).datepicker();
        });
    } 

небольшая заметка к ответу 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();
});

решение здесь состоит в том, чтобы иметь разные идентификаторы, как многие из вас заявили. Проблема все еще лежит глубже в datepicker. Пожалуйста, поправьте меня, но у datepicker нет одного идентификатора обертки - "ui-datepicker-div."Это видно на http://jqueryui.com/demos/datepicker/#option-showOptions в тематике.

есть ли опция, которая может изменить этот идентификатор, чтобы быть классом? Я не хочу раскошеливаться на этот скрипт только для этого очевидного исправления!!

изменить использование класса вместо ID

<script type="text/javascript"> 
    $(function() { 
        $('.my_date1').datepicker(); 
        $('.my_date2').datepicker(); 
        $('.my_date3').datepicker(); 
        ... 
    }); 
</script>

у меня была та же проблема, но, наконец, выяснилось, что это была проблема с тем, как я вызывал скрипт из пользовательского веб-элемента управления ASP. Я использовал ClientScript.RegisterStartupScript(), но забыл дать скрипту уникальный ключ (второй аргумент). Поскольку обоим сценариям был назначен один и тот же ключ, только первое поле фактически преобразовывалось в datepicker. Поэтому я решил добавить идентификатор текстового поля к ключу, чтобы сделать его уникальным:

Page.ClientScript.RegisterStartupScript(this.GetType(), "DPSetup" + DPTextbox.ClientID, dpScript);

У меня была аналогичная проблема с динамическим добавлением классов datepicker. Решение, которое я нашел, было прокомментировать строку 46 datepicker.js

// this.element.on('click', $.proxy(this.show, this));

в моем случае, я не дал мой <input> elements any ID, и использовал класс для применения datepicker, как в ответе SeanJA, но datepicker применялся только к первому. Я обнаружил, что JQuery автоматически добавлял идентификатор, и он был одним и тем же во всех элементах, что объясняло, почему только первый получал datepickered.

Comments

    Ничего не найдено.