Placeholder in contenteditable - focus Event issue
Próbowałem zapytać o to wcześniej, bez powodzenia wyjaśniając/udowadniając działający przykład, gdzie występuje błąd. Oto kolejna próba:
Próbuję odtworzyć efekt zastępczy na CONTENTEDITABLE DIV. Podstawowa koncepcja jest prosta:
<div contenteditable><em>Edit me</em></div>
<script>
$('div').focus(function() {
$(this).empty();
});
</script>
Może to zadziałać, ale jeśli element zastępczy zawiera HTML, lub jeśli zostanie wykonane inne przetwarzanie, edytowalny div jest usuwany, a użytkownik musi ponownie kliknąć edytowalny DIV, aby móc zacznij pisać (nawet jeśli nadal jest w centrum uwagi):
Przykład: http://jsfiddle.net/hHLXr/6/
Nie mogę użyć wyzwalacza Fokusa w programie obsługi, ponieważ utworzy on pętlę zdarzeń. Więc potrzebuję sposobu, aby ponownie ustawić kursor caret w edytowalnym DIV, lub w inny sposób re-focus.
10 answers
Być może trzeba będzie ręcznie zaktualizować wybór. W IE Zdarzenie focus jest za późno, więc sugerowałbym użycie zdarzenia activate
. Oto kod, który działa we wszystkich głównych przeglądarkach, w tym IE
Live demo: http://jsfiddle.net/hHLXr/12/
Kod:
$('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);
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 11:39:24
Tutaj jest tylko rozwiązanie CSS rozszerzające niektóre z innych odpowiedzi:-
<div contentEditable=true data-ph="My Placeholder String"></div>
<style>
[contentEditable=true]:empty:not(:focus)::before{
content:attr(data-ph)
}
</style>
EDIT: Oto mój fragment na codepen - > http://codepen.io/mrmoje/pen/lkLez
EDIT2: uwaga, ta metoda nie działa w 100% dla aplikacji wielowierszowych z powodu pozostałości <br>
elementów obecnych w div po wykonaniu select-all-cut
lub select-all-delete
na wszystkich liniach. Kredyty: - @vsync
Backspace wydaje się działać dobrze (przynajmniej na webkit/blink)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-12 10:45:52
Właśnie opublikowałem wtyczkę do tego .
Używa kombinacji CSS3 i JavaScript, aby pokazać symbol zastępczy bez dodawania do zawartości 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);
I to wszystko.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 22:09:00
Po prostu użyj pseudo-klas css.
span.spanclass:empty:before {content:"placeholder";}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 17:01:29
Odkryłem, że najlepszym sposobem na to jest użycie atrybutu placeholder
Jak zwykle i dodanie kilku linii CSS.
HTML
<div contenteditable placeholder="I am a placeholder"></div>
CSS
[contenteditable][placeholder]:empty:before {
content: attr(placeholder);
color: #bababa;
}
Uwaga: selektor CSS :empty
działa tylko wtedy, gdy pomiędzy znacznikiem otwarcia i zamknięcia nie ma dosłownie nic. Dotyczy to nowych linii, tabulatorów, pustych spacji itp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 12:38:44
Wszystko czego potrzebujesz to małe rozwiązanie
[contenteditable=true]:empty:before{
content: attr(placeholder);
display: block; /* For Firefox */
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-12 16:42:28
Here ' s my way:
Używa kombinacji jQuery i CSS3. działa dokładnie tak jak atrybut zastępczy html5!.
- ukrywa się od razu po wpisaniu pierwszej litery
- pojawia się ponownie, gdy usuniesz to, co do niego wpiszesz
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');
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-24 06:41:24
Oto poprawka, której użyłem.
<div contenteditable><em>Edit me</em></div>
<script>
$('div').focus(function() {
var target = $(this);
window.setTimeout(function() { target.empty(); }, 10);
});
</script>
Opracowałem do tego wtyczkę jQuery. Spójrz https://github.com/phitha/editableDiv
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 16:18:36
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>');
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-01 10:04:41
To nie jest dokładne rozwiązanie twojego problemu ..
In summernote options set
airMode: true
Placeholder działa w ten sposób.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-10 11:07:03