将jQuery日期选择器应用于多个实例

72

我有一个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
确保输入字段未被“禁用”,对于具有“禁用”属性的输入字段,日期选择器将不会显示。 - bobobobo
12个回答

131

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
15
别傻了,不要让文本框具有相同的ID。有时候你需要暂时离开问题,让显而易见的答案浮现出来。 - gfrizzle
5
如果在输入框上有不同的ID,那么 $(".datepick").datepicker(); 还能正常工作吗? - rapcal
我在输入框中没有ID,但是它们有相同的类。在Chrome和FF上工作正常,但在IE上不行。为了解决这个问题,我只需获取输入框的ID即可。 - Will
我已经使用CSS类名和onSelect事件处理程序将日期选择器附加到一些HTML文本框上,我需要知道当前onSelect发生的选择器类名。这些元素还应用了另外2个类,除了我用来附加日期选择器的那个类。 - techie_28

11

我遇到了同样的问题。

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


5
明显的解决方案是生成不同的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>

3
<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
在运行时添加日期选择器时,如果要生成输入文本框,则必须检查它是否已包含日期选择器,然后首先删除类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中使用单独的可观察对象,为每个输入框绑定单独的日期选择器:

<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 绑定你的 datepicker,会更好、更干净。 - Gigi2m02

0

使用类替代ID进行更改

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

当然我们不想使用其他方法...虽然我承认这个方法是可用的,但我不会使用它。特别是在看到被接受的答案之后 - 但每个人有自己的喜好。 - brichins

0

我曾经遇到过动态添加日期选择器类的类似问题。我找到的解决方案是注释掉datepicker.js文件中的第46行。

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

0
我曾经遇到过同样的问题,但最终发现这是由于我从 ASP 网页用户控件中调用脚本的方式有问题。我使用了 ClientScript.RegisterStartupScript(),但忘记给脚本一个唯一的键(第二个参数)。由于两个脚本都被分配了相同的键,只有第一个文本框实际上被转换为日期选择器。因此,我决定将文本框的 ID 追加到键上,使其变得唯一:
Page.ClientScript.RegisterStartupScript(this.GetType(), "DPSetup" + DPTextbox.ClientID, dpScript);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接