package org.nocket.component.form.behaviors; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.request.cycle.RequestCycle; // TODO: Auto-generated Javadoc /** * Behavior zum Fokusieren einer Formularkomponente beim Darstellen der Seite im * Browser. ZusÀtzlich wird der Inhalt der Formularkomponente markiert. * * @author arens01/janz04 * @deprecated use HTML5 focus attribute instead */ @Deprecated public class DefaultFocusBehavior extends Behavior { /** The Constant serialVersionUID. */ private static final long serialVersionUID = -1L; /* (non-Javadoc) * @see org.apache.wicket.behavior.Behavior#bind(org.apache.wicket.Component) */ @Override public void bind(org.apache.wicket.Component component) { if (!(component instanceof FormComponent)) { throw new IllegalArgumentException("DefaultFocusBehavior: component must be instanceof FormComponent"); } component.setOutputMarkupId(true); } /* (non-Javadoc) * @see org.apache.wicket.behavior.Behavior#renderHead(org.apache.wicket.Component, org.apache.wicket.markup.head.IHeaderResponse) */ @Override public void renderHead(org.apache.wicket.Component component, IHeaderResponse response) { super.renderHead(component, response); String focusElement = "element.focus();"; String selectElement = "try { element.select() } catch(e){};"; String focusRadioChoice = "try { element.getElementsByTagName('input')[0].focus() } catch(e){};"; String script = "var element = document.getElementById('" + component.getMarkupId() + "');" + focusElement + selectElement + focusRadioChoice; /* * janz04: Unterscheidung Ajax-Request vs. normalen Pageload Bei einem * Request per Ajax wird der Dom ausgetauscht, was dazu fÌhrt, dass * JavaScript nicht ausgefÌhrt wird. Deshalb reicht es bei einem * AjaxCall nicht das Javascript in die Respone zu setzten. Wicket * bietet die Möglichkeit JavaScript per appendJavaScript hinzuzufÌgen, * dieses wird im Anschluss ausgefÌhrt Ein Problem aus Riester war, dass * wenn man nur das JavaScript ausfÌhrt, der Focus erst beim zweiten * Aufruf tatsÀchlich gesetzt wird. Dies wird dadurch erzwungen, dass * zusÀtzlich die Möglichkeit von Wicket genutzt wird dem * AjaxRequestTarget mitzuteilen welche Komponente den Fokus erhalten * soll. Die Methode focusComponent reicht alleine nicht, da die hier * Ìbergebene Component als span gerendert wird. Sollte hier jemand eine * bessere Idee haben, höre ich mir gerne gemecker an. */ AjaxRequestTarget ajaxRequestTarget = RequestCycle.get().find(AjaxRequestTarget.class); if (ajaxRequestTarget != null) { ajaxRequestTarget.appendJavaScript(script); ajaxRequestTarget.focusComponent(component); } else { response.render(OnDomReadyHeaderItem.forScript(script)); } } }