我观察Chrome的不良行为,当一个连接时出现2 <p>
“通过删除它们之间的间隔s。 虽然<p>
标签被适当地连接,镀铬包裹最右边的<p>
有标签的内容<span>
编辑 :发生这种情况对所有块元素,而不仅仅是p
标签。
例如 :
例如,当分离</p><p>
从以下块被删除:
<div contenteditable="true"><p>p one.</p><p>p two.</p></div>
它成为了:
<div contenteditable="true"><p>p one.<span style="font-size: 16px; line-height: 1.44;">p two.</span></p>
例如,在小提琴: 铬包装接合的内容<p>
与<span>
。
问题 :
有一种简单的方法来阻止Chrome浏览器这样做呢? 这导致了,我会很喜欢能摆脱可怕的标记。
Answer 1:
有一个办法,但你需要积极主动地设置一些样式。 这样做是为了让Chrome的风格已经照顾,所以它并不需要添加SPAN满足样式要求。 基本上,你需要将铬添加样式添加到一个跨度类的CONTENTEDITABLE DIV下(见下面的例子)。
编辑小提琴
对于您例如:
- 我添加了一个“编辑”类的CONTENTEDITABLE DIV
- 我添加了一个
.edit p, span
在风格类
这将成为:
.edit {
border: 1px solid gray;
padding: 10px;
}
.edit p, span {
line-height: 1.44; font-size: 16px;
}
而DIV:
<div contenteditable="true" class="edit">...</div>
请注意,您通常不需要的font-size: 16px;
。 我需要因为小提琴定义CONTENTEDITABLE一些字体大小添加这一项。 在一个独立的页面,我并不需要它。
您需要此Chrome“补丁”适用于它发生在哪里的任何元素(所以如果你需要UL,OL ...再加入什么是需要按照上面我举的例子逻辑)
Answer 2:
我知道这是不是真的解决它的答案,但暗示它如何能是固定的(但它是长是佩塔提克瓦的问题,我将如何解决这个问题评论)
一般情况下您会检查时这样的错误可能发生。 为的情况下, span
的创作,你会听所有keydown
和keypress
事件,并检查关键是退格/删除键或为每个插入字符,如果它是一个真正的选择键。
如果是这样的话,那么你需要检查当前的选择(插入标记的任何位置,或真正的选择),那么你知道这是紧随的文本元素或节点。 那么你需要检查在下届keypress
和keyup
如果有一个span
您的插入关口后直接创建。 根据浏览器的bug,你需要一些进一步的检查。 如果有一个重新创建展开其内容。 additionale Mutation
可用于活动和辅助属性。
但我必须说,我在做这个我自己放弃了,并切换至CKEditor的4大部分它的功能我不需要,这是一个非常大的图书馆。 但这样的bug数量庞大的事业,我没有看到我的另一个解决方案。
编辑在这里显示了可变的事件的想法爵士小提琴的更新: http://jsfiddle.net/THPmr/6/
但是,这并不是子弹校对,它只是显示它如何能achived(仅适用于Chrome 27.0.1422.0测试,如果有更多然后一个文本元素被包含在第二可能无法奏效p
)
Answer 3:
下面是我对去除多余的跨度
document.querySelector('[contenteditable=true]')
.addEventListener('DOMNodeInserted', function(event) {
if (event.target.tagName == 'SPAN') {
event.target.outerHTML = event.target.innerHTML;
}
});
Answer 4:
CSS的影响是怎样的标记是CONTENTEDITABLE里面做:
格,预{边界:1px的实心灰色; 填充:10px的; 行高:1.44; }
删除线高线,不会出现问题了。
有一般的几个错误与CONTENTEDITABLE有关默认样式: 如何避免WebKit的CONTENTEDITABLE复制粘贴导致不必要的CSS?
编辑的jsfiddle间接影响本(tinkerbin行为会有所不同),因为它的CSS(normalize.css)的。 试试这个:
- 运行您的提琴
- 检查一个
<p>
- 禁用所有
font-size
在CSS层叠声明-包括你的line-height - 做退格
- 没有内嵌跨度
解决方法1:使用类和id的。
不要为声明字体大小p
或div
但p.main-content
,或者更简单地说, .main-content
。 如果CONTENTEDITABLE里面的元素的字体大小从浏览器的内部默认CSS来之后,Chrome将不会增加额外的标记/联样式。
方案2:使用消毒剂。
我会亲自去与#1,因为它是从来没有一个很好的做法,指定字体大小,并在这样的通用标签错字。
Answer 5:
我迄今发现的最好办法就是听DOMNodeInserted并检查标记名。 如果它是一个跨度,您可以删除标记,但留下的内容。 这也使光标移动到正确的位置。
function unwrap(el, target) {
if ( !target ) {
target = el.parentNode;
}
while (el.firstChild) {
target.appendChild(el.firstChild);
}
el.parentNode.removeChild(el);
}
var AutoFix = true;
document.getElementById('editable')
.addEventListener('DOMNodeInserted', function(ev) {
if ( !AutoFix ) {
return;
}
if ( ev.target.tagName=='SPAN' ) {
unwrap(ev.target);
}
});
我添加了一个布尔“自动更正”,以便您可以禁用当你需要插入一个跨度自动DOM改变,因为任何改变DOM触发这个事件。 例如,如果你有一个工具栏,允许用户插入类似的<span class =“亮点”> ... </ SPAN>。
该代码在IE或Firefox没有副作用,据我可以看到。
Answer 6:
这使我恼火为好,但我发现,工作得很好,现在的解决方案。
$('#container span').filter(function() {
$(this).removeAttr("style");
return $(this).html().trim().length == 0;
}).remove();
我只是删除跨度元素的样式标签,如果它是空的完全删除。 你可以根据属性的风格可能过滤,但我已经在做一个循环来检查,删除空的跨度,我认为这是最好的在同一时间做两件事。
它创建一个微秒闪烁时铬首先尝试插入承袭跨度风格,但你只能看到一次立即删除后。
它不是完美的,但它的快速和简洁。
Answer 7:
发现从张贴在某人的博客评论此链接:
(修正了最新的WebKit版本会产生span元素...) https://github.com/tinymce/tinymce/commit/8e6422aefa9b6cc526a218559eaf036f1d2868cf
Answer 8:
请在这里看到答案: https://stackoverflow.com/a/24494280/2615633要解决,你可能只是用这个插件的问题: jquery.chromeinsertfix
文章来源: Prevent Chrome from wrapping contents of joined
with a