{"id":181,"date":"2011-08-14T22:33:24","date_gmt":"2011-08-14T20:33:24","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=181"},"modified":"2011-08-14T22:33:24","modified_gmt":"2011-08-14T20:33:24","slug":"partial-refresh-get-vs-post-2","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=181","title":{"rendered":"Partial Refresh: Get vs. Post (2)"},"content":{"rendered":"<p>In bestimmten Konstellationen kann es vorkommen, da\u00df ein Aufruf von <em>XSP.partialRefreshPost<\/em> nicht ausgef\u00fchrt wird; der gleiche Aufruf in der GET-Variante hingegen funktioniert einwandfrei.<\/p>\n<p>Das kann an der Implementierung der beiden Funktionen liegen, denn hier gibt es einen kleinen aber feinen Unterschied zu beachten: Wird ein POST-basierter Partial Refresh <span style=\"text-decoration: underline;\">au\u00dferhalb<\/span> einer Form ausgef\u00fchrt (z.B. indem man mittels &lt;<em>xp:form&gt;<\/em>-Tag mehrere Forms in einer XPage definiert hat), wird er nicht ausgef\u00fchrt, da die JS-Funktion <em>XSP.findForm<\/em> dann den Wert <em>null<\/em> zur\u00fcck liefert.<\/p>\n<p>Die GET-Variante ist anders implementiert, wie man im folgenden sehen kann:<\/p>\n<pre> this.partialRefreshGet = function x_prfs(refreshId, options) {\r\n\u00a0\u00a0 \/\/ Find the action URL\r\n\u00a0\u00a0 <strong>var form = document.forms[0];<\/strong>\r\n\u00a0\u00a0 if(form==null || !this.canSubmit()) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 }\r\n\u00a0\u00a0 options = options||new Object()\r\n\u00a0\u00a0 this._partialRefresh(\"get\",form,refreshId,options)\r\n}<\/pre>\n<p><em>[Fett: Es wird \u00fcberpr\u00fcft, ob die erste bzw. eine Form im DOM-Baum existiert]<\/em><\/p>\n<p>Hier wird einfach nur die Existens irgendeines Formulars abgefragt bzw. das erste Formular im DOM-Baum herangezogen (Eine andere Fehlerquelle, denn dies kann bei mehreren Formularen zu Fehlern f\u00fchren, wenn man z.B. explizit ein anderes Formular verarbeiten m\u00f6chte).<\/p>\n<p>Im Vergleich dazu die POST-Variante:<\/p>\n<pre>this.partialRefreshPost = function x_prfs(refreshId, options) {\r\n\u00a0\u00a0 <strong>var form = this.findForm(refreshId);<\/strong>\r\n\u00a0\u00a0 if(form==null || !this.canSubmit()) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 }\r\n\u00a0\u00a0 options = options||new Object()\r\n\u00a0\u00a0 if(options.immediate) options.valmode=0; \/\/ For compatibility only\r\n\u00a0\u00a0 if (this._doFireEvent(null, form, refreshId, null, true,\r\n      options.valmode, options.execId)){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 this._partialRefresh(\"post\",form,refreshId,options)\r\n\u00a0\u00a0 } else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 this.allowSubmit()\r\n\u00a0\u00a0 }\r\n}<\/pre>\n<p><em>[Fett: Die Form mit der angegebenen &#8222;RefreshId&#8220; wird vorausgesetzt. Existiert sie nicht, wird der Vorgang abgebrochen.]<\/em><\/p>\n<p>Bei der POST-basierten Variante wird das Formular gesucht, in da\u00df das HTML-Element mit der \u00fcbergebenen RefreshID eingebettet ist &#8211; liegt das Element jedoch nicht in einem Formular sonder ist direkt im BODY des DOM-Baumes eingebettet, liefert die Funktion <em>null<\/em> zur\u00fcck, und der Partial Refresh wird nicht verarbeitet.<\/p>\n<p>Der Workaround liegt adaher darin, das zu refreshende Element in ein Formular zu betten. Dann kann es auch via <em>XSP.partialRefreshPost<\/em> aktualisiert werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In bestimmten Konstellationen kann es vorkommen, da\u00df ein Aufruf von XSP.partialRefreshPost nicht ausgef\u00fchrt wird; der gleiche Aufruf in der GET-Variante hingegen funktioniert einwandfrei. Das kann an der Implementierung der beiden Funktionen liegen, denn hier gibt es einen kleinen aber feinen &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=181\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,75,9,81,74,24],"tags":[8,7,77,11,4,86,25,12,3,85],"class_list":["post-181","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-dojo","category-javascript","category-web","category-xpages","category-xsp","tag-dojo","tag-domino","tag-html","tag-http","tag-js","tag-jsf","tag-partial-refresh","tag-web","tag-xpages","tag-xsp"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=181"}],"version-history":[{"count":5,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":355,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions\/355"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}