I'm trying to load ckEditor 3.2 inside an Ajax snippet like this:
Website global (outside Ajax snippet):
Inside Ajax snippet:
As soon as I call the Ajax snippet the second time, I'll get JavaScript error "i.contentWindow is null". From the third time on it works again. Any idea why?
Besides, is there maybe a better way to work with ckEditor inside asynchronously loaded content? I'd especially get rid of custom global JavaScript vars. The ajax.html inside the ckEditor's _samples folder actually doesn't give a clue about it.
Thanks in advance,
Roman
Website global (outside Ajax snippet):
var ckEditorText = null;
Inside Ajax snippet:
... <textarea name="text" class="ckeditor"></textarea> ... <script type="text/javascript"> if (ckEditorText) { ckEditorText.destroy(); ckEditorText = null; } ckEditorText = CKEDITOR.replace('text'); </script>
As soon as I call the Ajax snippet the second time, I'll get JavaScript error "i.contentWindow is null". From the third time on it works again. Any idea why?
Besides, is there maybe a better way to work with ckEditor inside asynchronously loaded content? I'd especially get rid of custom global JavaScript vars. The ajax.html inside the ckEditor's _samples folder actually doesn't give a clue about it.
Thanks in advance,
Roman
Re: i.contentWindow is null
The way it's done in _samples/Ajax.html is definitely not working (for us) in a real Ajax setup.
Re: i.contentWindow is null
Those code snippets doesn't show any clue about what's the difference between your code and the provided samples, so it's not possible to fix any bug.
Re: i.contentWindow is null
Instead of creating a new thread on this topic, I'll tag on to this one instead.
I've had problems with getting i.contentWindow is null errors as well, and it might just have been 3.3 that was flaky, but whenever I got the error, it behaved the same.
What I do is using jQuery to dynamically load the html containing among other things a textarea used for ckeditor. The page displaying it contains information to load several entries from a database, each textarea gets a unique (id-based) name. These textareas are mutually exclusive, and only one textarea is active at any one time. Now, let's for example assume we have TEXTAREA_ID1 and TEXTAREA_ID2.
On first load (this was with 3.3), everything worked fine, TEXTAREA_ID1 was loaded, initiated and working fine. This textarea was then removed from the DOM (note: at that time, not destroy()ed). Again loading TEXTAREA_ID1 (at this stage I checked if it was present in CKEDITOR.instances, and destroy()ed it if it was) now produces the i.contentWindow is null error. Basically, I did not destroy() it before it was removed from the DOM, which I assume was bad behaviour (more on this later).
Bear with me now though, because after the first load and initiation of TEXTAREA_ID1, it was possible to load and initiate TEXTAREA_ID2 (and 3, 4 and so on) without producing any errors. However, going back to TEXTAREA_ID1 again *would* produce the error. So basically, the FIRST initiated editor would produce the error, but *only* on the 2nd load+init (which also contained a destroy() of what should be the first initiated editor for the same element name). Subsequent loads would work flawlessly.
I also tried using the CKEDITOR.remove(), but that didn't seem to work properly (again, 3.3 here) either.
So, I changed my code to destroy() the attached ckeditor before removing the DOM elements containing the textarea used, and now the i.contentWindow is null error was nowhere to be seen. I would assume that ripping out the rug (the DOM element containing the textarea) from under the feet of ckeditor somehow causes an error (seemingly in getFrameDocument() IIRC).
However, on the second go around I was now unable to see the editing caret, although I was still able to select words and such (images got the normal selection, not the ckeditor selection box). Switching the contenteditable attribute back and forth to true using Firebug turned the editor caret on again.
So, off I went for the nightly, wanting to at least try it out before anything else.
Now, editing works, but with a new twist. Still with the destroy() call at the proper place (before removing the element from the DOM), I get flaky behaviour using the nightly 3.3.2(?) of 13th june. This time, everything still works fine on first load. However, on the second time around, clicking in the editing area produces a new <p> tag (I use enter for <p>, shift-enter for <br>) below the existing one (see below, my test was just a single <p>Test</p> html fragment. This behaviour stays for subsequent instances, as well as for other instances on the same page. New bug in the nightly?
I don't have any evidence as to what's wrong and I don't want to point any fingers, but it strikes me as somewhat odd that through various ways to destroy(), ckeditor versions and such, it's always at the second instanced editor *of the same name* that stuff seems to go awry.
And to top it off, I've been trying to create some kind of proof of concept that shows this, but apart from throwing you in to my development environment, I have nothing to show for any of these bugs.
My point is, I think part of the problem may surely lie with how people is using it, but it does seem to me that there is something that happens on the second instance of ckeditor on a page. I can't say what though. The lack of decent documentation is also a big stepping block, and does basically nothing to alleviate problems that arises. I appreciate the hard work that goes into a thing such as CKEditor though, especially considering having to cater to everything from IE6 and onwards. My own pet project targets only Firefox 3.6+, so I have a comparatively easy time
Attachments:
Re: i.contentWindow is null
Re: i.contentWindow is null
I am having the same problem as you Hornball. I'm running 3.4.1 right now and I get the same issue with the second time I bring up a page to use the instance, it's only the first instance that doesn't show up over the textarea box, but 2, 3, 4,.. show up just fine every time.
I'm using ColdFusion and JQuery along with AJAX to run this and have hit so many walls using this editor. It's been a great editor over the years, but I'm getting burnt out on it. Thanks for posting your experiences... maybe something will happen to fix my issue. That would be nice.
Re: i.contentWindow is null
CKEDITOR.replace( id, {removePlugins : "wordcount" } );
You can easily implement your own wordcount with some jquery and event handlers on the keyup and paste events in the editor.