jQuery Заменить DIV на INPUT и наоборот

5

Я реализую встроенную функцию редактирования.

Таким образом, сначала будет отображаться метка даты (например, 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);

    });

});

}
  • 0
    Можете ли вы опубликовать скрипку и ваш HTML.
  • 0
    на самом деле это часть моего веб-приложения ... так сложно опубликовать это .. дайте мне попробовать ...
Показать ещё 2 комментария
Теги:
jquery-ui-datepicker

3 ответа

3

Вы можете сделать это лучше, заменив 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);
        }
    })

});

Обновлено демо

Кроме того, я предлагаю, вы скрываете/показываете элементы, которые были бы лучше в этом случае, вместо того чтобы создавать и заменять элементы каждый раз.

  • 0
    и я думаю, что у меня не будет onSelect: function (date) {} внутри щелчка editableDateTxt .... будет обрабатываться замена при изменении .datePicker
  • 0
    так каков правильный путь? Вы можете опубликовать на скрипке что-то, что работает с щелчком, изменением, размытием
Показать ещё 20 комментариев
0

Лучший способ сделать это - использовать поле ввода только для чтения с помощью выбора даты. Есть ли причина использования div и замены поля ввода?

0

Вот более простая версия, предложенная @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();

});
  • 0
    Лучший способ сделать это - использовать поле ввода только для чтения со средством выбора даты. Есть ли какая-либо причина использования div и его замены полем ввода?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню