淘汰赛在IE中导致“慢速运行脚本”警告

时间:2012-04-25 13:41:43

标签: javascript internet-explorer knockout.js

我有一个可观察的网格和计算的可观察数据。第一行包含用作下面所有行中的值的乘数的百分比率。用户可以编辑百分比率值,Knockout可以处理所有级联更新。我还需要一个单独的文本框,用户可以输入一个新的百分比率,该百分率将应用于网格中的每个百分比。

初始绑定工作正常,更新1个百分比的工作也很好。

当用户在文本框中输入值时,会发出javascript警告,我会遍历视图模型,更新每个匹配的百分比率。网格列实际上是每月值,因此更新百分比率的循环仅执行12次。

我试过节流扩展器,但它没有解决问题。有什么想法吗?

更新:不确定它会有所帮助,但我添加了一些代码

$("#NewRate").change(function (e) {
    var newRate = parseFloat($(this).val());
    for (var i = 0; i < 12; i++) {
        viewModel.resourceCategory.monthAmounts[i].amount(newRate);
    }
});

function ConvertToDate(jsonDateString) {
    var re = /-?\d+/;
    var m = re.exec(jsonDateString);
    return new Date(parseInt(m[0]));
}

function MonthAmount(amount, dateKey) {
    var self = this;
    self.amount = ko.observable(amount).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
    self.dateKey = ConvertToDate(dateKey);
    self.monthIndex = self.dateKey.getMonth();
}

function ResourceCategory(name, monthAmounts) {
    var self = this;
    self.name = name;

    self.monthAmounts = ko.utils.arrayMap(monthAmounts, function (monthAmount) {
        return new MonthAmount(monthAmount.Amount, monthAmount.DateKey);
    });

    self.totalAmount = ko.computed(function () {
        var sum = 0;
        for (var i = 0; i < self.monthAmounts.length; i++) {
            sum += parseFloat(self.monthAmounts[i].amount());
        }
        return sum.toFixed(2);
    }).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE

    self.averageAmount = ko.computed(function () {
        return (self.totalAmount() / self.monthAmounts.length).toFixed(2);
    }).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE

}
function ResourceCategoriesMonthTotal(monthIndex, resourceCategories) {
    var self = this;
    self.monthIndex = monthIndex;
    self.dateKey = new Date(new Date().getFullYear(), monthIndex, 1);
    self.amount = ko.computed(function () {
        var val = 0;
        for (var i = 0; i < resourceCategories.length; i++) {
            val += parseFloat(resourceCategories[i].monthAmounts[self.monthIndex].amount());
        }
        return (val).toFixed(2);
    }).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
}

self.resourceCategoriesMonthTotals = new Array();
for (var monthIndex = 0; monthIndex < 12; monthIndex++) {
    self.resourceCategoriesMonthTotals.push(new ResourceCategoriesMonthTotal(monthIndex, self.resourceCategories));
}

self.resourceCategoriesTotal = ko.computed(function () {
    var val = 0;
    for (var i = 0; i < self.resourceCategoriesMonthTotals.length; i++) {
        val += parseFloat(self.resourceCategoriesMonthTotals[i].amount());
    }
    return (val / self.resourceCategoriesMonthTotals.length).toFixed(2);
}).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE

2 个答案:

答案 0 :(得分:2)

当你

时,问题就像问题一样
  
    

循环浏览模型,更新每个百分比以匹配

  

如果是这样,那么IE的一个答案是通过使用timeout(0)调用来屈服于浏览器。当你的JS在超时后恢复时,执行循环的下一次迭代,然后再执行另一次超时。

当我完成此操作时,如果我嗅到它是IE浏览器,我只会执行超时。否则,不需要。

答案 1 :(得分:2)

好的,这很臭,但我认为问题在于我的页面上有这个:

<div data-bind="text: ko.toJSON($root)"></div>

我删除后,它没有给我“慢速运行脚本”警告。