contenteditable中的占位符 – 焦点事件问题
我一直在试图问这个,没有任何解释/certificate错误发生的工作示例的运气。 所以这里是另一个尝试:
我试图在contenteditable DIV上复制一个占位符效果。 核心概念很简单:
<div contenteditable><em>Edit me</em></div> <script> $('div').focus(function() { $(this).empty(); }); </script>
这可能有些工作,但是如果占位符包含HTML,或者如果有其他处理正在进行,可编辑的DIV的文本插入符将被删除,并且用户必须重新点击可编辑的DIV才能开始input(即使它是仍然重点):
例如: http : //jsfiddle.net/hHLXr/6/
我不能在处理程序中使用焦点触发器,因为它会创build一个事件循环。 所以我需要一种方法在可编辑的DIV中重新设置插入光标,或者以其他方式重新对焦。
您可能需要手动更新select。 在IE中,焦点事件为时已晚,所以我build议使用activate
事件。 这里有一些代码可以在所有主stream浏览器中执行,包括IE <= 8(这是一个仅用于CSS的选项):
现场演示: 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); } });
这里是一个CSS的唯一解决scheme,增加了一些其他的答案: –
<div contentEditable=true data-ph="My Placeholder String"></div> <style> [contentEditable=true]:empty:not(:focus)::before{ content:attr(data-ph) } </style>
编辑:这是我的代码片段 – > http://codepen.io/mrmoje/pen/lkLez
编辑2:build议,这种方法不适用于多行应用程序100%,因为在所有行上执行全select-all-delete
select-all-cut
或全select-all-delete
后,残留的元素存在于div中。 积分: – @vsync
退格似乎工作正常(至less在webkit /眨眼)
我刚刚为此发布了一个插件 。
它使用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);
就是这样。
只需使用CSS伪类。
span.spanclass:empty:before {content:"placeholder";}
我发现最好的方法是像往常一样使用placeholder
属性,并添加几行CSS。
HTML
<div contenteditable placeholder="I am a placeholder"></div>
CSS
[contenteditable][placeholder]:empty:before { content: attr(placeholder); color: #bababa; }
注意:只有在开始和结束标签之间没有任何内容的情况下,CSS :empty
select器才起作用。 这包括新行,标签,空白空间等
Codepen
所有你需要的是这个小解决scheme
[contenteditable=true]:empty:before{ content: attr(placeholder); display: block; /* For Firefox */ }
演示: http : //codepen.io/flesler/pen/AEIFc
这是我的方式:
它使用了jQuery和CSS3的组合。 与html5占位符属性完全一样! 。
- 当你input第一个字母时马上隐藏起来
- 当你删除你input的内容时再次显示
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'); } });
演示: http : //jsfiddle.net/Tomer123/D78X7/
这是我使用的修复程序。
<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
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>'); } });
这不是你的问题的确切解决scheme..
在summernote选项设置
airMode:真
占位符以这种方式工作。