Заполнитель для контент-контента - проблема фокуса
Я пытался задать это раньше, без ведома объяснения/доказательства рабочего примера, где ошибка происходит. Итак, вот еще одна попытка:
Я пытаюсь реплицировать эффект замещающего объекта на контентную DIV. Основная концепция проста:
<div contenteditable><em>Edit me</em></div>
<script>
$('div').focus(function() {
$(this).empty();
});
</script>
Это может работать sometomes, но если заполнитель содержит HTML-код, или если какая-либо другая обработка выполнена, редактируемый текстовый курсор DIVs удаляется, и пользователь должен повторно щелкнуть редактируемый DIV, чтобы начать вводить текст ( даже если он все еще находится в фокусе):
Пример: http://jsfiddle.net/hHLXr/6/
Я не могу использовать триггер фокуса в обработчике, так как он создаст цикл событий. Поэтому мне нужен способ переустановки курсора каретки в редактируемом DIV или каким-то другим способом перефокусироваться.
Ответы
Ответ 1
Вам может потребоваться вручную обновить выбор. В IE событие фокуса слишком поздно, поэтому я бы предложил использовать событие activate
. Вот некоторый код, который выполняет задание во всех основных браузерах, включая IE <= 8 (что альтернатива только для CSS не будет):
Live demo: http://jsfiddle.net/hHLXr/12/
код:
$('div').on('activate', function() {
$(this).empty();
var range, sel;
if ( (sel = document.selection) && document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText(this);
range.select();
}
});
$('div').focus(function() {
if (this.hasChildNodes() && document.createRange && window.getSelection) {
$(this).empty();
var range = document.createRange();
range.selectNodeContents(this);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
});
Ответ 2
Вот только CSS-решение, дополняющее некоторые другие ответы: -
<div contentEditable=true data-ph="My Placeholder String"></div>
<style>
[contentEditable=true]:empty:not(:focus)::before{
content:attr(data-ph)
}
</style>
EDIT: Вот мой фрагмент кода → http://codepen.io/mrmoje/pen/lkLez
EDIT2: следует помнить, что этот метод не работает на 100% для многострочных приложений из-за остаточных элементов <br>
, присутствующих в div после выполнения select-all-cut
или select-all-delete
на всех строках. Кредиты: - @vsync
Backspace, кажется, работает нормально (по крайней мере, на webkit/blink)
Ответ 3
Я только опубликовал плагин для этого.
Он использует комбинацию CSS3 и JavaScript для показа заполнителя без добавления к содержимому div
:
HTML:
<div contenteditable='true' data-placeholder='Enter some text'></div>
CSS
div[data-placeholder]:not(:focus):not([data-div-placeholder-content]):before {
content: attr(data-placeholder);
float: left;
margin-left: 5px;
color: gray;
}
JS:
(function ($) {
$('div[data-placeholder]').on('keydown keypress input', function() {
if (this.textContent) {
this.dataset.divPlaceholderContent = 'true';
}
else {
delete(this.dataset.divPlaceholderContent);
}
});
})(jQuery);
И что это.
Ответ 4
просто используйте псевдо-классы css.
span.spanclass:empty:before {content:"placeholder";}
Ответ 5
Я обнаружил, что лучший способ сделать это - использовать атрибут placeholder
, как обычно, и добавить несколько строк CSS.
HTML
<div contenteditable placeholder="I am a placeholder"></div>
CSS
[contenteditable][placeholder]:empty:before {
content: attr(placeholder);
color: #bababa;
}
Примечание. Селектор CSS :empty
работает только в том случае, если между открывающим и закрывающим тегами буквально ничего не происходит. Это включает новые строки, вкладки, пустое пространство и т.д.
Codepen
Ответ 6
Все, что вам нужно, это небольшое решение
[contenteditable=true]:empty:before{
content: attr(placeholder);
display: block; /* For Firefox */
}
Демо: http://codepen.io/flesler/pen/AEIFc
Ответ 7
Вот мой способ:
Он использует комбинацию jQuery и CSS3. Работает точно так же, как и атрибут html5..
- Скрывается сразу после ввода первой буквы
- Показывает себя снова, когда вы удаляете то, что вы вводили в него
HTML:
<div class="placeholder" contenteditable="true"></div>
CSS3:
.placeholder:after {
content: "Your placeholder"; /* this is where you assign the place holder */
position: absolute;
top: 10px;
color: #a9a9a9;
}
JQuery
$('.placeholder').on('input', function(){
if ($(this).text().length > 0) {
$(this).removeClass('placeholder');
} else {
$(this).addClass('placeholder');
}
});
DEMO: http://jsfiddle.net/Tomer123/D78X7/
Ответ 8
Вот исправление, которое я использовал.
<div contenteditable><em>Edit me</em></div>
<script>
$('div').focus(function() {
var target = $(this);
window.setTimeout(function() { target.empty(); }, 10);
});
</script>
Я разработал для этого плагин jQuery. Взгляните https://github.com/phitha/editableDiv
Ответ 9
var curText = 'Edit me';
$('div').focusin(function() {
if ($(this).text().toLowerCase() == curText.toLowerCase() || !$(this).text().length) {
$(this).empty();
}
}).focusout(function() {
if ($(this).text().toLowerCase() == curText.toLowerCase() || !$(this).text().length) {
$(this).html('<em>' + curText + '</em>');
}
});
Ответ 10
Это не точное решение вашей проблемы.
в параметрах summernote set
airMode: истинно
Заполнитель работает таким образом.