Knockout JS:在iPad上更改HTML5日期未触发的事件

时间:2011-12-28 09:27:15

标签: html5 date knockout.js

我正在使用Knockout JS库来绑定我的Web应用程序中的HTML5输入控件,该应用程序旨在在iPad(iOS5,Safari 5.1)上运行。绑定适用于输入类型,如文本和选择,但不适用于日期。通过datepicker选择日期值后,该值不会绑定到viewModel属性(实际上没有保存)。

这就是我的HTML外观。

<input id="dob" name="dob" type="date" data-bind="value: dob" />

我尝试使用自定义绑定解决了我初始化更改事件处理程序的问题。

ko.bindingHandlers.datePicker = {
    init: function (element, valueAccessor) {
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            observable($(element).val());
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);
    }
};

将HTML代码更改为 -

<input id="dob" name="dob" type="date" data-bind="datePicker: dob" />
奇怪的是,即使那个事件也没有解雇。请注意,在这两种情况下,绑定在Opera和Safari浏览器的Windows XP中完美地发生。

最终,我通过在自定义绑定中使用'blur'事件而不是'change'来解决我的问题。现在正在调用事件处理程序,我手动设置日期控件的值。

现在我的问题是,这是我没有正确做的事情,如果没有那么为什么HTML5日期控件的更改事件不会触发,无论是默认还是通过自定义绑定?我希望日期控件按预期工作。

2 个答案:

答案 0 :(得分:13)

从Knockout的角度来看,你没有做错任何事。从测试和稍微研究一下,这些事件真的不会被解雇(即使在图片中没有Knockout)。

您可以通过执行以下操作来避免自定义绑定:

<input type="date" data-bind="value: myDate, valueUpdate: 'blur'" />

答案 1 :(得分:4)

我有类似的问题,但在我的情况下,即使是模糊事件实际上也没有被解雇。所以我使用带有valueUpdate属性的input事件,并解决了问题。