{"id":416,"date":"2011-12-09T23:34:52","date_gmt":"2011-12-09T21:34:52","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=416"},"modified":"2011-12-09T23:34:52","modified_gmt":"2011-12-09T21:34:52","slug":"quick-n-dirty-hijacking-typeahead-in-csjs","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=416","title":{"rendered":"Quick-n-Dirty: Hijacking TypeAhead in CSJS"},"content":{"rendered":"<p><a title=\"mnicklisch.wordpress.com\" href=\"http:\/\/mnicklisch.wordpress.com\/\" target=\"_blank\">Matthias Nicklisch<\/a> hat eine interessante Frage im XPages Forum gestellt, nachdem er festgestellt hat, dass im Designer zwar ein OnStart- \/ OnComplete-Event f\u00fcr die TypeAhead-Funktion angeboten wird, der Code aber als Deprecated angezeigt wird &#8211; und auf der XPage auch nicht funktioniert: <a title=\"lotus.com - XPages Developer Forum\" href=\"http:\/\/www-10.lotus.com\/ldd\/xpagesforum.nsf\/topicThread.xsp?action=openDocument&amp;documentId=D7503B75EFA728D08525794F004D63CA\" target=\"_blank\">Wie kann ein OnStart- \/ OnComplete-Event trotzdem verwendet werden?<\/a><\/p>\n<p>Meine Idee dazu ist, den darunter liegenden <a title=\"dojotoolkit.org: dojo.xhr\" href=\"http:\/\/dojotoolkit.org\/reference-guide\/dojo\/xhr.html\" target=\"_blank\">dojo.xhr<\/a>-Request zu hijacken, und auf diese Weise die Events zu erhalten. Dadurch l\u00e4sst sich der Code bequem auf die jeweilige XPage einbetten, ohne das eine Manipulation der original Javascript-Dateien erfolgen muss.<\/p>\n<p>Der folgender Code mu\u00df in einem CSJS-Scriptblock eingebettet werden. Dann erh\u00e4lt man f\u00fcr die TypeAhead-Funktion die Events, um zum Beispiel ein kleines &#8222;Loading&#8220;-Icon einzublenden, wenn die Daten vom Domino Server geladen werden.<\/p>\n<pre>var typeAheadLoad;\r\n\r\ndojo.addOnLoad( function(){\r\n   \/*** hijacking xhr request ***\/\r\n\u00a0\u00a0 if( !dojo._xhr )\r\n\u00a0\u00a0    dojo._xhr = dojo.xhr;\r\n\r\n   dojo.xhr = function(){\r\n      try{\r\n\u00a0\u00a0\u00a0      var args = arguments[1];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0    if( args['content'] ){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0       var content = args['content'];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0       if( content['$$ajaxmode'] ){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0       if( content['$$ajaxmode'] == \"typeahead\" ){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0       \/*** hook in load function ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    typeAheadLoad = args[\"load\"];\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0     \/*** overwrite error function ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    args[\"error\"] = function(){\r\n                        alert('Error raised!') \r\n                     };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    \/*** hijack load function ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    args[\"load\"] = function(arguments){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\n                        \/*** On Start ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    alert(\"On Start!\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\n                        \/*** call original function ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    typeAheadLoad(arguments);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\n                        \/*** On Complete ***\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    alert(\"On Complete!\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0    }\r\n      }catch(e){}\r\n\u00a0     dojo._xhr( arguments[0], arguments[1], arguments[2] );\r\n   }\r\n});<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Matthias Nicklisch hat eine interessante Frage im XPages Forum gestellt, nachdem er festgestellt hat, dass im Designer zwar ein OnStart- \/ OnComplete-Event f\u00fcr die TypeAhead-Funktion angeboten wird, der Code aber als Deprecated angezeigt wird &#8211; und auf der XPage auch &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=416\">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,17,75,22,29,18,9,82,81,74,24],"tags":[34,33,8,7,77,11,4,25,5,32,12,3,85],"class_list":["post-416","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-css","category-dojo","category-errorhandling","category-expression-language","category-infrastruktur","category-javascript","category-server","category-web","category-xpages","category-xsp","tag-8-5-2","tag-8-5-3","tag-dojo","tag-domino","tag-html","tag-http","tag-js","tag-partial-refresh","tag-ssjs","tag-tipp","tag-web","tag-xpages","tag-xsp"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/416","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=416"}],"version-history":[{"count":3,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/416\/revisions"}],"predecessor-version":[{"id":429,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/416\/revisions\/429"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}