Проблема вызвана jquery.ui.datepicker.mobile.js
, где бы вы ни получили, это явно неполный взлом.
Реальная проблема с этой строкой:
//return jqm obj
return this;
Это означает, что независимо от того, что вы вызываете, он всегда будет возвращать взломанный объект jQuery для нового средства выбора даты. В вашем случае он должен вернуть дату.
Решение, которое опять-таки является просто взломом, состоит в том, чтобы сохранить возвращаемое значение исходного вызова datepicker и возвращать объект jQuery только в том случае, если исходное возвращаемое значение фактически было объектом jQuery:
...
//call cached datepicker plugin
var retValue = prevDp.call( this, options );
...
//return jqm obj
if(retValue){
if(!retValue.jquery) return retValue;
}
return this;
...
Редактировать: Дальнейшие проблемы с этим расширением расширения в том, что оно нарушает все команды, которые требуют более одного параметра. datepicker()
может принимать до 5 параметров, поэтому эти дополнения должны быть переданы в исходное расширение.
Аналогично, добавление дополнительных стилей и привязка события click должны происходить только при построении средства выбора даты, поэтому необходимо установить дополнительную проверку, чтобы определить, является ли тип первого параметра строка или нет.
Полученный код должен выглядеть примерно так, остальное оставлю на усмотрение оригинального разработчика:).
(function($, undefined ) {
//cache previous datepicker ui method
var prevDp = $.fn.datepicker;
//rewrite datepicker
$.fn.datepicker = function( options, param2, param3, param4, param5 ){
var dp = this;
//call cached datepicker plugin
var retValue = prevDp.call( this, options, param2, param3, param4, param5 );
//extend with some dom manipulation to update the markup for jQM
//call immediately
function updateDatepicker(){
$( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
$( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#");
$( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true});
$( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true});
$( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c");
$( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c");
$( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false});
$( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date
$( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date
$( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
var el = $(this);
// remove extra button markup - necessary for date value to be interpreted correctly
el.html( el.find( ".ui-btn-text" ).text() );
});
};
if(typeof options != 'string'){
//update now
updateDatepicker();
// and on click
$( dp ).click( updateDatepicker );
}
//return jqm obj
if(retValue){
if(!retValue.jquery) return retValue;
}
return this;
};
//bind to pagecreate to automatically enhance date inputs
$( ".ui-page" ).live( "pagecreate", function(){
$( "input[type='date'], input:jqmData(type='date')", this ).each(function(){
$(this).after( $( "<div />" ).datepicker({ altField: "#" + $(this).attr( "id" ), showOtherMonths: true }) );
});
});
})( jQuery );