我正在尝试在SCEditor上实现一些maxlength函数,该函数未考虑原始textarea maxlength属性。

届时,我将使用SelectionchangedEvent处理程序,以获取值并在必要时将其子字符串化,然后从SCEditor API中将其替换为val()。

到目前为止,该方法仍然有效,但是val()函数将设置值并将尖号放置在开头,因此,如果用户继续写入,它将在顶部进行写操作,然后在底部进行子字符串设置,并将尖号设置回顶部,即上一行的上一行。
我不要那个!

所以我遇到了像这样的解决方案:stackoverflow

这似乎并不不幸:jsfiddle



var instance = $('textarea').sceditor({
    plugins: 'bbcode',
    width: '100%',
    style: 'http://www.sceditor.com/minified/jquery.sceditor.default.min.css'
}).sceditor('instance');

$('#caretend').click(function() {
    placeCaretAtEnd(instance);
});

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el.getBody().get(0));
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el.getBody().get(0));
        textRange.collapse(false);
        textRange.select();
    }
}

<link href="http://www.sceditor.com/minified/jquery.sceditor.default.min.css" rel="stylesheet"/>

<div><a href="#" id="caretend">Place caret at end</a></div>
<div><textarea></textarea></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.sceditor.com/minified/jquery.sceditor.bbcode.min.js"></script>





我在这里想念什么吗?还是仅仅是该插件与功能冲突?

最后,我还在这里找到了一些有趣的文章:stackoverflow,但是我看不到如何以预期的方式使用它。

任何建议都非常欢迎,非常感谢。

最佳答案

好吧,终于找到了方法,希望这对以后的人有所帮助!

这是我的解决方案,关于如何限制SCEditor上的输入长度

创建一个标记数组,该标记数组将用于检测contenteditable上的更改,我发现它比普通处理程序更有效并且与浏览器兼容。

var sceFlag = { "id1" : 0, "id2" : 0 (...) };


函数placeCaretAtEnd:

function placeCaretAtEnd(instance){
    var rangeHelper = instance.getRangeHelper();
    var range = rangeHelper.cloneSelected();
    if ('selectNodeContents' in range) {
      var bodyChildren = instance.getBody()[0].children;
       range.selectNodeContents(bodyChildren[bodyChildren.length - 1]);
      range.collapse(false);
      rangeHelper.selectRange(range);
    }


如果超过最大长度,则函数将子字符串值细分:

function SCElength(instance,len){
  var d = len - instance.val().length;
  if(d<0){
  instance.val(instance.val().substr(0,len));
  placeCaretAtEnd(instance);
}


侦听焦点和模糊事件并检查contenteditable是否已更改的功能:

function SCEFocusBlur(instance,len,id){
instance.getBody()
    .focus(function() {
        sceFlag[id] = 1;
        checkSCEInput(instance,len,id);
        $(this).data("initialText", $(this).html());
    });
instance.getBody()
    .blur(function() {
        sceFlag[id] = 0;
        if ($(this).data("initialText") !== $(this).html()) {
            checkSCEInput(instance,len,id);
        }
    });


标志为1时递归检查值的功能

function checkSCEInput(instance,len,id){
if(sceFlag[id] = 1){
    SCElength(instance,len);
    setTimeout(function() {
        checkSCEInput(instance,len);
    }, 1000);
}


然后,您需要做的就是创建像这样的sceditor:

$("textarea").sceditor({
        plugins: "bbcode",
        style: "css/sceditor.min.css",
        width: "auto",
        height: "110",
        toolbar:"bold,italic,underline,strike,subscript,superscript|left,center,right,justify|size,color,removeformat|bulletlist,orderedlist,horizontalrule,emoticon",
    });


并使用实例,maxlength int和与该标志关联的id调用SCEFocusBlur:

SCEFocusBlur($("textarea").sceditor('instance'),maxlength,id);


关于它的任何想法都非常欢迎!
祝你有美好的一天 :)

07-24 17:18