当datePicker处理程序位于iframe中时,KnockoutJS未捕获到jQuery UI datepicker更改事件

时间:2018-08-05 12:46:29

标签: javascript knockout.js datepicker

ko.bindingHandlers.iFramedatePicker = 
{

init: function (element, valueAccessor, allBindingsAccessor, data, context) 
{

    window.parent.customer.datePickers.initDatePicker(element);

    ko.utils.registerEventHandler(element, "change", function () {
        var observable = valueAccessor();
        var ctrlValue;
        if (typeof (observable()) == "string")
            ctrlValue = $(element).val();
        else
            ctrlValue = window.parent.customer.datePickers.getDate(element);
        observable(ctrlValue);

    });

    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
        window.parent.customer.datePickers.destroyDatePicker(element);
    });
},

update: function (element, valueAccessor) {
    var modelValue = ko.utils.unwrapObservable(valueAccessor());
    if ((modelValue) && (modelValue != '')) {
        var modelValue_Date = new Date(modelValue);
        var controlValue = window.parent.customer.datePickers.getDate(element);
        if (controlValue === null || controlValue.getTime() !== modelValue_Date.getTime())
            window.parent.customer.datePickers.setDate(element, modelValue_Date);

    }

}
};

我正在使用上面的代码,但我的datepicker处理程序位于iframe中。 问题是ko.utils.registerEventHandler在更改日期选择器上的日期后永远不会触发。

2 个答案:

答案 0 :(得分:0)

如果您尝试在拥有子iframe时触发并捕获事件,请尝试使用parent.document而不是window.parent,例如this答案。

此外,如果您在parent.document中使用registerHandler,则事件的注册可能应该在iframe中进行。

答案 1 :(得分:0)

您是否尝试在update中而不是init中添加事件委托? 也可以将JQUERY函数直接用于处理程序中。

$(element).initDatePicker();