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.

Author: David, 2012-02-01

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);
    }
});
 23
Author: Tim Down,
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)

 149
Author: moje,
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.
 27
Author: Craig Stuntz,
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";}
 22
Author: amwinter,
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.

Codepen

 8
Author: ramo,
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 */
}

Demo: http://codepen.io/flesler/pen/AEIFc

 7
Author: wp student,
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');
    }
});

DEMO: http://jsfiddle.net/Tomer123/D78X7/

 4
Author: surfs up,
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

 1
Author: Phitha,
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>');
    }
});
 0
Author: thecodeparadox,
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.

 0
Author: Ganesh S,
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