jQuery 第一次点击后没有出现日期选择器
jQuery datepicker not appearing after first click
我正在尝试调试我的脚本,因为它导致日期选择器在第一次被点击后不显示。
日期选择器创建如下:
$(".dp").datepicker({
dateFormat: 'dd/mm/yy',
onSelect: function () {
// Activate next textbox and focus on it for further editing
var el = $(this).closest('tr').next().find('input').prop("disabled", false).removeClass("disabled");
// Trigger change as when using this event it overrides element onchange and we have to force the event to fire
$(this).trigger("change");
}
});
$(".dp").change(function () {
if ($(this).val() == "") {
var el = $(this).closest('tr').next().find('input').prop("disabled", true).addClass("disabled");
}
})
日期选择器绑定到 class 个文本框,这些文本框位于 div 中,内容使用 .load()
函数加载。
在我的页面上
<div id="newitem" class="newitem"></div>
有一个按钮可以从 PHP 页面加载 div 内容,该页面包含 X 个日期文本框。
<script type="text/javascript">
$(".info").click(function () {
$("#newitem").fadeIn().load("ajax/divs/tripinfo.php?id=" + $(this).attr("id")).draggable();
})
</script>
页面加载正常,在第一个 div 加载时,日期选择器按预期工作。在加载的页面上,我用以下内容隐藏了 div:
<button onclick="$('#newitem').fadeOut().remove();" class="closebutton">X</button>
一旦我用 .load()
函数关闭并打开另一个 div,日期选择器就不再工作了。显然,如果我第一次重新加载页面,它会再次工作并且行为会重复。
我怀疑这与我显示和隐藏 div 的方式有关,但我不确定。我无法调试,因为 javascript 控制台中没有错误消息。
首先,将您的 datepicker
设置更改为全局设置,这样您就不需要在每个 运行:
上加载它们
$.datepicker.setDefaults({
dateFormat: 'dd/mm/yy',
onSelect: function () {
// Activate next textbox and focus on it for further editing
var el = $(this).closest('tr').next().find('input').prop("disabled", false).removeClass("disabled");
// Trigger change as when using this event it overrides element onchange and we have to force the event to fire
$(this).trigger("change");
});
然后使用 on
将点击事件绑定到当前和即将到来的元素 dp
class:
$(document).on('change', '.dp', (function () {
if ($(this).val() == "") {
var el = $(this).closest('tr').next().find('input').prop("disabled", true).addClass("disabled");
}
});
然后绑定页面上已有的第一个元素:
$(".dp").datepicker();
然后改变 ajax 调用以包含一个回调,它有一个构造函数来创建新的 textboxes
datepickers
:
<script type="text/javascript">
$(".info").click(function () {
$("#newitem").fadeIn().load("ajax/divs/tripinfo.php?id=" + $(this).attr("id"), function() {
$(".dp").datepicker();
}).draggable();
})
</script>
这假设新元素也有class dp
。但我相信你明白了。这应该有效,不幸的是没有时间测试。有不对的地方请评论。
5 年后对我有用的一个非常简单的修复:
$(document).on('focus', '#datepicker', function(){
$(this).datepicker({
dateFormat: 'dd-mm-yy', });
});
注意:您可以忽略项目特定的 dateFormat 设置。
我遇到的问题:
Datepicker 仅在第二次点击后触发。因此,您必须单击该框,单击外部某处,然后再次单击日期选择器字段。
解法:
因为 DOM 已经通过向页面添加新内容的 JS 动态更新(包含我们“新生”日期选择器字段的表单),我们肯定需要 .on() 因为它将扫描 DOM再次 unlike.click() 它将在 DOM 的初始状态上工作(就在我们从后端提供它时,即 Laravel)。
然而,以上并没有解决问题。关键在于 'focus' 动作。出于某种原因,我仍在研究这个问题,只是解决了这个问题,现在日期选择器通过第一次点击和 TAB 切换(这似乎是迄今为止唯一的区别)。
我正在尝试调试我的脚本,因为它导致日期选择器在第一次被点击后不显示。
日期选择器创建如下:
$(".dp").datepicker({
dateFormat: 'dd/mm/yy',
onSelect: function () {
// Activate next textbox and focus on it for further editing
var el = $(this).closest('tr').next().find('input').prop("disabled", false).removeClass("disabled");
// Trigger change as when using this event it overrides element onchange and we have to force the event to fire
$(this).trigger("change");
}
});
$(".dp").change(function () {
if ($(this).val() == "") {
var el = $(this).closest('tr').next().find('input').prop("disabled", true).addClass("disabled");
}
})
日期选择器绑定到 class 个文本框,这些文本框位于 div 中,内容使用 .load()
函数加载。
在我的页面上
<div id="newitem" class="newitem"></div>
有一个按钮可以从 PHP 页面加载 div 内容,该页面包含 X 个日期文本框。
<script type="text/javascript">
$(".info").click(function () {
$("#newitem").fadeIn().load("ajax/divs/tripinfo.php?id=" + $(this).attr("id")).draggable();
})
</script>
页面加载正常,在第一个 div 加载时,日期选择器按预期工作。在加载的页面上,我用以下内容隐藏了 div:
<button onclick="$('#newitem').fadeOut().remove();" class="closebutton">X</button>
一旦我用 .load()
函数关闭并打开另一个 div,日期选择器就不再工作了。显然,如果我第一次重新加载页面,它会再次工作并且行为会重复。
我怀疑这与我显示和隐藏 div 的方式有关,但我不确定。我无法调试,因为 javascript 控制台中没有错误消息。
首先,将您的 datepicker
设置更改为全局设置,这样您就不需要在每个 运行:
$.datepicker.setDefaults({
dateFormat: 'dd/mm/yy',
onSelect: function () {
// Activate next textbox and focus on it for further editing
var el = $(this).closest('tr').next().find('input').prop("disabled", false).removeClass("disabled");
// Trigger change as when using this event it overrides element onchange and we have to force the event to fire
$(this).trigger("change");
});
然后使用 on
将点击事件绑定到当前和即将到来的元素 dp
class:
$(document).on('change', '.dp', (function () {
if ($(this).val() == "") {
var el = $(this).closest('tr').next().find('input').prop("disabled", true).addClass("disabled");
}
});
然后绑定页面上已有的第一个元素:
$(".dp").datepicker();
然后改变 ajax 调用以包含一个回调,它有一个构造函数来创建新的 textboxes
datepickers
:
<script type="text/javascript">
$(".info").click(function () {
$("#newitem").fadeIn().load("ajax/divs/tripinfo.php?id=" + $(this).attr("id"), function() {
$(".dp").datepicker();
}).draggable();
})
</script>
这假设新元素也有class dp
。但我相信你明白了。这应该有效,不幸的是没有时间测试。有不对的地方请评论。
5 年后对我有用的一个非常简单的修复:
$(document).on('focus', '#datepicker', function(){
$(this).datepicker({
dateFormat: 'dd-mm-yy', });
});
注意:您可以忽略项目特定的 dateFormat 设置。
我遇到的问题: Datepicker 仅在第二次点击后触发。因此,您必须单击该框,单击外部某处,然后再次单击日期选择器字段。
解法: 因为 DOM 已经通过向页面添加新内容的 JS 动态更新(包含我们“新生”日期选择器字段的表单),我们肯定需要 .on() 因为它将扫描 DOM再次 unlike.click() 它将在 DOM 的初始状态上工作(就在我们从后端提供它时,即 Laravel)。
然而,以上并没有解决问题。关键在于 'focus' 动作。出于某种原因,我仍在研究这个问题,只是解决了这个问题,现在日期选择器通过第一次点击和 TAB 切换(这似乎是迄今为止唯一的区别)。