Here is a CSS only solution augmenting some of the other answers:-
<div contentEditable=true data-ph="My Placeholder String"></div>
<style>
[contentEditable=true]:empty:not(:focus)::before{
content:attr(data-ph)
}
</style>
EDIT: Here is my snippet on codepen -> http://codepen.io/mrmoje/pen/lkLez
EDIT2: Be advised, this method doesn’t work 100% for multi-line applications due to residual <br>
elements being present in the div after performing a select-all-cut
or select-all-delete
on all lines. Credits:- @vsync
Backspace seems to work fine (at least on webkit/blink)