Tại sao trong ví dụ này http://jsfiddle.net/JksKx/8/ div con trỏ bị mất khi tôi viết văn bản? Cách khắc phục hành vi như vậy?Nội dung loại bỏ nội dung có thể chỉnh sửa có thể chỉnh sửa
6
A
Trả lời
15
Sự kiện khóa đang kích hoạt và ghi vào chế độ xem của bạn, sau đó kích hoạt chức năng cập nhật của liên kết tùy chỉnh. Điều này đang viết innerHTML trở lại phần tử, điều này khiến bạn mất tập trung.
Sửa lỗi dễ dàng là kiểm tra chức năng cập nhật nếu phần tử.bắt đầuHTML đã giống với giá trị bạn muốn đặt.
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;
}
}
};
3
thể muốn thay đổi KeyDown để KeyUp, nhưng khác hơn là hoạt động thực sự tốt =)
ko.utils.registerEventHandler(element, "keyup", function() {
Hai điều tôi nhận thấy trên contenteditable này ràng buộc: 1. Hãy chắc chắn rằng dữ liệu -bind không nằm trong phần tử có thuộc tính có thể chỉnh sửa được. Phần tử có nội dung có thể chỉnh sửa sẽ không kích hoạt sự kiện quan trọng. 2. Nếu người dùng nhấp chuột phải vào phần tử và dán văn bản, điều này sẽ không cập nhật giá trị. bấm vào sự kiện cũng nên được chỉ định. Ngoài ra, nếu sử dụng các nút như sự kiện nhấp chuột "in đậm" sẽ bị ràng buộc với nội dung hoặc nội dung tương tự. –
Việc sử dụng tiêu điểm dường như hoạt động cho các sự kiện nhấp "đậm" và các sự kiện tương tự khác. ko.utils.registerEventHandler (phần tử, "focus", updateHandler); – Piercy