Verbesserung
Top-Thema
Detail
Wichtig
Detail
Folgende JS-Fehler tauchen im Log auf, wenn lange Texte gespeichert werden:
Client-side message: Uncaught JavaScript exception (exception: 'TypeError: this.document.getWindow().$ is undefined', component: 'rootLayout#masterFrame', source: 'http://demo1:8080/demo/servlet/LayoutServlet/demo1-12b782d1c6070cbf', layout: 'masterFrame.layout.xml', session: node0poq7g3blxodz1vizmwwyzubkj0, UserAgent[Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0])
Client-side message: Uncaught JavaScript exception (exception: 'TypeError: a is null', component: 'rootLayout#masterFrame', source: 'http://demo1:8080/demo/servlet/LayoutServlet/demo1-9d999c76a42ef4f0', layout: 'masterFrame.layout.xml', session: node0poq7g3blxodz1vizmwwyzubkj0, UserAgent[Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0])
Scheint aus dem CK-Editor zu stammen:
Uncaught TypeError: a is null getClientRect http://demo1:8080/demo/script/ckeditor/ckeditor.js:1248 queryViewport http://demo1:8080/demo/script/ckeditor/ckeditor.js:1248 p http://demo1:8080/demo/script/ckeditor/ckeditor.js:1233 O http://demo1:8080/demo/script/ckeditor/ckeditor.js:1269 p http://demo1:8080/demo/script/ckeditor/ckeditor.js:10 fire http://demo1:8080/demo/script/ckeditor/ckeditor.js:12 fire http://demo1:8080/demo/script/ckeditor/ckeditor.js:13 m http://demo1:8080/demo/script/ckeditor/ckeditor.js:941 setTimeout http://demo1:8080/demo/script/ckeditor/ckeditor.js:30 setTimeout handler*setTimeout http://demo1:8080/demo/script/ckeditor/ckeditor.js:30 m http://demo1:8080/demo/script/ckeditor/ckeditor.js:941 setTimeout http://demo1:8080/demo/script/ckeditor/ckeditor.js:30 setTimeout handler*setTimeout http://demo1:8080/demo/script/ckeditor/ckeditor.js:30 frameLoadedHandler http://demo1:8080/demo/script/ckeditor/ckeditor.js:946 addFunction http://demo1:8080/demo/script/ckeditor/ckeditor.js:32 callFunction http://demo1:8080/demo/script/ckeditor/ckeditor.js:32 onload http://demo1:8080/demo/servlet/LayoutServlet/demo1-9d999c76a42ef4f0 line 94 > injectedScript:4 EventListener.handleEvent* http://demo1:8080/demo/servlet/LayoutServlet/demo1-9d999c76a42ef4f0 line 94 > injectedScript:4 write http://demo1:8080/demo/script/ckeditor/ckeditor.js:94 setData http://demo1:8080/demo/script/ckeditor/ckeditor.js:951 setup http://demo1:8080/demo/script/ckeditor/ckeditor.js:386 p http://demo1:8080/demo/script/ckeditor/ckeditor.js:10 fire http://demo1:8080/demo/script/ckeditor/ckeditor.js:12 fire http://demo1:8080/demo/script/ckeditor/ckeditor.js:13 setData http://demo1:8080/demo/script/ckeditor/ckeditor.js:287 replaceContent http://demo1:8080/demo/script/wysiwyg.js?t=1621246828351:95 <anonymous> http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351 line 514 > eval:1 processActions http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:514 rxSequenceNr http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:346 processPendingReplies http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:411 processLater http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:363 processResult http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:350 onCompletion http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:251 executeOnCompletion http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:267 onCompletion http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:251 onCompletionClosure http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1578 concatFunction http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1379 onreadystatechange http://demo1:8080/demo/script/tl/soap.js?t=1621246828351:106 sendRequest http://demo1:8080/demo/script/tl/soap.js?t=1621246828351:72 _sendRequest http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1370 invoke http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1267 requestFunction http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1038 executeNextRequest http://demo1:8080/demo/script/tl/queuing.js?t=1621246828351:72 executeRequest http://demo1:8080/demo/script/tl/queuing.js?t=1621246828351:105 execute http://demo1:8080/demo/script/tl/simpleajax.js?t=1621246828351:1019 updateFunction http://demo1:8080/demo/script/tl/ajax-form.js?t=1621247014447:280 sendValueUpdate http://demo1:8080/demo/script/tl/ajax-form.js?t=1621247014447:287 ckeditor.js:1248:378
Die Fehlermeldungen entstehen, weil die Anwendung Änderungen vom Client nicht korrekt als solche erkennt und jedes Mal versucht den neuen Wert erneut in den Editor zu speichern. Die Fehlermeldungen entstehen mit hoher Wahrscheinlichkeit deshalb, weil der Editor noch versucht den "neuen" Inhalt zu setzen, während er selbst bereits aus dem DOM entfernt wurde.
Verbesserung
Es wird nun vorab überprüft, ob Änderungen vom Client kamen, bevor der Editor unnötigerweise nochmal aktualisiert wird. Um einen korrekten Vergleich zu gewährleisten, wird für das FormField der aktuelle StructuredText gesetzt, sobald Änderungen im Editor gemacht wurden.
Test
Der Test kann auf http://docker:8007/CWS_25982 durchgeführt werden. Eine neue Seite (insbesondere eine lange Seite) bearbeiten und speichern (ähnlich wie bei #25969). Das ganze mehrfach testen, da der Fehler nicht immer auftritt. Im Log dürfen keine Meldungen auftauchen und es dürfen beim Speichern keine Änderungen verloren gehen. Zusätzlich sollte getestet werden, ob unnötige Updateaufforderungen an den Client gesendet werden. Dazu die Developer Tools öffnen und einen Breakpoint in replaceContent in wysiwyg.js setzen. Wenn Änderungen im Editor gemacht werden und gespeichert wird oder man in ein anderes Feld klickt, darf die Methode replaceContent nicht aufgerufen werden.