jquery 2.0 jquery ui datepicker bug - 未捕获的TypeError:无法读取未定义的属性'append'

时间:2013-04-28 23:12:19

标签: jquery jquery-ui jquery-ui-datepicker each

由于我已经切换到JQuery 2.0,因此破坏了jQuery UI(1.10.2)Datepickers。

似乎是修改jquery.each()函数的问题。

我关注

$(this.el_picker).datepicker('destroy');

它在JQuery UI 第9605行

中调用
return this.each(function() {
    typeof options === "string" ?
        $.datepicker["_" + options + "Datepicker"].
            apply($.datepicker, [this].concat(otherArgs)) :
        $.datepicker._attachDatepicker(this, options);
});

然后它在 Jquery.each()函数中调用以下函数:

if ( isArray ) {
        for ( ; i < length; i++ ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        } else {
            for ( i in obj ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        }

这与旧版JQuery的区别

        if ( isObj ) {
            for ( name in object ) {
                if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
                    break;
                }
            }
        } else {
            for ( ; i < length; ) {
                if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
                    break;
                }
            }
        }
    }

然后转到JQuery UI 第7922行

_destroyDatepicker: function(target) {
    var nodeName,
        $target = $(target),
        inst = $.data(target, PROP_NAME);

    if (!$target.hasClass(this.markerClassName)) {
        return;
    }

    nodeName = target.nodeName.toLowerCase();
    $.removeData(target, PROP_NAME);
    if (nodeName === "input") {
        inst.append.remove();

抛出错误:

  

未捕获的TypeError:无法读取未定义的属性'append'

有什么想法吗?是兼容性错误吗?怎么解决?或者我做错了。

4 个答案:

答案 0 :(得分:10)

我发现修复此问题的一种方法是假设您要重置日期选择器:

 $(".hasDatepicker").removeClass("hasDatepicker");
 $(".datepicker").datepicker("destroy");
 $(".datepicker").datepicker();

答案 1 :(得分:3)

当你在具有类的输入上调用destroy时,通常会发生这种情况,但是还没有调用datepicker()。例如:

..input class="dp" /> 

如果您尚未拨打$(".dp").datepicker()并尝试拨打$(".dp").datepicker("destroy"),则会收到此错误消息。当您动态添加其中一个行字段为datepicker输入的行时,也会发生这种情况。在这种情况下,代码序列应为:

$(".dp").datepicker("destroy");
// code to add row dynamically
.....
$(".dp").datepicker();

答案 2 :(得分:1)

迟到了,但是我删除了破坏功能并使其正常工作。与您的示例不完全相同,但这可以从JSFiddle

中找到

并删除了knoukout清理以获得此解决方案:

        ko.bindingHandlers.datepicker = {
            init: function(element, valueAccessor, allBindingsAccessor) {
                var $el = $(element);

                //initialize datepicker with some optional options
                var options = { minDate: 0
                        };
                $el.datepicker(options);

                //handle the field changing
                ko.utils.registerEventHandler(element, "change", function() {
                    var observable = valueAccessor();
                    observable($el.datepicker("getDate"));
                });

            },
            update: function(element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor()),
                    $el = $(element),
                    current = $el.datepicker("getDate");

                if (value - current !== 0) {
                    $el.datepicker("setDate", value);   
                }
            }
        };

我认为问题是jquery不应该被强制销毁datepicker,当我删除它时,我可以刷新页面而不用

Uncaught TypeError: Cannot read property 'append' of undefined

错误

答案 3 :(得分:-1)

我遇到了同样的问题,我找到了另一个解决方案,提到在jquery和jqueryui引用下添加以下脚本引用:

<script src="http://code.jquery.com/jquery-migrate-1.1.1.js"></script>

这适用于我的datepicker问题。