我有一个表格,我正在动态添加行,每一行都将有两个单元格,其中一个包含一个输入字段,在此计划使用DatePicker UI来选择日期。问题出现在当我添加新行时,单元格等全部成功添加,但是在点击输入字段时,它却没有显示DatePicker。我阅读了相关资料,得知我应该使用“事件委托”,因为这些新元素并非从一开始就被加载。但是,我一直无法理解如何做到这一点,如果有人能指点我正确的方向,那就太好了。谢谢。
到目前为止,我已经写出了以下代码:
到目前为止,我已经写出了以下代码:
<html>
<head>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery- ui.css">
<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>
$(document).ready(function() {
$( ".datepicker" ).datepicker();
$( "#TheTable" ).on("change",".datepicker",function(){
$( this ).datepicker( "option", "dateFormat", "yy-mm-dd" );
});
});
function addRow() {
var table = document.getElementById("TheTable");
var row = table.insertRow(-1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML='Date';
cell2.innerHTML='<input type="text" class="datepicker"/>';
}
</script>
</head>
<body>
<table name="MyTable" id="TheTable">
<tr>
<td>Date</td>
<td><input type="text" class="datepicker" /></td>
</tr>
<tr>
<td>Date</td>
<td><input type="text" class="datepicker" /></td>
</tr>
</table>
<input type="button" onClick="return addRow()" value ="Add Another Date">
</body>
</html>
selector
时,事件被委托,这意味着事件发生在共享选择器的元素的后代中。根据文档,我有两个选项;要么在新HTML之后选择元素并附加事件处理程序,要么使用委托事件。您提供的代码就是这样做的,它使用委派事件来附加事件处理程序。我理解得对吗?我实现了您的解决方案,但无法使其正常工作。我更新了代码到我现在拥有的内容。我甚至不知道我做错了什么...感谢您的帮助。 - AnnataraddRow()
函数内部附加一个监听器,但这样做会添加额外的事件监听器;只有一个听起来更好,不是吗?如果你要这样做,记得在删除行时删除监听器!你的代码现在看起来很完美了,除非我看到更多内容,否则我无法提出更多建议。你能给我提供一个实时版本的链接吗? - BilladdRow()
的最后一行。http://jsfiddle.net/FAcF2/ - Bill.not()
来选择不属于.datepicker
类的元素,然后将它们添加到其中吗? - Annatar.hasDatepicker
类。我使用.not('.hasDatepicker')
来避免在已经拥有日期选择器的元素上再次进行初始化。 - Bill