contenteditable区域中,如果粘贴具有URL属性的元素,则在某些浏览器中,它将URL从相对转换为绝对。
我已经阅读了一些错误报告,声称它们在最新版本中已“修复”,但事实并非如此。
我把这个小提琴放在一起来演示:Hurray for Demos!
它在那里,丑陋,我想知道修复它的最佳方法是什么。

首先想到的是onpaste,在当前节点中找到所有anchors,然后找到parse it with regex。我想这不是理想的方法,但是可能有效。

???

???


我真的希望他们只是放任自己,不要用contenteditable造成太多与浏览器相关的问题,但是我想这样做会太容易了。
对解决此问题的最佳方法有何想法?

最佳答案

CKEditor在让浏览器中断数据之前,将所有srcnamehref属性复制到data-cke-saved-src|href属性。不幸的是,由于数据是字符串,因此必须由regexp完成。您可以在这里找到代码:/core/htmldataprocessor.js#L772-L783

var protectElementRegex = /<(a|area|img|input|source)\b([^>]*)>/gi,
    // Be greedy while looking for protected attributes. This will let us avoid an unfortunate
    // situation when "nested attributes", which may appear valid, are also protected.
    // I.e. if we consider the following HTML:
    //
    //  <img data-x="&lt;a href=&quot;X&quot;" />
    //
    // then the "non-greedy match" returns:
    //
    //  'href' => '&quot;X&quot;' // It's wrong! Href is not an attribute of <img>.
    //
    // while greedy match returns:
    //
    //  'data-x' => '&lt;a href=&quot;X&quot;'
    //
    // which, can be easily filtered out (#11508).
    protectAttributeRegex = /([\w-]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,
    protectAttributeNameRegex = /^(href|src|name)$/i;

function protectAttributes( html ) {
    return html.replace( protectElementRegex, function( element, tag, attributes ) {
        return '<' + tag + attributes.replace( protectAttributeRegex, function( fullAttr, attrName ) {
            // Avoid corrupting the inline event attributes (#7243).
            // We should not rewrite the existed protected attributes, e.g. clipboard content from editor. (#5218)
            if ( protectAttributeNameRegex.test( attrName ) && attributes.indexOf( 'data-cke-saved-' + attrName ) == -1 )
                return ' data-cke-saved-' + fullAttr + ' data-cke-' + CKEDITOR.rnd + '-' + fullAttr;

            return fullAttr;
        } ) + '>';
    } );
}


然后,在处理取自可编辑元素的HTML时,data-cke-saved-*属性将覆盖原始属性。

09-25 17:28