3

我正在为 tinyMCE 制作一个小词预测插件,需要提取一些文本,然后从预测词列表中插入文本。插入应该没问题,因为我知道光标在哪里,可以使用mceInsertContent命令。然而,获取预测的文本......

我需要提取以光标位置之前的字母结尾并从文本开头开始的文本子集。如果需要,我可以自己去除 HTML 标签,但如果可能的话,我更喜欢让 tinyMCE 来做。

我正在考虑这样做:

  1. 使用在当前光标位置插入书签mceInsertContent
  2. 创建从文本开始到我的书签的范围。
  3. 获取范围的内容。
  4. 删除书签。

现在,由于我对 tinyMCE 不太熟悉,这对我来说是一个挑战,那么如何去做呢?

代码需要跨浏览器工作。

4

2 回答 2

8

你可以试试这个代码片段(ed 是 tinymce 编辑器对象)

A. 使用 mceInsertContent 在当前光标位置插入书签

ed.execCommand('mceInsertContent', false,'<span class="marker">\ufeff</span>');

B. 创建从文本开始到我的书签的范围。

var rng = ed.selection.getRng(1);
var rng2 = rng.cloneRange();

// set start of range to begin of forst paragraph
rng2.setStartBefore($(ed.getBody()).find('p:first').get(0));

rng2.setEndBefore($(ed.getBody()).find('span.marker').get(0));
ed.selection.setRng(rng2);

C. 获取范围的内容。

// get content of selection (range)
var content = ed.selection.getContent({format: 'text'});

D. 删除书签。

$(ed.getBody()).find('span.marker').remove();

更新:如果您担心选择更改,您可以重置您的初始范围

ed.selection.setRng(rng);
于 2012-02-07T15:47:51.513 回答
0

这是我的解决方案(当按下 Ctrl 时,该单词会显示在控制台中):

function isLetter(chr){
    if(chr.match(/[A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff]/i)){
        return true;
    }
    else{
        return false;
    }
}



var editor = tinymce.activeEditor;
var $edBody = $(editor.getBody());
editor.on('KeyUp', function(e){
    if(e.code == "ControlLeft"){
        var sel = editor.selection.getSel();
        var caretPos = sel.anchorOffset;
        var txtData = sel.anchorNode.data;
        var i = caretPos;
        var word = "";

        while(i > 0){
            if(isLetter(txtData.charAt(i))){
                word += txtData.charAt(i);
                i -= 1;
            }
            else{
                break;
            }
        }

        word = word.split("").reverse().join("");

        i = caretPos + 1;
        while(i < txtData.length){
            if(isLetter(txtData.charAt(i))){
                word += txtData.charAt(i);
                i += 1;
            }
            else{
                break;
            }
        }
        console.log(word);
    }
});

也许有一种更清洁或更优雅的方式来解决这个问题,如果是这样,请发表评论,让我们改进这个解决方案。

于 2019-07-10T15:04:42.770 回答