css – 防止contenteditable模式创建标签

前端之家收集整理的这篇文章主要介绍了css – 防止contenteditable模式创建标签前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我在div上使用浏览器contenteditable = true时,为了让用户更新其中的文本,我遇到了这个问题(使用Chrome):

当使用删除退格键删除换行符(跳回一行)时,浏览器会在该文本周围插入带有内联样式集的标签.

这真的很令人沮丧,因为它不仅仅是这样做,它还为该span标签添加了一个内联样式,例如,如果我的字体颜色当前是黑色的,那么它会为该span标签添加一个style =“color:black”.

结果是,我无法再使用工具栏编辑该文本的颜色,因为它已经通过内联样式设置为span标签.同样的事情发生在字体大小,如果我做同样的事情备份一行与删除键.

任何人都可以教我一两件关于contenteditable,或建议一种方法删除跨度,如果这是不可能的,以防止这种浏览器的行为.

**重现此问题**
– 在浏览器中创建一个div,在其上设置内联样式,例如font-size:36px
– 用浏览器编辑内容可编辑div的文本,用手工换行编写几行.
– 现在将光标置于前面/后面的一段文字,然后点击退格键.现在应该在您的光标IN FRONT OF的文本周围生成一个span标签,并且其样式已更改.

更新**
所以我尝试了几个不同的解决方案有限的成功.首先我试图删除所有标签,但是我也失去了所有的线性破解(也许更好的正则表达式可以解决这个问题,我不是regExp写作的专家).

以下所有功能都是首次调用keyup事件,但是我将其附加到取消选择文本框.如何发挥以下功能与问题无关.

//option to remove all tags
        var withTags = $(textObject).html();
        var withoutTags = withTags.replace(/<(?:.|\n)*?>/gm,'');       
        $(textObject).html(withoutTags);

我的第二个尝试更成功,通过删除文本框下面的对象的样式标签(divs ans跨越chrome添加的文本框),这里是我的第一个代码

//option to remove style of elements
        $(textObject).children().each(function() {
            $(this).removeAttr('style');
            console.log('removing style from first level element: '+this);

        });

然后我意识到每次编辑文本框时,chrome都可能会添加一个新的嵌套级别的div / span标签,以上代码将无法访问,所以我这样做:

//option to remove style of elements
        $(textObject).children().each(function() {
            $(this).removeAttr('style');
            console.log('removing style from first level element: '+this);

            //And of course it would be all too easy if chrome added only one level of elements...
            $(this).children().each(function() {
                $(this).removeAttr('style');
                console.log('removing style from second level element: '+this);
            });

        });

但这是不够的,因为嵌套的数量在理论上可以是无限的.仍然在一个更好的解决方案.任何输入都赞赏=)

解决方法

实际上,问题在于,它不仅插入了span和p,而且如果碰巧复制一个表,它将会将整个表与tbody和row一起插入.
所以,我找到为我工作的唯一选择是这样的:
$(document).on("DOMNodeInserted",$.proxy(function (e) {
        if (e.target.parentNode.getAttribute("contenteditable") === "true") {
            with (e.target.parentNode) {
                replaceChild(e.target.firstChild,e.target);
                normalize();
            }
        }
},this));

是的,这有点影响了页面性能,但是它阻止了将表格和内容插入到contenteditable中.

更新:
上述脚本只处理基本情况,当您希望的内容被包裹在一个跨度/ p标签级别时.但是,如果您从Word中复制Word,则可能会复制甚至整个表格.
所以,这里是处理我迄今为止抛出的一切的代码

$(document).on("DOMNodeInserted",$.proxy(function (e) {
    if (e.target.parentNode.getAttribute("contenteditable") === "true") {
        var newTextNode = document.createTextNode("");
        function antiChrome(node) {
            if (node.nodeType == 3) {
                newTextNode.nodeValue += node.nodeValue.replace(/(\r\n|\n|\r)/gm,"")
            }
            else if (node.nodeType == 1 && node.childNodes) {
                    for (var i = 0; i < node.childNodes.length; ++i) {
                        antiChrome(node.childNodes[i]);
                    }
            }
        }
        antiChrome(e.target);

        e.target.parentNode.replaceChild(newTextNode,e.target);
    }
},this));

此外,您可以随意修改中间的正则表达式,您可以以任何方式删除在您的案例中特别危险的符号.

更新2
经过思考一段时间后,我已经把上面的代码包装成了简单的jQuery插件来简化使用.这是GitHub link

猜你在找的CSS相关文章