knockout.js 挖空内容可编辑绑定

zsbz8rwp  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(141)

我编写了一个自定义绑定处理程序,用于切换元素是否为contentEditable。我还希望在编辑元素的内容时更新所有html绑定,因此它会侦听输入事件并更新html绑定(如果可用)。

ko.bindingHandlers.contentEditable = {
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.unwrap(valueAccessor());
        element.contentEditable = value;

        var $element = $(element);

        if (value) {
            var allBindings = allBindingsAccessor();
            var htmlBinding = allBindings.html;

            if (ko.isWriteableObservable(htmlBinding)) {
                $element.on("input", function (event) {
                    htmlBinding(element.innerHTML);
                });
            }
        } else {
            $element.off("input");
        }
    }
};

然而,问题就在这里:

  • 用户在元素中键入内容
  • 触发输入事件
  • 更新html绑定
  • 更新元素的innerHTML
  • 光标在元素中的位置返回到开头

一把小提琴能说一千句话
我不知道该怎么处理这事。

ohfgkhjo

ohfgkhjo1#

第一个
以最小的更改完成此操作。请参阅http://jsfiddle.net/93eEr/3/
您可以将绑定处理程序命名为htmlEditable,也许这比将其命名为“lazy”更好。
注意,“input”事件并不需要每次都被绑定。当元素不可满足时,它不会触发。

e0bqpujr

e0bqpujr2#

@Tomalak的回答很完美,因此我投了赞成票。
但是对于那些来到这里的人,比如我自己:

  • 寻找一个一次性的自定义绑定
  • 它假定内容总是可编辑
  • value:风格的更新(即:在模糊上)

我的建议如下:

ko.bindingHandlers.contentEditable = {
    init: function(element, valueAccessor) {
        var value = valueAccessor();

        function onBlur(){
            if (ko.isWriteableObservable(value)) {
                value(this.innerHTML);
            }
        };                

        element.innerHTML = value(); //set initial value
        element.contentEditable = true; //mark contentEditable true
        element.addEventListener('blur', onBlur); //add blur listener
    }
};
wz1wpwve

wz1wpwve3#

在以前我有问题的bdo解决它的这个代码.也这个代码是可用的其他contentEditable.所以我建议如下:

ko.bindingHandlers.bdoValue =
 ko.bindingHandlers.contentEditable = {
      'init': function(element, valueAccessor) {
          var updateHandler = function() {
              var modelValue = valueAccessor(),
                  elementValue = element.innerHTML;
              modelValue(elementValue);
          };
          ko.utils.registerEventHandler(element, "keyup", updateHandler);
          ko.utils.registerEventHandler(element, "input", updateHandler);
      },
      'update': function(elem, valueAccessor) {
          var value = ko.utils.unwrap(valueAccessor())||"";
          var current = elem.innerHTML;
          if (value !== current) {
              elem.innerHTML = value;    
          }
      }
   };

相关问题