从包装内容物会导致Chrome的加入 用(Prevent Chrome from wrappi

2019-08-17 02:58发布

我观察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的创作,你会听所有keydownkeypress事件,并检查关键是退格/删除键或为每个插入字符,如果它是一个真正的选择键。

如果是这样的话,那么你需要检查当前的选择(插入标记的任何位置,或真正的选择),那么你知道这是紧随的文本元素或节点。 那么你需要检查在下届keypresskeyup如果有一个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)的。 试试这个:

  1. 运行您的提琴
  2. 检查一个<p>
  3. 禁用所有font-size在CSS层叠声明-包括你的line-height
  4. 做退格
  5. 没有内嵌跨度

解决方法1:使用类和id的。

不要为声明字体大小pdivp.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