Placeholder for contenteditable div

后端 未结 12 1536
栀梦
栀梦 2020-12-12 23:18

I have the following: FIDDLE

The placeholder works fine and dandy until you type something, ctrl + A, and delete. If you do that, th

相关标签:
12条回答
  • 2020-12-12 23:49

    I have this function, and I always use to prevent this kind of things.

    I use my function in this way:

    var notEmpty = {}
    
        notEmpty.selector = ".no-empty-plz"
        notEmpty.event = "focusout"
        notEmpty.nonEmpty = "---"
    
    
        neverEmpty(notEmpty)
    

    And I just add the no-empty-plz to the Elements I that don't want to be empty.

    /**
         * Used to prevent a element have a empty content, made to be used 
    when we want to edit the content directly with the contenteditable=true 
    because when a element is completely empty, it disappears U_U
         * 
         * @param selector
         * @param event
         * @param nonEmpty:
         *        String to be put instead empty
         */
    function neverEmpty(params) {
    
        var element = $(params.selector)
    
    
    
        $(document).on(params.event, params.selector, function() {
    
            var text = $(this).html()
            text = hardTrim(text)
    
            if ($.trim(text)  == "") {
                $(this).html(params.nonEmpty)
            }
        });
    }
    

    params is actually a json, so selector = params.selector as you can see

    And hardTrim is also another fucntion I created is like a trim but includs &nbsp and <br/>, etc

    function hardTrim(text) {
    
        if (!exists(text)) {
            return ""
        }
        text = text.replace(/^\&nbsp\;|<br?\>*/gi, "").replace(/\&nbsp\;|<br?\>$/gi, "").trim();
    
        return text
    }
    
    0 讨论(0)
  • 2020-12-12 23:58

    I've created a live demo: "Placeholder for content-editable divs", by HTML & CSS.
    Also, Codepen: https://codepen.io/fritx/pen/NZpbqW
    Ref: https://github.com/fritx/vue-at/issues/39#issuecomment-504412421

    .editor {
      border: solid 1px gray;
      width: 300px;
      height: 100px;
      padding: 6px;
      overflow: scroll;
    }
    [contenteditable][placeholder]:empty:before {
      content: attr(placeholder);
      position: absolute;
      color: gray;
      background-color: transparent;
    }
    <textarea class="editor"
      placeholder="Textarea placeholder..."
    ></textarea>
    <br/>
    <br/>
    <div class="editor"
      contenteditable
      placeholder="Div placeholder..."
      oninput="if(this.innerHTML.trim()==='<br>')this.innerHTML=''"
    ></div>

    0 讨论(0)
  • 2020-12-12 23:58

    This solution worked for me. I'd converted this solution from angular to pure javaScript

    In .html

    <div placeholder="Write your message.." id="MyConteditableElement" onclick="clickedOnInput = true;" contenteditable class="form-control edit-box"></div>
    

    In .css

    .holder:before {
        content: attr(placeholder);
        color: lightgray;
        display: block;
        position:absolute;    
        font-family: "Campton", sans-serif;
    }
    

    in js.

    clickedOnInput:boolean = false;
    charactorCount:number = 0;
    let charCount = document.getElementsByClassName('edit-box')[0];
    
    if(charCount){
    this.charactorCount = charCount.innerText.length;
    }
    
    if(charactorCount > 0 && clickedOnInput){
    document.getElementById("MyConteditableElement").classList.add('holder');
    }
    
    if(charactorCount == 0 && !clickedOnInput){
    document.getElementById("MyConteditableElement").classList.remove('holder');
    }
    
    getContent(innerText){
      this.clickedOnInput = false;
    }
    
    0 讨论(0)
  • 2020-12-13 00:01

    some fixes:

    1) $element.text().trim().length - it solved problems with <div><br/></div> and &nbsp;

    2) data-placeholder attr instead of placeholder - it is true way

    3) common selector $("[contenteditable]") - it is true way

    4) display: inline-block; - fix for Chrome and Firefox

    JavaScript:

    jQuery(function($){
        $("[contenteditable]").blur(function(){
            var $element = $(this);
            if ($element.html().length && !$element.text().trim().length) {
                $element.empty();
            }
        });
    });
    

    HTML:

    <div data-placeholder="Type something..." contenteditable="true"></div>
    

    CSS:

    [contenteditable]:empty:before {
        content: attr(data-placeholder);
        color: grey;
        display: inline-block;
    }
    
    0 讨论(0)
  • 2020-12-13 00:03
    <div id="write_comment" contenteditable="true"></div>
    
    var placeholderCommentText = 'Comment...',
        placeholderComment = $('#write_comment').attr('placeholder', placeholderCommentText);
    
    $('#write_comment').text(placeholderCommentText);
    
    $('[contenteditable]').bind({
        focus: function(){
            if ($('#write_comment').text().length == 0 || $('#write_comment').text() == $('#write_comment').attr('placeholder')) {
                $(this).empty();
            }
            $(this).keyup(function(){
                if ($('#write_comment').text() == $('#write_comment').attr('placeholder')){
                    $('#write_comment').attr('placeholder','');
                } else if ($('#write_comment').text().length == 0 ) {
                    $('#write_comment').attr('placeholder', placeholderCommentText);
                }
            });
        },
        focusout: function(){
            if ($('#write_comment').text().length == 0) { 
                $(this).text($(this).attr('placeholder'));
            }
        }
    });
    
    0 讨论(0)
  • 2020-12-13 00:05

    Updating Christian Brink's answer, you could/should check for more events. You can do so by simply doing:

    // More descriptive name
    var $input = $(".placeholder");
    function clearPlaceHolder() {
      if ($input.text().length == 0) {
        $input.empty();
        }
      }
    
    // On each click
    $input.keyup(clearPlaceHolder);
    
    // Probably not needed, but just in case
    $input.click(clearPlaceHolder);
    
    // Copy/paste/cut events http://stackoverflow.com/q/17796731
    $input.bind('input', (clearPlaceHolder));
    
    // Other strange events (javascript modification of value?)
    $input.change(clearPlaceHolder);
    

    Finally, the updated JSFiddle

    0 讨论(0)
提交回复
热议问题