Получение родительского элемента события keydown, jQuery

#jquery #keydown

#jquery #keydown

Вопрос:

Я пытаюсь определить непосредственного родителя (элемент абзаца) курсора в редактируемом div, который выглядит следующим образом:

 <div id=base>
<div ce='1'  contenteditable='true'>
<p id='unique'>Paragraph one</p>
<p>Paragraph two</p>
</div>
</div>
 

Если я привязываю событие .click к div ‘ce’, то event.currentTarget сообщается как абзац, в котором происходит щелчок. Но для отслеживания курсора мне нужно использовать событие .keydown

 $('#base').on({ 
    keydown: function(event) {
        myLog(' nodeName: ' event.currentTarget.nodeName);
    },
// With the following selector the event is triggered with the cursor 
// anywhere in 'ce', and .currentTarget is the 'ce' div.
}, '[ce]');
// With this selector the event is never triggered regardless of cursor position
}, '#unique');
 

Почему событие не запускается и как я могу достичь своей цели?

Ответ №1:

Я не думаю, что вы можете получить элемент из вашего объекта event, поскольку событие запускается в #base, и поэтому #base является целью (а не текстовым узлом или абзацем).

Вы можете использовать текущее выделение, чтобы получить контейнер (textnode), который содержит курсор в момент возникновения события, и использовать этот контейнер для поиска абзаца.

Это может выглядеть так:

 $('#base').on({ 
  keydown: function(event) {
    // get current selection
    var selection = window.getSelection();
    if (selection.rangeCount === 1) {
      // get container of cursor
      var textnode = selection.getRangeAt(0).startContainer;

      // use jquery to get paragraph
      console.log($(textnode).parents('p'));
    }
  }
});
 

Это всего лишь очень простой (не кроссбраузерный) пример (протестирован в FireFox). Для реального кода вам пришлось бы выполнить еще несколько проверок, чтобы получить текущее положение курсора. Чтобы облегчить вам жизнь, вы могли бы взглянуть на rangy:

https://code.google.com/p/rangy/

Это библиотека, которая обрабатывает выборки.