Javascript 使用淘汰js自动增加文本区域

Javascript 使用淘汰js自动增加文本区域,javascript,html,knockout.js,frontend,Javascript,Html,Knockout.js,Frontend,我已经实现了在keyup事件中自动扩展textarea高度的逻辑。但是,我希望textarea在值通过敲除自定义绑定绑定到textarea后也初始化其高度。有什么解决办法吗?(只使用KnockoutJS,不使用jQuery或任何其他库。)您可以创建自定义绑定,将自动调整大小()应用于所有文本区域: ko.bindingHandlers.jqAutoresize = { init: function(element, valueAccessor) { var options

我已经实现了在keyup事件中自动扩展textarea高度的逻辑。但是,我希望textarea在值通过敲除自定义绑定绑定到textarea后也初始化其高度。有什么解决办法吗?(只使用KnockoutJS,不使用jQuery或任何其他库。)

您可以创建自定义绑定,将
自动调整大小()
应用于所有文本区域:

ko.bindingHandlers.jqAutoresize = {
    init: function(element, valueAccessor) {
        var options = ko.utils.unwrapObservable(valueAccessor()) || {};

        $(element).autoResize(options);
    }
};
按如下方式更新您的视图:

<div data-bind="foreach: Rows" >
  <textarea data-bind="jqAutoresize: {}, value: RowText" ></textarea>
</div>

我强烈建议不要使用事件触发调整大小。相反,您可以使用
textInput
绑定来跟踪可观察对象中的输入,并订阅其中的更改

下面是一个例子:

<textarea data-bind="textInput: value, autoResize: value"></textarea>
这是因为:

  • textInput
    绑定将任何输入更改写入可观察的
    变量
  • computed
    使用此值触发调整大小。这将自动创建订阅
这比
keydown
方法要好,因为它可以处理
鼠标右键>剪切

显示
事件
等效事件的示例:

var resizeToFitContent=函数(el){
// http://stackoverflow.com/a/995374/3297291
el.style.height=“1px”;
el.style.height=el.scrollHeight+“px”;
}
ko.bindingHandlers.autoResize={
init:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
ko.computed(函数(){
ko.展开(valueAccessor());
树脂含量(元素);
})
}
};
ko.applyBindings({
价值:可观测(“测试”),
onKey:函数(数据、事件){
resizeToFitContent(event.target);
} 
});


非常感谢您回答我的问题,我对击倒js还不熟悉。它不起作用,如何在autoresize()上创建自定义绑定?您介意在JSFIDLE中设置它吗?在敲除中使用绑定处理程序绝对是一种方法。要真正检查文本区域是否需要调整大小,需要获取文本区域的值并检查字符串的长度。然后,您可能需要就何时扩大文本区域的大小做出明智的决定。基本上,您需要将
textarea.value.length
textarea.rows
ko.bindingHandlers.autoResize = {
  init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    ko.computed(function() {
      ko.unwrap(valueAccessor());
      resizeToFitContent(element);
    })
  }
};