0

我正在尝试将 Knockout.js 和 jQuery autosize 插件用于评论流系统。基本上,当关注评论输入时,我使用如下所示的 Knockout.js 事件绑定:

data-bind="event: {focus: $parent.autosize, blur: $parent.resize}"

在我的模型中,我实现的autosize功能如下:

$self.autosize = function(data, event) {
    var textarea = $(event.target);
    textarea.autosize();
});

但是,event据我所知,undefined我无法使用它来查找 textarea 以便我可以调用autosize()它。我也无法查询 textarea 的属性,当我console.log用来查找我的值时,event我被undefined退回了。

这似乎只发生在 Internet Explorer 中特别是版本 8-9。IE 10 以及 Chrome、Firefox 等按预期工作。以这种方式使用 Knockout.js 事件绑定和 Internet Explorer 是否存在已知问题?

4

2 回答 2

1

在 IE 中,您需要访问event.srcElement而不是event.target. 所以,你可以做var textArea = $(event.target || event.srcElement);

一个更像“淘汰赛”的解决方案是添加一个快速的自定义绑定,该绑定将使该逻辑远离您的视图模型,例如:

ko.bindingHandlers.autosize = {
  init: function(element) {
      ko.utils.registerEventHandler(element, "focus", function() {
          $(element).autosize();
      });

      ko.utils.registerEventHandler(element, "resize", function() {
           //whatever you call here
      });

  }
};

然后,只需穿上data-bind="autosize: true"你的元素。

于 2013-06-07T18:58:05.243 回答
0

Ryan 的回答是对“自动调整大小”问题的一个很好的解决方案,但我还想进一步解释缺少event.target. 当使用 jQuery 处理事件时,即使浏览器不包含它,jQuery 也会标准化event要包含的对象。target

如果 jQuery 存在(并因此提供),Knockout 将使用 jQuery 进行事件处理,但要这样做,当 Knockout加载event.target时 jQuery 需要存在。简单地说,如果你想正确集成这两者,你应该总是在你的 HTML 中包含 Knockout 之前的 jQuery。

于 2013-06-07T21:22:04.507 回答