【发布时间】:2011-12-15 19:31:10
【问题描述】:
为什么在这个例子中http://jsfiddle.net/JksKx/8/ div 在我写文本时丢失了光标?如何解决这种行为?
【问题讨论】:
标签: javascript knockout.js contenteditable
为什么在这个例子中http://jsfiddle.net/JksKx/8/ div 在我写文本时丢失了光标?如何解决这种行为?
【问题讨论】:
标签: javascript knockout.js contenteditable
keyup 事件正在触发并写入您的视图模型,然后触发自定义绑定的更新功能。这是将 innerHTML 写回元素,这会导致您失去焦点。
一个简单的解决方法是检查更新函数是否 element.innerHTML 已经与您要设置的值相同。
http://jsfiddle.net/rniemeyer/JksKx/9/
ko.bindingHandlers.htmlValue = {
init: function(element, valueAccessor, allBindingsAccessor) {
ko.utils.registerEventHandler(element, "keydown", function() {
var modelValue = valueAccessor();
var elementValue = element.innerHTML;
if (ko.isWriteableObservable(modelValue)) {
modelValue(elementValue);
}
else { //handle non-observable one-way binding
var allBindings = allBindingsAccessor();
if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].htmlValue) allBindings['_ko_property_writers'].htmlValue(elementValue);
}
}
)
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()) || "";
if (element.innerHTML !== value) {
element.innerHTML = value;
}
}
};
【讨论】:
可能想将 keydown 更改为 keyup,但除此之外效果很好 =)
ko.utils.registerEventHandler(element, "keyup", function() {
【讨论】: