8

I've added a CKEditor instance programmatically to my page in the code-behind of my ASP.NET page:

VB.NET:

itemEditor = New CkEditor
cell.Controls.Add(itemEditor)

... which works fine. I can get the HTML on the postback and do stuff with it.

However, I also want to do some client-side stuff with it, specifically take a selected item out of another control, and insert it into the text by handling the onchange event.

So, how can I get the name of the editor instance in the JavaScript, so that I can do stuff like:

function GetCkText()
{
    var htmlFromEditor = CKEDITOR.instances['editorName'].getData();
    // do stuff with htmlFromEditor
}

6 Answers 6

16

Assuming you only have one editor instance:

for ( var i in CKEDITOR.instances ){
   var currentInstance = i;
   break;
}
var oEditor   = CKEDITOR.instances[currentInstance];

Here is what the JavaScript API says about instances.

Here is another way of defining the CKEditor. Here 'fck' is the input fields id:

CKEDITOR.replace( 'fck', {
    customConfig : prefix + 'js/ckeditor/config.js',
    height: 600,
    width: 950
});

editor = CKEDITOR.instances.fck;

Notice how I am then able to reference the instance using .fck.

Sign up to request clarification or add additional context in comments.

5 Comments

Thanks, works fine - much less messing about. However, a question, if I may. As most of my work is .NET server-side (and I've done very little JS), I'm used to instance collections being collections of the objects themselves... whereas 'i' in your example here is the editor instance name. How would I know this - does this syntax imply a default property perhaps?
If you know is simple, the value of currentInstance is the HTML id of your editor textarea. Example currentInstance='editor1'.
is there a way to assign the instance name?? ... ... i tried CKEDITOR.appendTo( "my_div" , {name:"my_editor"}, my_string )
@dsdsdsdsd see my edit i think that may satisfy your question
interesting ... that seems to NOT work for .appendTo ... but does work for .replace (as you showed)
3

If you only have a single instance and you do not know the name of it.

CKEDITOR.instances[Object.keys(CKEDITOR.instances)[0]].getData()

Comments

2

The following code:

var allInstances=CKEDITOR.instances;
for ( var i in allInstances ){
    alert(allInstances[i].name);
}

works fine for me.

Comments

0

Well I've found a way... but I don't like it much...

I've added a Hidden Field control to the page, after adding the editor, and put the editor's ClientId in its value:

Dim hdn As New HiddenField
With hdn
    .ID = "HiddenField"
    .Value = itemEditor.ClientID
End With
cell.Controls.Add(hdn)

.. and then in the JavaScript, I can get the hidden field, and hence the editor name as follows:

function GetCkText()
{
    var hdn = document.getElementById("HiddenField");
    var editorName = hdn.getAttribute("value");
    var editor = CKEDITOR.instances[editorName];
    alert(editor.getData());
    return false;
}

But it's a bit inelegant, to say the least. Anyone got a better way?

Comments

0

If you are using CKEDITOR.appendTo(...), keep in mind that the ckeditor does create an instance name internally. So you can query for that name immediately after creating it, then store it somewhere, and use it later.

var lvo_editor = CKEDITOR.appendTo( "my_div" , null , lvs_html ) ; 
my_global_var  = lvo_editor.name                                 ;

by the way: The CKEDITOR.replace(...) method allows you to define an instance name (see answer above)

Comments

0

If you need the instance from a plugin, at least in version 4+ you can do this.

CKEDITOR.currentInstance

Here I am wanting to know the name of the textarea I applied ckeditor on.

CKEDITOR.currentInstance.name

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.