Ckeditor 在tekst内部编辑器上设置选择
在CKEditor(3.6)中选择文本时遇到问题。由于我们使用纯文本,我不知道如何正确使用范围选择器 CKEditor的HTML代码:Ckeditor 在tekst内部编辑器上设置选择,ckeditor,selection,Ckeditor,Selection,在CKEditor(3.6)中选择文本时遇到问题。由于我们使用纯文本,我不知道如何正确使用范围选择器 CKEditor的HTML代码: <body spellcheck="false" class="rf-ed-b" contenteditable="true"> <br> Cross those that apply:<br> <br> <br> [«dummy»] If he/she is tall<br> <br
<body spellcheck="false" class="rf-ed-b" contenteditable="true">
<br>
Cross those that apply:<br>
<br>
<br>
[«dummy»] If he/she is tall<br>
<br>
[«dummy»] If he/she is a male<br>
<br>
[«dummy»] If he/shi is a minor<br>
<br>
Specialties:<br>
<br>
[«dummy»] «Write here the specialties if known»<br>
<br>
<br>
«You are now done with filling in this form»<br>
</body>
错误:
例外情况:索引或大小为负数或大于允许的数量
虽然完全剥离了它,但它有点起作用:
var editor = CKEDITOR.instances['MyEditor'];
var ranges = editor.getSelection().getRanges();
var startIndex = 10;
if (startIndex != -1) {
ranges[0].setStart(element.getFirst(), startIndex);
ranges[0].setEnd(element.getFirst(), startIndex + 5);
editor.getSelection().selectRanges([ranges[0]]);
}
在这里,它选择第一行的第5到第10个字符
我使用了以下来源:
我能找到的所有解决方案都适用于html节点
如何设置“«”直到下一个“»”的选择范围我已经设法解决了这个问题。同时我还将CKeditor升级到了4.0。 这不应该对解决方案产生影响 在JS中有很多代码。 在我的keybinding上,我调用以下JS函数:
getNextElement()
在这个解决方案中,它还可以在光标后面搜索,这使得它可以单步搜索多个查找结果。
视图也会滚动到下一个搜索结果
var textNodes = [], scrollTo=0,ranges = [];
function getNextElement(){
var editor =null;
ranges = [];
// I dont know the ID of the editor, but i know there is only one the page
for(var i in CKEDITOR.instances){
editor = CKEDITOR.instances[i];
}
if(editor ==null){
return;
}
editor.focus();
var startRange = editor.getSelection().getRanges()[0];
var cursorData ="",cursorOffset=0,hasCursor = false;
if(startRange != null && startRange.endContainer.$.nodeType == CKEDITOR.NODE_TEXT){
cursorOffset = startRange.startOffset;
cursorData = startRange.endContainer.$.data;
hasCursor = true;
}
var element;
element = editor.document.getBody().getLast().getParent();
var selection = editor.getSelection();
// Recursively search for text nodes starting from root.
textNodes = [];
getTextNodes( element );
var foundElement = false;
foundElement = iterateEditor(editor,hasCursor,cursorData,cursorOffset);
if(!foundElement){
foundElement =iterateEditor(editor,false,"",0);
}
if(foundElement){
// Select the range with the first << >>.
selection.selectRanges( ranges );
jQuery(".cke_wysiwyg_frame").contents().scrollTop(scrollTo);
}
}
function iterateEditor(editor,hasCursor,cursorData,cursorOffset){
var foundElement = false;
var rowNr = 0;
var text, range;
var foundNode = false;
if(!hasCursor){
foundNode = true;
}
// Iterate over and inside the found text nodes. If some contains
// phrase "<< >>", create a range that selects this word.
for (var i = textNodes.length; i--; ) {
text = textNodes[ i ];
if ( text.type == CKEDITOR.NODE_ELEMENT && text.getName() == "br" ){
rowNr++;
} else if ( text.type == CKEDITOR.NODE_TEXT ) {
var sameNode = false;
if(text.$.data == cursorData){
foundNode = true;
sameNode = true;
}
if(foundNode){
var startIndex = -1;
var endIndex = 1;
if(sameNode){
// Check inside the already selected node if the text has multiple hits on the searchphrase
var indicesStart = getIndicesOf('\u00AB', text.getText());
var indicesEnd = getIndicesOf('\u00BB', text.getText());
for (var j = indicesStart.length; j--; ) {
if(indicesStart[j] > cursorOffset){
startIndex = indicesStart[j];
endIndex = indicesEnd[j];
}
}
} else{
startIndex = text.getText().indexOf( '\u00AB' );
endIndex = text.getText().indexOf( '\u00BB' );
}
if ( startIndex > -1 && (!sameNode || startIndex > cursorOffset)) {
range = editor.createRange();
range.setStart( text, startIndex );
foundElement = true;
// calculate the height the window should scroll to focus the selected element
scrollTo = (rowNr)*20;
}
if ( endIndex > -1 && foundElement ) {
range.setEnd( text, endIndex+1 );
ranges.push( range );
return true;
}
}
}
}
}
function getIndicesOf(searchStr, str) {
var startIndex = 0, searchStrLen = searchStr.length;
var index, indices = [];
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index);
startIndex = index + searchStrLen;
}
return indices;
}
function getTextNodes( element ) {
var children = element.getChildren(), child;
for ( var i = children.count(); i--; ) {
child = children.getItem( i );
textNodes.push( child );
}
}
var textNodes=[],scrollTo=0,ranges=[];
函数getNextElement(){
var编辑器=null;
范围=[];
//我不知道编辑的ID,但我知道页面上只有一个
for(CKEDITOR.instances中的变量i){
editor=CKEDITOR.instances[i];
}
如果(编辑器==null){
返回;
}
editor.focus();
var startRange=editor.getSelection().getRanges()[0];
var cursorData=“”,cursorOffset=0,hascoursor=false;
if(startRange!=null&&startRange.endContainer.$.nodeType==CKEDITOR.NODE\u TEXT){
cursorOffset=startRange.startOffset;
cursorData=startRange.endContainer.$.data;
hasCursor=true;
}
var元素;
element=editor.document.getBody().getLast().getParent();
var selection=editor.getSelection();
//从根开始递归搜索文本节点。
textNodes=[];
getTextNodes(元素);
var foundElement=false;
foundElement=iterateEditor(编辑器、hasCursor、cursorData、cursorOffset);
if(!foundElement){
foundElement=iterateEditor(编辑器,false,“,0);
}
if(foundElement){
//使用第一个>选择范围。
选择。选择范围(范围);
jQuery(“.cke_wysiwyg_frame”).contents().scrollTop(scrollTo);
}
}
函数迭代器编辑器(编辑器、hasCursor、cursorData、cursorOffset){
var foundElement=false;
var-rowNr=0;
var文本,范围;
var foundNode=false;
如果(!hasCursor){
foundNode=true;
}
//在找到的文本节点上和内部进行迭代
//短语“>”,创建选择此单词的范围。
对于(var i=textNodes.length;i--;){
text=textNodes[i];
if(text.type==CKEDITOR.NODE_元素&&text.getName()==“br”){
rowNr++;
}else if(text.type==CKEDITOR.NODE\u text){
var sameNode=假;
if(text.$.data==cursorData){
foundNode=true;
sameNode=真;
}
if(foundNode){
var startIndex=-1;
var-endIndex=1;
if(sameNode){
//如果文本在搜索短语上有多处点击,请在已选择的节点内进行检查
var indicatesstart=getindicatesof('\u00AB',text.getText());
var indicatesend=getindicatesof('\u00BB',text.getText());
对于(var j=indicatesStart.length;j--;){
如果(指示开始[j]>光标偏移){
startIndex=指示开始[j];
endIndex=指标End[j];
}
}
}否则{
startIndex=text.getText().indexOf('\u00AB');
endIndex=text.getText().indexOf('\u00BB');
}
如果(开始索引>1&(!sameNode | |开始索引>游标偏移)){
range=editor.createRange();
range.setStart(文本,起始索引);
foundElement=true;
//计算窗口滚动以聚焦所选元素的高度
滚动次数=(行数)*20;
}
if(endIndex>-1&&foundElement){
range.setEnd(文本,endIndex+1);
射程。推(射程);
返回true;
}
}
}
}
}
函数getIndicatesof(searchStr,str){
var startIndex=0,searchStrLen=searchStr.length;
var指数,指数=[];
而((index=str.indexOf(searchStr,startIndex))>-1){
指数。推送(指数);
startIndex=索引+搜索列表;
}
回报指数;
}
函数getTextNodes(元素){
var children=element.getChildren(),child;
for(var i=children.count();i--;){
child=children.getItem(i);
textNodes.push(子节点);
}
}
var textNodes = [], scrollTo=0,ranges = [];
function getNextElement(){
var editor =null;
ranges = [];
// I dont know the ID of the editor, but i know there is only one the page
for(var i in CKEDITOR.instances){
editor = CKEDITOR.instances[i];
}
if(editor ==null){
return;
}
editor.focus();
var startRange = editor.getSelection().getRanges()[0];
var cursorData ="",cursorOffset=0,hasCursor = false;
if(startRange != null && startRange.endContainer.$.nodeType == CKEDITOR.NODE_TEXT){
cursorOffset = startRange.startOffset;
cursorData = startRange.endContainer.$.data;
hasCursor = true;
}
var element;
element = editor.document.getBody().getLast().getParent();
var selection = editor.getSelection();
// Recursively search for text nodes starting from root.
textNodes = [];
getTextNodes( element );
var foundElement = false;
foundElement = iterateEditor(editor,hasCursor,cursorData,cursorOffset);
if(!foundElement){
foundElement =iterateEditor(editor,false,"",0);
}
if(foundElement){
// Select the range with the first << >>.
selection.selectRanges( ranges );
jQuery(".cke_wysiwyg_frame").contents().scrollTop(scrollTo);
}
}
function iterateEditor(editor,hasCursor,cursorData,cursorOffset){
var foundElement = false;
var rowNr = 0;
var text, range;
var foundNode = false;
if(!hasCursor){
foundNode = true;
}
// Iterate over and inside the found text nodes. If some contains
// phrase "<< >>", create a range that selects this word.
for (var i = textNodes.length; i--; ) {
text = textNodes[ i ];
if ( text.type == CKEDITOR.NODE_ELEMENT && text.getName() == "br" ){
rowNr++;
} else if ( text.type == CKEDITOR.NODE_TEXT ) {
var sameNode = false;
if(text.$.data == cursorData){
foundNode = true;
sameNode = true;
}
if(foundNode){
var startIndex = -1;
var endIndex = 1;
if(sameNode){
// Check inside the already selected node if the text has multiple hits on the searchphrase
var indicesStart = getIndicesOf('\u00AB', text.getText());
var indicesEnd = getIndicesOf('\u00BB', text.getText());
for (var j = indicesStart.length; j--; ) {
if(indicesStart[j] > cursorOffset){
startIndex = indicesStart[j];
endIndex = indicesEnd[j];
}
}
} else{
startIndex = text.getText().indexOf( '\u00AB' );
endIndex = text.getText().indexOf( '\u00BB' );
}
if ( startIndex > -1 && (!sameNode || startIndex > cursorOffset)) {
range = editor.createRange();
range.setStart( text, startIndex );
foundElement = true;
// calculate the height the window should scroll to focus the selected element
scrollTo = (rowNr)*20;
}
if ( endIndex > -1 && foundElement ) {
range.setEnd( text, endIndex+1 );
ranges.push( range );
return true;
}
}
}
}
}
function getIndicesOf(searchStr, str) {
var startIndex = 0, searchStrLen = searchStr.length;
var index, indices = [];
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index);
startIndex = index + searchStrLen;
}
return indices;
}
function getTextNodes( element ) {
var children = element.getChildren(), child;
for ( var i = children.count(); i--; ) {
child = children.getItem( i );
textNodes.push( child );
}
}