5

自从我切换到 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();

并抛出错误:

未捕获的类型错误:无法读取未定义的属性“附加”

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

4

4 回答 4

12

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

 $(".hasDatepicker").removeClass("hasDatepicker");
 $(".datepicker").datepicker("destroy");
 $(".datepicker").datepicker();
于 2014-03-06T21:41:49.917 回答
3

这通常发生在您对具有类但尚未调用 datepicker() 的输入调用 destroy 时。例如:

..input class="dp" /> 

如果您还没有打电话$(".dp").datepicker()并尝试打电话$(".dp").datepicker("destroy"),您将收到此错误。当您动态添加行字段之一是日期选择器输入的行时,也会发生这种情况。在这种情况下,代码序列应该是:

$(".dp").datepicker("destroy");
// code to add row dynamically
.....
$(".dp").datepicker();
于 2014-11-25T14:25:44.313 回答
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

错误

于 2013-09-26T21:59:49.643 回答
-1

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

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

这适用于我的日期选择器问题。

于 2013-05-21T23:52:39.480 回答