键入时格式化contentEditable元素

时间:2010-12-15 23:53:55

标签: javascript html wysiwyg contenteditable

我基本上想要做一些非常简单的事情:我希望用户输入一条推文,在140个字符之后,我希望将被剪切掉的文本变为灰色。 应该简单吧?

我正在使用contentEditable属性进行格式化。在keyup事件中,我检查文本是否太长,如果是这种情况,则将额外的字符移动到<span>。但是,选择在途中会丢失。

我已经尝试了很多东西(包括this),但没有任何效果 - 你能帮助我吗?如果你能给出一个有效的例子,我想这对我最有帮助。

3 个答案:

答案 0 :(得分:1)

我接受了这个因为我感兴趣。这是一个令人讨厌的大量代码,但事实就是如此。我的新版本不使用Rangy的saveSelection(),但确实使用其跨浏览器Range支持IE兼容性。这里发布的代码太多了,所以我只是链接到jsfiddle:http://jsfiddle.net/timdown/g7KJ5/9/

答案 1 :(得分:0)

我已经给joey发了电子邮件,但请看一下:

https://gist.github.com/746962

答案 2 :(得分:0)

我现在尝试了一种新的方法,这就是我提出的方法:

$.fn.softlimit = function(maxChars, wrapElement, wrapAttributes) {
    var lastHTML, that = this[0];

    setInterval(function() {
        //Only trigger on change
        if (lastHTML == that.innerHTML) return;
        lastHTML = that.innerHTML;

        // Save the selection
        var savedSel = rangy.saveSelection();

        // Strip HTML and extract rangy markers
        var markers = [ ], text = '', htmlPos = 0;

        function escapeForHTML(text) {
            return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;');
        }

        function processNode(node) {
            if (node.nodeType == 3) 
                text += escapeForHTML(node.nodeValue);
            else if (node.nodeName == 'SPAN' && node.id && node.id.indexOf('selectionBoundary_') === 0)
                markers.push({ index: text.length, html: node.outerHTML });
            else
                for (var i = 0; i < node.childNodes.length; ++i)
                    processNode(node.childNodes[i]);
        }

        processNode(that);

        // Do formatting
        var getOffset, markerOffset = 0;

        if (text.length > maxChars) {
            var startTag = '<' + wrapElement + ' ' + wrapAttributes + '>';
            var endTag = '</' + wrapElement + '>';

            text = text.substr(0, maxChars) + startTag + text.substr(maxChars) + endTag;

            getOffset = function(index) {
                if (index > maxChars) return startTag.length;
                else return 0;
            };
        }
        else
            getOffset = function() { return 0; };

        // Re-inject markers
        for (var i = 0; i < markers.length; ++i) {
            var marker = markers[i];
            var index = marker.index + getOffset(marker.index) + markerOffset;

            text = text.substr(0, index) + marker.html + text.substr(index);
            markerOffset += marker.html.length;
        }

        that.innerHTML = text;

        // Restore the original selection 
        rangy.restoreSelection(savedSel);
    }, 20);

    return $(this);
};

感谢@Tim Down提示标记的提示,这是至关重要的线索!

相关问题