将jQuery datepicker应用于多个实例


70

我有一个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”集合中有多个项目,则只有第一个文本框会获得一个日期选择器(这与ID绑定是有意义的)。我尝试将一个类分配给文本框并指定:

$('.my_class').datepicker();

但是,尽管到处都显示一个日期选择器,但它们都更新了第一个文本框。

什么是使这项工作正确的方法?


<%blah%>东西是什么语言?
docwhat

那就是ASP.NET页面中的VB-只是一种快速说明问题的方法。
gfrizzle 2010年

确保输入字段不是disabled,日期选择器将不会显示具有disabled属性的输入字段
bobobobo

Answers:


124

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

(伪编码稍微简化了一点)


2
看来我问题的核心是所有文本框都具有相同的ID,因此每个日期选择器都在更新第一个文本框。您的示例不受此影响,因此可以正常工作。如何在循环中获得不同的ID?
gfrizzle

14
h,不要让文本框具有相同的ID。有时,您必须离开某个问题一段时间,才能找到明显的答案。
gfrizzle,2009年

4
$(".datepick").datepicker();输入字段上的ID不同后,将无法使用吗?
rapcal 2013年

我在输入中没有ID,但是类相同。可以在Chrome和FF上正常运行,但不能在IE上运行。要解决我只是得到了输入ID的
威尔

我已经使用CSS类名和onSelect事件处理程序将datepicker附加到一些HTML文本框中,我需要知道onSelect发生当前事件的选择器类名。.元素还应用了另外2个其他类,而不是我用来附加
datepicker的那个类

10

我只是有同样的问题。

使用日期选择的正确方法是,$('.my_class').datepicker();但是您需要确保未将相同的ID分配给多个日期选择器。


4

显而易见的答案是生成不同的ID,每个文本框都有一个单独的ID,例如

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

3

有一个简单的解决方案。

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

2

在运行时生成的输入文本框中添加datepicker时,必须检查它是否已包含datepicker,然后首先删除类hasDatepicker,然后对其应用datePicker。

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

1

关于SeanJA答案的一点说明。

有趣的是,如果将KnockoutJS和jQuery一起使用,则 以下输入具有不同的ID,但具有可观察到的相同数据绑定

<data-bind="value: first_dt" id="date_1" class="datepick" />
<data-bind="value: first_dt" id="date_2" class="datepick" />

将一个(相同的)日期选择器绑定到两个输入(即使它们具有不同的ID或名称)。

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

1
永远不要将这种方法与KnockoutJS结合使用。如果使用bindingHandler绑定日期选择器,则更好,更清洁。
Gigi2m02

0

解决方案是像许多人所说的那样使用不同的ID。问题仍然存在于日期选择器中。请更正我,但datepicker没有一个包装ID-“ ui-datepicker-div”。可以在http://jqueryui.com/demos/datepicker/#option-showOptions上看到主题背景中的。

是否有可以将此ID更改为类的选项?我不想仅仅为了这个明显的修复而叉这个脚本!


那可能只是示例代码的“示例”部分。我认为它实际上不会生成具有该ID的div。确保我的每个目标对象都有唯一的ID,以确保一切正常。
gfrizzle

0

更改类而不是ID的用法

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

当然,我们也不需要替代方法……尽管我承认虽然这行得通,但我不会使用它。特别是在看到接受的答案之后-而是每个人都有自己的答案。
brichins 2013年

0

我遇到了同样的问题,但最终发现这与我从ASP Web用户控件调用脚本的方式有关。我正在使用ClientScript.RegisterStartupScript(),但是忘记为脚本提供唯一键(第二个参数)。通过为两个脚本分配相同的键,实际上只有第一个框被转换为日期选择器。因此,我决定将文本框的ID附加到键上,以使其具有唯一性:

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

0

我在动态添加datepicker类时遇到了类似的问题。我发现的解决方案是注释掉datepicker.js的第46行

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

0

就我而言,我没有给我的<input>元素任何ID,而是像SeanJA的回答一样,使用一个类来应用datepicker,但是datepicker仅应用于第一个。我发现JQuery会自动添加一个ID,并且在所有元素中它都是相同的,这解释了为什么只有第一个被日期选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.