KnockoutJs数据绑定不';t使用Internet Explorer上的jquery单击事件(8-11)

KnockoutJs数据绑定不';t使用Internet Explorer上的jquery单击事件(8-11),jquery,internet-explorer,knockout.js,Jquery,Internet Explorer,Knockout.js,我想用KnockoutJS做基本的搜索活动 该按钮与KnockoutJs绑定以过滤记录。 当用户单击enter按钮时,我试图触发按钮的单击事件。它在Chrome和Firfox上运行良好。如果我手动单击按钮,它也在IE上运行。 问题是当我按键盘上的enter键时,它并没有在IE上过滤(将数据传递给viewModel)。我跟踪了我的viewModel。我发现,如果按enter键,它会将以前的数据发送到viewModel,如: 文本框输入值:30->单击事件触发->viewmodel上的数据:null

我想用KnockoutJS做基本的搜索活动

该按钮与KnockoutJs绑定以过滤记录。 当用户单击enter按钮时,我试图触发按钮的单击事件。它在Chrome和Firfox上运行良好。如果我手动单击按钮,它也在IE上运行。

问题是当我按键盘上的enter键时,它并没有在IE上过滤(将数据传递给viewModel)。我跟踪了我的viewModel。我发现,如果按enter键,它会将以前的数据发送到viewModel,如:

  • 文本框输入值:30->单击事件触发->viewmodel上的数据:null
  • 文本框输入值:20->单击事件触发->viewmodel上的数据:30(以前的数据)
  • 文本框输入值:10->单击事件触发->viewmodel上的数据:20(以前的数据)
  • MyViewModel:

    var ListCasesViewModel = function () {
    var self = this;
    
    self.selectedStartDate = ko.observable(null);
    self.selectedEndDate = ko.observable(new Date());
    self.selectedSearchKey = ko.observable("");
    self.selectedStatuses = ko.observableArray();
    self.selectedHospitals = ko.observableArray();
    
    // methods...
    this.init = function () {
        self.selectedEndDate(new Date());
        self.filter();
    
    }
    
    this.filter = function () {
    
        // get filter control values
        var startDate = self.selectedStartDate(); // dtStart.value();
        var endDate = self.selectedEndDate(); //dtEnd.value();
        var searchText = self.selectedSearchKey(); //txtSearchText.val();
        var lstStatus = $("#lstStatus").data("kendoMultiSelect");
        var lstHospital = $("#lstHospitals").data("kendoMultiSelect");
        var status = lstStatus.value().toString();
        var hospitalIDs = lstHospital.value().toString();
    
    
        // prepare filters
        $filter = new Array();
    
        if (startDate != undefined)
            $filter.push({ field: "startDate", operator: "eq", value: startDate });
    
        if (endDate != undefined)
            $filter.push({ field: "endDate", operator: "eq", value: endDate });
    
        if (status != undefined)
            $filter.push({ field: "caseStatus", operator: "eq", value: status });
    
        if (hospitalIDs != undefined)
            $filter.push({ field: "hospitalIDs", operator: "eq", value: hospitalIDs });
    
        if (searchText != undefined)
            $filter.push({ field: "searchText", operator: "eq", value: searchText });
    
    
        var list = $("#listView").data("kendoListView");
        list.dataSource.filter($filter);
    
    }};
    

    将valueUpdate绑定添加到searchText输入:

    <input id="txtSearchText" type="text" data-bind="value:selectedSearchKey,valueUpdate:'afterkeydown'"/>
    
    
    
    这就迫使knockout在用户键入字母后立即更新可观察值


    在IE中按Enter键时是否会触发keyup事件?您使用的是哪个Jquery版本?是的,触发了keyup事件,我可以在popup.Worked上看到keycode的值。非常感谢,我花了几个小时试图解决这个问题。但是,我不明白为什么我需要添加valueUpdate属性,因为它在没有它的chrome和firefox上工作。不客气,很高兴听到它工作。我认为这只是不同浏览器更新底层价值的方式;因此,附加到“keydown”事件,可以避免chrome/ff在enter上更新基础dom元素值而ie不更新这一事实。对不起,我不能说得更具体了。
    var ListCasesViewModel = function () {
    var self = this;
    
    self.selectedStartDate = ko.observable(null);
    self.selectedEndDate = ko.observable(new Date());
    self.selectedSearchKey = ko.observable("");
    self.selectedStatuses = ko.observableArray();
    self.selectedHospitals = ko.observableArray();
    
    // methods...
    this.init = function () {
        self.selectedEndDate(new Date());
        self.filter();
    
    }
    
    this.filter = function () {
    
        // get filter control values
        var startDate = self.selectedStartDate(); // dtStart.value();
        var endDate = self.selectedEndDate(); //dtEnd.value();
        var searchText = self.selectedSearchKey(); //txtSearchText.val();
        var lstStatus = $("#lstStatus").data("kendoMultiSelect");
        var lstHospital = $("#lstHospitals").data("kendoMultiSelect");
        var status = lstStatus.value().toString();
        var hospitalIDs = lstHospital.value().toString();
    
    
        // prepare filters
        $filter = new Array();
    
        if (startDate != undefined)
            $filter.push({ field: "startDate", operator: "eq", value: startDate });
    
        if (endDate != undefined)
            $filter.push({ field: "endDate", operator: "eq", value: endDate });
    
        if (status != undefined)
            $filter.push({ field: "caseStatus", operator: "eq", value: status });
    
        if (hospitalIDs != undefined)
            $filter.push({ field: "hospitalIDs", operator: "eq", value: hospitalIDs });
    
        if (searchText != undefined)
            $filter.push({ field: "searchText", operator: "eq", value: searchText });
    
    
        var list = $("#listView").data("kendoListView");
        list.dataSource.filter($filter);
    
    }};
    
    <input id="txtSearchText" type="text" data-bind="value:selectedSearchKey,valueUpdate:'afterkeydown'"/>