Я реализую встроенную функцию редактирования.
Таким образом, сначала будет отображаться метка даты (например, 05/01/1999), и по щелчку ее она будет заменена поле ввода с таким же значением (05/01/1999)... Теперь пользователь может выберите любую дату, используя jQuery UI date picker и при выборе любой даты (например, 05/01/2005), я бы снова показал ярлык (05/01/2005)
В настоящее время я использую код ниже:
$(document).on("click",".editableDateTxt", function () {
var currElmModelAttr = $(this).attr('data-model-attr');
var input = $('<input />', {'type': 'text','name':currElmModelAttr, 'style':'width:100px','class':'datePicker', 'value': $(this).html()});
var parent = $(this).parent();
parent.append(input);
$(this).remove();
input.datepicker().focus();
});
Каков наилучший способ реализовать то же самое?
Теперь вот ключевой момент... Я использую jQuery UI datepicker... который использует данные jQuery() внутри... Поэтому я не хочу потерять его во время прыжка с div > и наоборот...
Не могли бы вы изменить приведенный выше код, чтобы рассмотреть, что информация о jQuery data() остается.
********* ОБНОВЛЕННЫЙ КОД ниже:
var MyView = BaseModalView.extend({
el: "#myModalContainer",
initialize: function() {
var self = this;
},
render: function() {
var self = this,
$el = $(self.el);
$el.find(".datePicker").datepicker();
self.initEventListeners();
},
initEventListeners: function() {
var self = this,
$el = $(self.el);
var $this;
$(document).on("click", ".editableDateTxt", function () {
var currElmModelId = $(this).attr('data-model-id');
var currElmModelAttr = $(this).attr('data-model-attr');
$this = $(this);
var input = $('<input />', {
'type': 'text',
'name': currElmModelAttr,
'data-model-id': currElmModelId,
'data-model-attr': currElmModelAttr,
'style': 'width:100px',
'class': 'datePicker',
'value': $(this).text()
});
$(this).replaceWith(input);
input.datepicker({
onSelect: function (date) {
$this.text(date);
input.replaceWith($this);
// input.blur();
}
}).focus();
$(document).on("blur change", "input", function () {
setTimeout(function () {
var value = input.val();
$this.text(value);
input.replaceWith($this);
}, 100);
});
});
}
Вы можете сделать это лучше, заменив replaceWith()
$(document).on("click", ".editableDateTxt", function () {
var currElmModelAttr = $(this).attr('data-model-attr');
var $this = $(this);
var input = $('<input />', {
'type': 'text',
'name': currElmModelAttr,
'style': 'width:100px',
'class': 'datePicker',
'value': $(this).text()
});
$(this).replaceWith(input);
input.datepicker({
onSelect: function (date) {
$this.text(date);
input.replaceWith($this);
console.log(date);
}
})
});
Кроме того, я предлагаю, вы скрываете/показываете элементы, которые были бы лучше в этом случае, вместо того чтобы создавать и заменять элементы каждый раз.
Лучший способ сделать это - использовать поле ввода только для чтения с помощью выбора даты. Есть ли причина использования div и замены поля ввода?
Вот более простая версия, предложенная @Shaunak D, с использованием основных hide()
и show()
.
^ _ ^ Пример jsfiddle
Код HTML:
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
<div id="lbl"></div>
<input type='text' id="date-picker" />
Js коды:
$('#lbl').html('2014-01-01');
$('#date-picker').hide();
$('#date-picker').datepicker({
onSelect: function(date) {
$('#lbl').html(date);
$(this).hide();
$('#lbl').show();
}
});
$('#lbl').click(function(){
//alert();
$(this).hide();
$('#date-picker').show();
});