KnockoutJs Курсор потерял родительское событие клика

Вложенный div с событиями кликов.

У меня есть пара вложенных div, которые связаны с общим объектом viewModel, с которым я использую knockoutjs для привязки. У родительских и дочерних элементов есть несколько привязок, включая событие click для родительского элемента. Родительское событие div click позволяет выбрать элемент, показывающий некоторые визуальные подсказки, которые в результате по умолчанию скрыты.

Обязательный код выглядит следующим образом:

<div data-bind="foreach : cardElements">

        <div data-bind="if: isArea(),
                attr: { id : ElementName },
                visible: isArea(),
                click : selectElement.bind($data),
                css : { layoutContainer : isEditMode() && isSelected(),
                        drag: isEditMode(),
                        selectedElement : isSelected() && isEditMode() },
                style : defaultStyle()">

 ... visuals elided for clarity(hidden by default viewable when parent is selected)

        @* Regular display fields. *@
        <div data-bind="if: isInput(),
                    attr : { contenteditable : isEditMode() },
                    visible : isInput(),
                    css: { layoutDiv :  isEditMode() },
                    style: { cursor : 'text' },
                    text: Value">
        </div>


 ... visuals elided for clarity

    </div>
</div>

Фокус проблем после клика.

Удерживая кнопку мыши нажатой, вы увидите курсор (текстовый курсор), отображаемый в contenteditable div, где он должен оказаться после щелчка. После освобождения фокус теряется, а курсор исчезает (я также пытался использовать элемент ввода, и возникает та же проблема). Идея состоит в том, что mousedown / click должен поместить курсор в желаемую позицию для ввода текста.

Удаление родительского события клика

Удаление события click на родительском объекте показывает, что без него выделение внутри contenteditable div работает как задумано, и после щелчка типография может продолжаться как обычно. Однако визуальные подсказки не установлены, что является основной задачей обработчика события click!

Кто-нибудь знает, почему фокус теряется во время события щелчка?

Возможно, хак может сработать. Одним из хаков, который я еще не пытался, было бы сосредоточиться на contenteditable div, основываясь на положении курсора над самой div. Это не кажется тривиальным взломом, и я не знаю, возможно ли это.

Любая помощь будет принята с благодарностью по этому вопросу.

Возможно, ближе

Я смог сузить его, выполнив небольшое регрессионное тестирование. Если я удаляю стиль css из родительского div, он, кажется, щелкает как обычно.

убрал следующее:

 css : { layoutContainer : isEditMode() && isSelected(),
                        drag: isEditMode(),
                        selectedElement : isSelected() && isEditMode() },

Это все еще оставляет меня с неполным поведением.

Может ли это быть?

Похоже, что при добавлении родительского класса фокус теряется из contenteditable div.

Вот немного больше кода, который используется.
... // сопоставленные функции.

this.isSelected = ko.dependentObservable(function () {
    return (this === viewModel.selectedCardElement());
}, this);

this.selectElement = function (element, evt) {
     viewModel.selectedCardElement(element);
}, 

SelectElement является вызываемой функцией, и обратите внимание, что isSelected - это visibleObservable, прикрепленный к элементам карты, которые связаны в шаблоне. Мне кажется, что как только viewModel.selectedCardElement устанавливает фокус позиции каретки и теряется в представлении.

0 ответов

Другие вопросы по тегам