2009-05-29 10 views
24

Ich habe einen benutzerdefinierten CMS, der CKEditor * (FCKEditor v3) zum Bearbeiten von Inhalten verwendet. Ich verwende auch das jQuery Validation Plugin, um alle Felder auf Fehler vor der AJAX-basierten Einreichung zu überprüfen. Ich verwende die serialize() Funktion, um die Daten an das PHP-Backend zu übergeben.Verwenden von jQuery zum Abrufen des Inhalts aus CKEditors iframe

Problem ist, Serialize verwaltet alle Felder korrekt zu erfassen, mit Ausnahme der tatsächlichen Inhalt in CKEditor eingegeben. Wie jeder andere WYSIWYG-Editor überlagert auch dieser einen Iframe über einer bestehenden Textbox. Und serialize ignoriert den iframe und schaut nur in den Textkasten nach Inhalten, die er natürlich nicht findet und somit einen leeren Inhaltskörper zurückgibt.

zu dieser Mein Ansatz ist es, einen Haken auf das Onchange Ereignis von CKEditor zu erstellen und gleichzeitig aktualisieren, um die Textbox (CKEDITOR.instances.[textboxname].getData() gibt den Inhalt) oder ein anderes verstecktes Feld mit allen im Editor vorgenommenen Änderungen.

Da CKEditor jedoch immer noch im Beta-Stadium ist und die Dokumentation stark fehlt, kann ich keinen passenden API-Aufruf finden, der es mir ermöglicht.

Hat jemand eine Idee, wie man das macht?

+1

Ich habe herausgefunden, soweit den Inhalt aus dem iframe: 012 greifen$ ('#cke_contents_body iframe') .contents(). Find ('body') .html() ... das nächste direkt adressierbare Element ist ein td mit der ID 'cke_contents_body'. CKEditor umschließt den iframe mit dieser td. –

+0

Noch zu gehen .. eine Möglichkeit, die Textbox mit den Daten automatisch zu aktualisieren, indem Sie auf ein Änderungsereignis von CKEditor zugreifen. Irgendwelche Ideen? Jemand? –

+1

Neue CKEditor Version hat dieses Problem gelöst – Ivan

Antwort

3

Dies sollte es tun ...

CKEDITOR.instances["editor1"].document.on('keydown', function(event) 
{ 
    CKEDITOR.tools.setTimeout(function() 
    { 
     $("#editor1").val(CKEDITOR.instances.editor1.getData()); 
    }, 0); 
}); 

CKEDITOR.instances["editor1"].document.on('paste', function(event) 
{ 
    CKEDITOR.tools.setTimeout(function() 
    { 
     $("#editor1").val(CKEDITOR.instances.editor1.getData()); 
    }, 0); 
}); 

edit: zu hinzugefügt Abschnitt Textbox nach Pasten zu aktualisieren, ...

+0

Danke für Ihre Antwort ... aber es sagt mir immer wieder: "CKEDITOR.instances.editor1.document ist undefined" !! –

+0

BTW, können Sie bitte erklären, warum Sie hier ein setTimeout verwenden und nicht einfach den Inhalt direkt auf Tastendruck kopieren? –

+2

Ersetzen Sie Editor1 durch Ihren Textfeldnamen.Das setTimeout soll sicherstellen, dass wir den Inhalt bekommen, nachdem der gedrückte Schlüssel hinzugefügt wurde, und nicht vorher. – Stobor

6

Ich habe auch dieses Problem zu beheben heute versucht. Ich erkannte, dass der oben genannte Code für mich nicht funktioniert, weil die CKEditor-Instanz noch nicht bereit ist, wenn auf die Dokumenteigenschaft verwiesen wird. Sie müssen also das Ereignis "instanceReady" aufrufen und innerhalb dessen die Ereignisse des Dokuments verwendet werden können, da es zuvor nicht existiert.

Dieses Beispiel könnte für Sie arbeiten:

CKEDITOR.instances["editor1"].on("instanceReady", function() 
{ 
//set keyup event 
this.document.on("keyup", CK_jQ); 

//and paste event 
this.document.on("paste", CK_jQ); 
}); 

function CK_jQ() 
{ 

    CKEDITOR.tools.setTimeout(function() 
    { 
     $("#editor1").val(CKEDITOR.instances.editor1.getData()); 
    }, 0); 
} 
+0

Danke an euch alle :) Der kombinierte Code hat den Trick gemacht ... –

+0

$ ("# editor1"). Val (CKEDITOR.instances.editor1.getData()); Arbeiten Danke –

0

Ich habe die ganze Nacht versucht, diese Arbeit zu bekommen, aber es ist noch nicht zu arbeiten. Könnten Sie bitte erklären, wo Sie dieses Skript platziert haben?

Ich erzeuge meine Seite von einer xquery, also kann ich dieses Skript nicht in die Seite einfügen, weil es "{" enthält, was die xquery-Verarbeitung unterbricht. Wenn Sie das Skript in cdata einfügen, wird das Skript unterbrochen. Also habe ich den on instanceReady Listener in das selbe Skript eingefügt, das den Editor erstellt und ein externes Skript aufgerufen, um den Rest hinzuzufügen.zB:

