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.