Author: jcompagner Date: Thu May 22 13:47:56 2008 New Revision: 659248 URL: http://svn.apache.org/viewvc?rev=659248&view=rev Log: - speeds up the rendering of the autocomplete menu list; - speeds up the initial assignment of events (onclick and onmouseover) to items in the menu list; - fixes a small glitch in setting the height of the menu container (eventual padding and margins were ignored and so the height resulted smaller than needed -> vertical scrollbar appeared)
Modified: wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js Modified: wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js?rev=659248&r1=659247&r2=659248&view=diff ============================================================================== --- wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js (original) +++ wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js Thu May 22 13:47:56 2008 @@ -52,6 +52,10 @@ var objonkeypress; var objonchange; var objonchangeoriginal; + + // holds the eventual margins, padding, etc. of the menu container. + // it is computed when the menu is first rendered, and then reused. + var initialDelta = -1; function initialize(){ var obj=wicketGet(elementId); @@ -279,23 +283,26 @@ var element = getAutocompleteMenu(); element.innerHTML=resp; if(element.firstChild && element.firstChild.childNodes) { - elementCount=element.firstChild.childNodes.length; + elementCount=element.firstChild.childNodes.length; - for(var i=0;i<elementCount;i++){ - var node=element.firstChild.childNodes[i]; - - node.onclick = function(event){ - mouseactive=0; - wicketGet(elementId).value=getSelectedValue(); - if(typeof objonchange=="function")objonchange(); - hideAutoComplete(); - } - - node.onmouseover = function(event){ - selected = getElementIndex(this); - render(); - showAutoComplete(); - } + var clickFunc = function(event){ + mouseactive=0; + wicketGet(elementId).value=getSelectedValue(); + if(typeof objonchange=="function")objonchange(); + hideAutoComplete(); + }; + + var mouseOverFunc = function(event){ + selected = getElementIndex(this); + render(); + showAutoComplete(); + }; + + var node=element.firstChild.childNodes[0]; + for(var i=0;i<elementCount;i++){ + node.onclick = clickFunc; + node.onmouseover = mouseOverFunc; + node = node.nextSibling; } } else { elementCount=0; @@ -360,26 +367,28 @@ function render(){ var menu=getAutocompleteMenu(); var height=0; - for(var i=0;i<elementCount;i++){ - var node=menu.firstChild.childNodes[i]; - - var classNames=node.className.split(" "); - for (var j=0; j<classNames.length; j++) { - if (classNames[j]=='selected') { - classNames[j]=''; - } - } - - if(selected==i){ - classNames.push('selected'); - adjustScrollOffset(menu.parentNode, node); - } - - node.className=classNames.join(" "); - height+=node.offsetHeight; - } + var node=menu.firstChild.childNodes[0]; + var re = /\bselected\b/gi; + for(var i=0;i<elementCount;i++) + { + var classNames = node.className.replace(re, ""); + if(selected==i){ + classNames += " selected"; + adjustScrollOffset(menu.parentNode, node); + } + node.className = classNames; + + if ((cfg.maxHeight > -1) && (height < cfg.maxHeight)) + height+=node.offsetHeight; + + node = node.nextSibling; + } if (cfg.maxHeight > -1) { - height = height<cfg.maxHeight?height:cfg.maxHeight; + // If we don't exceed the maximum size, we add the extra space + // that may be there due to padding, margins, etc. + if (initialDelta == -1) + initialDelta = menu.parentNode.offsetHeight - height; + height = height<cfg.maxHeight ? height+initialDelta : cfg.maxHeight; menu.parentNode.style.height=height+"px"; } }