<script type="text/javascript"> 
    var editor = CKEDITOR.replace('editor1'); 
    editor.on("instanceReady", updateInstance()) 
</script> 

dann updateInstance enthält:

function updateInstance() 
{ 
CKEDITOR.instances["editor1"].document.on('keydown', function(event) 
{ 
    CKEDITOR.tools.setTimeout(function() 
    { 
     $("#editor1").val(CKEDITOR.instances.editor1.getData()); 
    }, 0); 
}); 

CKEDITOR.instances["editor1"].document.on('paste', function(event) 
{ 
    CKEDITOR.tools.setTimeout(function() 
    { 
     $("#editor1").val(CKEDITOR.instances.editor1.getData()); 
    }, 0); 
}); 

} 
+0

Für eine Folgefrage wie diese wäre es besser, sie als neue Frage zu stellen ("Frage stellen" Button oben rechts auf der Seite), nicht hier in einem alten Thread zu posten. Mehr Leute würden es sehen und versuchen, Ihr Problem zu lösen ... – sth

+0

Ok danke, neu auf dieser Seite und war nicht sicher, wie es funktioniert. Ich lösche von hier und repost als neue Frage. – Fraser

+0

Ok, ich habe mein Problem gelöst. Ich mischte xquery und Javascript Code und entkam nicht richtig {. Funktioniert jetzt gut. Danke für die Lösung !! – Fraser

7

Ich habe gerade ein CKEditor-Plugin für jQuery freigesetzt, die sich um all dies im Hintergrund ohne zusätzlichen Code statt: http://www.fyneworks.com/jquery/CKEditor/

+0

Coole Sachen. Vielen Dank. Das macht es einfach. –

+0

Funktioniert dieses Plugin noch für den neuen CKEDITOR? – AnApprentice

1

Ich nahm einen etwas anderen Ansatz Ich dachte, es wäre besser, ckeditors Update-Funktion zu verwenden, und seit Keyup verwendet wurde, wurde das Timeout nicht benötigt

CKEDITOR.instances["editor1"].on("instanceReady", function() 
{ 
//set keyup event 
this.document.on("keyup", CK_jQ); 

//and paste event 
this.document.on("paste", CK_jQ); 
} 

function CK_jQ() 
{ 
    CKEDITOR.instances.editor1.updateElement(); 
} 
34

Eine weitere allgemeine Lösung hierfür wäre folgend ausgeführt, wenn Sie versuchen, das Formular

for (instance in CKEDITOR.instances) 
      CKEDITOR.instances[instance].updateElement(); 
Diese

einreichen wird alle CKEditor Instanzen in Form zwingen, ihre jeweiligen Felder zu aktualisieren

+0

Ist das ein JavaScript-Code? – Bajrang

+1

@ J.J. Ja. Es ist JavaScript-Code, der auf dem Ereignis 'submit' des Formulars (* oder jederzeit davor *) ausgeführt werden sollte. –

+0

Gaby aka G. Petrioli - Danke. – Bajrang

2

Ich hatte mit diesem Erfolg:

console.log(CKEDITOR.instances.editor1.getData()); 
1

Das contentDom Ereignis für mich gearbeitet und nicht die instanceReady ... Ich würde wirklich das, was die Ereignisse ae wissen, wie, aber ich nehme an, sie sind Eigentum der Firma ...

var editor = CKEDITOR.replace('editor'); 

CKEDITOR.instances.editor.on("instanceReady", function(){ 
    this.on('contentDom', function() { 
     this.document.on('keydown', function(event) { 
      CKEDITOR.tools.setTimeout(function(){ 
       $(".seldiv").html(CKEDITOR.instances.editor.getData()); 
      }, 1); 
     }); 
    }); 
    this.on('contentDom', function() { 
     this.document.on('paste', function(event) { 
      CKEDITOR.tools.setTimeout(function(){ 
       $(".seldiv").html(CKEDITOR.instances.editor.getData()); 
      }, 1); 
     }); 
    }); 
    edits_clix(); 
    var td = setTimeout("ebuttons()", 1); 
}) 
+0

Ihre Antwort hat mich nach fast 4 Stunden Debugging/Neuschreiben gerettet. Was ich geschrieben hatte, war, dass ich größtenteils mit "instanceReady" arbeitete, aber es funktionierte überhaupt nicht auf AJAXed in Inhalten. Ich wollte nur Danke sagen. – narx

1

CKEDITOR.instances.wc_content1.getData() werden die ckeditor Daten zurückgeben
CKEDITOR.instances.wc_content1.setData() werden die ckeditor Datensatz

0

ich denke, die Verwendung Ich fragte nach Serialisierung, ich hatte Probleme mit der Serialisierung eines Formulars, um es einzureichen, und es gab mir viele Probleme.

Dies ist, was für mich gearbeitet:

$(document).ready(function() { 
$('#form').submit(function(){ 
if (CKEDITOR.instances.editor1.getData() == ''){ 
    alert('There is no data available');//an alert just to check if its working 
}else{ 
    var editor_data = CKEDITOR.instances.editor1.getData(); 
    $("#editor1").val(editor_data); //at this point i give the value to the textarea 
    $.ajax({ 
        //do your ajax here 

        }); 

     } 
return false; 
    }); 
});