我有一个JS代码,当你更改字段时,它会调用一个搜索例程。问题是,当Datepicker更新输入字段时,我找不到任何会触发的jQuery事件。
出于某种原因,当Datepicker更新字段时,不会调用更改事件。当弹出日历时,它会改变焦点,所以我也不能使用它。有什么想法吗?
答案 0 :(得分:338)
您可以使用日期选择器的onSelect
event。
$(".date").datepicker({
onSelect: function(dateText) {
display("Selected date: " + dateText + "; input's current value: " + this.value);
}
});
实例:
jQuery(function($) {
$(".date").datepicker({
onSelect: function(dateText) {
display("Selected date: " + dateText + "; input's current value: " + this.value);
}
}).on("change", function() {
display("Got change event from field");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
<link href="http://code.jquery.com/ui/1.9.2/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<input type='text' class='date'>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
不幸的是,onSelect
会在选择日期时触发,即使它没有更改。这是datepicker中的一个设计缺陷:它始终触发onSelect
(即使没有任何更改),并且不会在更改时触发基础输入上的任何事件。 (如果查看该示例的代码,我们正在侦听更改,但它们不会被提升。)当事情发生变化时,它可能应该在输入上触发事件(可能是通常的change
事件,或者可能是特定日期选择器。)
如果你愿意,当然,你可以在change
火上发起input
事件:
$(".date").datepicker({
onSelect: function() {
$(this).change();
}
});
对于通过jQuery连接的任何处理程序,它将在基础change
上触发input
。但同样,总是触发它。如果您只想触发真正的更改,则必须保存以前的值(可能通过data
)并进行比较。
实例:
jQuery(function($) {
$(".date").datepicker({
onSelect: function(dateText) {
display("Selected date: " + dateText + "; input's current value: " + this.value);
$(this).change();
}
}).on("change", function() {
display("Got change event from field");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
<link href="http://code.jquery.com/ui/1.9.2/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<input type='text' class='date'>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
答案 1 :(得分:61)
T.J。克劳德的回答(https://stackoverflow.com/a/6471992/481154)非常好,仍然准确无误。 在onSelect函数中触发更改事件就像您将要获得的那样接近。
但是,datepicker对象(lastVal
)上有一个很好的属性,它允许你仅在实际更改时有条件地触发更改事件,而不必存储值(s你自己:
$('#dateInput').datepicker({
onSelect: function(d,i){
if(d !== i.lastVal){
$(this).change();
}
}
});
然后只需处理正常的变更事件:
$('#dateInput').change(function(){
//Change code!
});
答案 2 :(得分:12)
您在datepicker对象中查找onSelect事件:
$('.selector').datepicker({
onSelect: function(dateText, inst) { ... }
});
答案 3 :(得分:11)
我之所以写这个是因为我需要一个解决方案,只有在日期发生变化时才能触发事件。
这是一个简单的解决方案。每次关闭对话框时,我们都会测试数据是否已更改。如果有,我们会触发自定义事件并重置存储的值。
$('.datetime').datepicker({
onClose: function(dateText,datePickerInstance) {
var oldValue = $(this).data('oldValue') || "";
if (dateText !== oldValue) {
$(this).data('oldValue',dateText);
$(this).trigger('dateupdated');
}
}
});
现在我们可以为该自定义事件挂钩处理程序......
$('body').on('dateupdated','.datetime', function(e) {
// do something
});
答案 4 :(得分:10)
$('#inputfield').change(function() {
dosomething();
});
答案 5 :(得分:9)
我正在使用bootstrap-datepicker,以上解决方案都没有为我工作。这个答案对我有帮助..
bootstrap datepicker change date event doesnt fire up when manually editing dates or clearing date
以下是我申请的内容:
$('.date-picker').datepicker({
endDate: new Date(),
autoclose: true,
}).on('changeDate', function(ev){
//my work here
});
希望这可以帮助他人。
答案 6 :(得分:4)
在jQueryUi 1.9上,我设法让它通过一个额外的数据值以及beforeShow和onSelect函数的组合来工作:
$( ".datepicker" ).datepicker({
beforeShow: function( el ){
// set the current value before showing the widget
$(this).data('previous', $(el).val() );
},
onSelect: function( newText ){
// compare the new value to the previous one
if( $(this).data('previous') != newText ){
// do whatever has to be done, e.g. log it to console
console.log( 'changed to: ' + newText );
}
}
});
适合我:)
答案 7 :(得分:3)
我知道这是一个老问题。但我无法得到jquery $(this).change()事件来正确触发onSelect。所以我采用以下方法通过vanilla js发布变更事件。
{{1}}
答案 8 :(得分:2)
试试这个
$('#dateInput').datepicker({
onSelect: function(){
$(this).trigger('change');
}
}});
希望这会有所帮助:)
答案 9 :(得分:2)
尝试:
$('#idPicker').on('changeDate', function() {
var date = $('#idPicker').datepicker('getFormattedDate');
});
答案 10 :(得分:1)
手册说:
apply.daterangepicker: Triggered when the apply button is clicked, or when a predefined range is clicked
所以:
$('#daterange').daterangepicker({
locale: { cancelLabel: 'Clear' }
});
$('#daterange').on('apply.daterangepicker', function() {
alert('worked!');
});
适合我。
答案 11 :(得分:1)
我的解决方案是:
events: {
'apply.daterangepicker #selector': 'function'
}
答案 12 :(得分:0)
如果您使用wdcalendar,这将帮助您
$("#PatientBirthday").datepicker({
picker: "<button class='calpick'></button>",
onReturn:function(d){
var today = new Date();
var birthDate = d;
var age = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
$('#ageshow')[0].innerHTML="Age: "+age;
$("#PatientBirthday").val((d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear());
}
});
onReturn活动对我有用
希望这个帮助
答案 13 :(得分:0)
DatePicker选择值更改事件代码
/* HTML Part */
<p>Date: <input type="text" id="datepicker"></p>
/* jQuery Part */
$("#datepicker").change(function() {
selectedDate= $('#datepicker').datepicker({ dateFormat: 'yy-mm-dd' }).val();
alert(selectedDate);
});
答案 14 :(得分:0)
我的测:
var $dateInput = $('#dateInput');
$dateInput.datepicker({
onSelect: function(f,d,i){
if(d !== i.lastVal){
$dateInput.trigger("change");
}
}
}).data('datepicker');
$dateInput.on("change", function () {
//your code
});
答案 15 :(得分:0)
我认为您的问题可能出在日期选择器的设置方式上。 为什么不断开输入...请不要使用altField。而是在onSelect触发时显式设置值。这将使您可以控制每个交互。用户文本字段和日期选择器。
注意:有时您必须在.change()而不是.onSelect()上调用例程,因为onSelect可以在您不期望的其他交互上调用。
伪代码:
$('#date').datepicker({
//altField: , //do not use
onSelect: function(date){
$('#date').val(date); //Set my textbox value
//Do your search routine
},
}).change(function(){
//Or do it here...
});
$('#date').change(function(){
var thisDate = $(this).val();
if(isValidDate(thisDate)){
$('#date').datepicker('setDate', thisDate); //Set my datepicker value
//Do your search routine
});
});
答案 16 :(得分:0)
这种方法很简单,每次都适用于文本框控件。 $('#controlID').on('changeDate', function() { $(this).change(); });