Javascript 使用jQuery UI日期选择器进行内联编辑

Javascript 使用jQuery UI日期选择器进行内联编辑,javascript,jquery,jquery-ui,datepicker,Javascript,Jquery,Jquery Ui,Datepicker,我正在尝试使用jQuery UI日期选择器实现日期字段的内联编辑 我使用的代码如下 $(document).on("click",".editableDateTxt", function () { var currElmModelId = $(this).attr('data-model-id'); var currElmModelAttr = $(this).attr('data-model-attr'); var input = $('<input />'

我正在尝试使用jQuery UI日期选择器实现日期字段的内联编辑

我使用的代码如下

$(document).on("click",".editableDateTxt", function () {
    var currElmModelId = $(this).attr('data-model-id');
    var currElmModelAttr = $(this).attr('data-model-attr');
    var input = $('<input />', {'type': 'text','name':currElmModelAttr, 'style':'width:100px' ,'data-model-id': currElmModelId, 'data-model-attr': currElmModelAttr, 'class':'datePicker', 'value': $(this).html()});
    var parent = $(this).parent();
    parent.append(input);
    $(this).remove();

    input.datepicker().focus();

});

$(document).on("change", ".datePicker", function () {
    //alert($(this).val());
    var dataValid = $(this).attr('data-valid');
    if (dataValid == "Y") {
        var currElmModelId = $(this).attr('data-model-id');
        var currElmModelAttr = $(this).attr('data-model-attr');
        var divEle = $('<div />', {'class': 'editableDateTxt','name':currElmModelAttr, 'data-model-attr':currElmModelAttr,'data-model-id':currElmModelId,'html':$(this).val()});
        var parent = $(this).parent();
        parent.append(divEle);
        $(this).remove();
    }
});

$(document).on("blur",".datePicker", function () {
    if (this.hasAttribute('data-model-id')) {
        var dataValid = $(this).attr('data-valid');

        if (typeof dataValid == "undefined" || dataValid == "Y") {
            var currElmModelId = $(this).attr('data-model-id');
            var currElmModelAttr = $(this).attr('data-model-attr');
            var divEle = $('<div />', {'class': 'editableDateTxt','name':currElmModelAttr, 'data-model-attr':currElmModelAttr,'data-model-id':currElmModelId,'html':$(this).val()});
            var parent = $(this).parent();
            parent.append(divEle);
            $(this).remove();
            return false;
        }

    }   
});
现在,当我选择任何日期或进行模糊处理时,会出现以下错误:

缺少此日期选择器的实例数据

我认为这个问题与使用数据的jQueryUIDatePicker有关 所以我尝试使用分离而不是删除

所以我只用了$this.detach


您能否指导我如何正确使用detach来解决问题…

您可能遇到了与我相同的问题。onblur中的代码是在日期选择器完成其工作之前触发的,因此在日期选择器完成其工作之前,您将丢失输入对象

我能够通过接受的关于这个问题的答案中的一个建议来解决这个问题:

在我的场景中,有效的解决方案是将我的代码包装在一个setTimeout中的on blur函数中,这有效地使代码在datepicker完成它的工作之后运行

就你的情况而言,我建议如下:

$(document).on("blur",".datePicker", function () {
setTimeout(function(){
    if (this.hasAttribute('data-model-id')) {
        var dataValid = $(this).attr('data-valid');

        if (typeof dataValid == "undefined" || dataValid == "Y") {
            var currElmModelId = $(this).attr('data-model-id');
            var currElmModelAttr = $(this).attr('data-model-attr');
            var divEle = $('<div />', {'class': 'editableDateTxt','name':currElmModelAttr, 'data-model-attr':currElmModelAttr,'data-model-id':currElmModelId,'html':$(this).val()});
            var parent = $(this).parent();
            parent.append(divEle);
            $(this).remove();
            return false;
        }
    }   
},100);

})

我屏蔽了你的代码,使用Chrome我看不到任何错误。实际上,我想要的方式是,日期最初显示为标签,点击它会变成一个日期选择文本框,再次在日期选择时,更改为显示标签文本