HTML5内容列表后的可编辑段落

时间:2012-10-19 05:57:12

标签: javascript jquery wysiwyg contenteditable html-editor

我使用谷歌浏览器。

我需要一个非常小的HTML编辑器,我找到了Simple Edit。非常小的编辑器,只是为了我的需要。但是......使用内容可编辑的这个和许多其他编辑器有一个共同的问题。

问题

创建一个列表(在最后一个列表项上输入两次)后,它会创建一个新的div。我预计会创建一个新的段落标记。

链接

问题

防止div的正确方法是什么,而是在列表后添加段落标记?

5 个答案:

答案 0 :(得分:5)

Bryan Allo发布的答案没有考虑到你需要将光标放在div的末尾。否则,每次替换操作时,用户都必须按CTRL-End。

这是我提出的解决方案,也可以在http://jsfiddle.net/82dS6/中看到:

function setEndOfContenteditable(contentEditableElement){
    // Taken from http://stackoverflow.com/a/3866442/1601088
    var range,selection;
    if(document.createRange){//Firefox, Chrome, Opera, Safari, IE 9+
        range = document.createRange();
        range.selectNodeContents(contentEditableElement);
        range.collapse(false);
        selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
    }
    else if(document.selection){//IE 8 and lower
        range = document.body.createTextRange();
        range.moveToElementText(contentEditableElement);
        range.collapse(false);
        range.select();
    }
}

function replaceDivWithP(el){

    $(el).find('div').each(function(){
        $(this).replaceWith($('<p>' + $(this).html() + '</p>'));
    });
}

$(function(){
    $(".text").simpleEdit();
});

$('.textarea').bind('keyup', function(){
    replaceDivWithP(this);
    setEndOfContenteditable(this);
});


​

答案 1 :(得分:1)

您可以考虑进行后处理,而不是每次keyup事件即时处理:

$('.textarea').bind('blur', function(){
    $('.textarea div').contents().unwrap().wrap('<p/>');
});

小提琴:http://jsfiddle.net/thNUS/4/

答案 2 :(得分:0)

快速解决方案是简单地用Ps替换任何DIV。将其放入您的内容可编辑DIV。

onkeyup="this.innerHTML=this.innerHTML.replace('div','p')"

希望它有所帮助。祝你好运。

答案 3 :(得分:0)

我能想到的最好的就是使用formatblock which has compatibility issues。基本上你可以像这样添加另一个链接:

textcontainer.prepend("<button class='paragraph'>p</button>");

...

$(".paragraph").live("click", function(){
    document.execCommand('formatblock', false, "p");
});

这为您的用户提供了插入段落标记的选项。退出该标签虽然有点棘手,但它也存在一些可用性问题。您可以在提供的演示中使用它:

演示http://jsbin.com/ovexiz/1
来源http://jsbin.com/ovexiz/1/edit

*请注意,段落的样式为绿色文本。

答案 4 :(得分:0)

以前的答案提出了基于keyupblur的解决方案。这个使用列表按钮的click事件来最小化函数调用量:

http://jsfiddle.net/9ZAL7/

function replaceDivWithP(el){

    $(el).find('div').each(function(){
        $(this).replaceWith($('<p>' + $(this).html() + '</p>'));
    });
}

$(function(){
    $(".text").simpleEdit();
});

$('button.list').bind('click', function(){
    replaceDivWithP($('.textarea'));
});
​