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

问题描述 投票:5回答:4

由于我已经切换到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:无法读取undefined的属性'append'

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

jquery jquery-ui jquery-ui-datepicker each
4个回答
10
投票

假设您要重置datepicker,我发现解决此问题的一种方法是:

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

3
投票

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

..input class="dp" /> 

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

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

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

错误


-1
投票

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

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

这适用于我的datepicker问题。

© www.soinside.com 2019 - 2024. All rights reserved.