Установить фокус на элемент contenteditable div - PullRequest
60 голосов
/ 05 марта 2010

У меня есть <div contenteditable=true>, где я определяю с помощью WYSIWYG некоторые элементы. Например, <p>, <h1> и т. Д. Я бы хотел сосредоточиться непосредственно на одном из этих элементов.

Например, на <p id="p_test">. Но похоже, что функция focus() не работает на <div> элементах, <p> элементах ...

Есть ли другое средство для определения фокуса в моем случае?

Ответы [ 7 ]

41 голосов
/ 11 мая 2016

Старый пост, но ни одно из решений не помогло мне. Я понял это в конце концов, хотя:

var div = document.getElementById('contenteditablediv');
setTimeout(function() {
    div.focus();
}, 0);
33 голосов
/ 31 мая 2013

В современных браузерах вы можете использовать:

var p = document.getElementById('contentEditableElementId'),
    s = window.getSelection(),
    r = document.createRange();
r.setStart(p, 0);
r.setEnd(p, 0);
s.removeAllRanges();
s.addRange(r);

Но если ваш элемент пуст, у меня странные проблемы так что для пустых элементов вы можете сделать это:

var p = document.getElementById('contentEditableElementId'),
    s = window.getSelection(),
    r = document.createRange();
p.innerHTML = '\u00a0';
r.selectNodeContents(p);
s.removeAllRanges();
s.addRange(r);
document.execCommand('delete', false, null);

После удаления курсор остается внутри элемента p

P.S. просто обычное пространство не работает для меня

27 голосов
/ 05 февраля 2013

Я заметил, что jQuery focus () не работает для моего contenteditable DIV с шириной и высотой 0. Я заменил его на .get (0) .focus () - собственный метод фокусировки javascript - и он работает.

3 голосов
/ 02 марта 2016

Если кто-то, кто использует MediumEditor , который управляет элементом contenteditable, сталкивается с этой проблемой, мне помогло следующее:

editor.selectElement(editorDOMNode);
  1. editor является экземпляром MediumEditor.
  2. editorDOMNode является ссылкой на фактический contenteditable узел DOM.
  3. Также можно сосредоточиться на конкретном дочернем узле в редакторе следующим образом:

    editor.selectElement(editorDOMNode.childNodes[0]);
    
1 голос
/ 04 марта 2017

Вы можете попробовать этот код, он может автоматически фокусироваться в вашем последнем месте вставки.

let p = document.getElementById('contenteditablediv')
let s = window.getSelection()
let r = document.createRange()
r.setStart(p, p.childElementCount)
r.setEnd(p, p.childElementCount)
s.removeAllRanges()
s.addRange(r)
0 голосов
/ 02 июля 2018

В большинстве случаев, если вы не можете вызвать .focus() для элемента, это потому, что tabIndex равен -1, что означает, что клавиша табуляции не может сосредоточиться на нем, когда вы нажимаете tab для навигации.

Если изменить tabIndex на> = 0, вы сможете сосредоточиться на элементах. Если вам нужно сделать это динамически, вы можете просто добавить tabindex> = 0 к своему элементу в слушателе событий.

0 голосов
/ 21 апреля 2012

Свяжите обработчик события «click» со всеми элементами внутри contenteditable div и измените класс / стиль при нажатии (т.е. добавьте класс «focus» к элементу);

Вы можете определить для пользователя, какой элемент имеет фокус, добавив стиль, например красочную рамку или внутреннюю рамку-тень. Затем, когда вы захотите получить доступ к сфокусированному элементу в вашем скрипте jQuery, просто сделайте что-то вроде этого:

var focused = $('.focused');

...