Установить фокус на компонент с Apache Wicket? - PullRequest
7 голосов
/ 13 апреля 2010

Как настроить фокус на компонент с помощью Apache Wicket? Поиск приводит к очень небольшому количеству информации, в основном по настройке поля по умолчанию. Я не хочу устанавливать поле по умолчанию, скорее, я хочу установить фокус, когда, например, выбран определенный переключатель.

Ответы [ 6 ]

17 голосов
/ 10 апреля 2012

Я предлагаю использовать нативный org.apache.wicket.ajax.AjaxRequestTarget#focusComponent(). Например:

/**
 * Sets the focus in the browser to the given component. The markup id must be set. If            
 * the component is null the focus will not be set to any component.
 * 
 * @param component
 *            The component to get the focus or null.
 */
 org.apache.wicket.ajax.AjaxRequestTarget#focusComponent(Component component)
8 голосов
/ 14 апреля 2010

Как только вы создадите свое поведение для установки фокуса, вы сможете добавить его к компоненту в любом событии, просто убедитесь, что этот компонент является частью AjaxRequestTarget. Я не понимаю, почему это не сработает ...

myRadioButton.add(new AjaxEventBehavior("onchange") {
 @Override
 protected void onEvent(AjaxRequestTarget target) {
    myOtherComponent.add(new DefaultFocusBehavior());
        target.addComponent(myForm);
 }
});

Вот ссылка, которая показывает, как создать поведение фокуса по умолчанию, если у вас его еще нет: http://javathoughts.capesugarbird.com/2009/01/wicket-and-default-focus-behavior.html

3 голосов
/ 21 апреля 2010

Если вы хотите установить только Focus через javascript и не хотите перезагружать форму или компонент, вы можете использовать следующий код:

import org.apache.wicket.Component;

public class JavascriptUtils {
    private JavascriptUtils() {

    }

    public static String getFocusScript(Component component) {
        return "document.getElementById('" + component.getMarkupId() + "').focus();";
    }
}

И затем в любом Ajax-методе вы можете использовать:

target.appendJavascript(JavascriptUtils.getFocusScript(componentToFocus));
0 голосов
/ 02 августа 2016

Для всплывающего окна , подобного modalWindow Мой обходной путь , решение заключалось в использовании атрибута «автофокус» в первом входном теге. Простое решение - добавить его в html напрямую.

<input ..... autofocus>

Другое решение - добавить его в само окно modalWindow:

@Override
public void show(AjaxRequestTarget target) {
    super.show(target);
    setUpFocus();
}

protected void setUpFocus() {
    DeepChildFirstVisitor visitor = new DeepChildFirstVisitor() {

        @Override
        public void component(Component component, IVisit<Void> iVisit) {
            if (isAutofocusable(component)) {
                component.add(new AttributeAppender("autofocus", ""));
                iVisit.stop();
            }
        }

        @Override
        public boolean preCheck(Component component) {
            return false;
        }
    };
    this.visitChildren(FormComponent.class, visitor);
}

    protected boolean isAutofocusable(Component component) {
        if (component instanceof TextArea ||
                component instanceof DropDownChoice ||
//                component instanceof RadioChoice ||
                component instanceof AjaxCheckBox ||
                component instanceof AjaxButton || 
                component instanceof TextField) {
            return true;
        }
        return false;
    }

RadioChoice закомментирован, потому что это решение не работает над этим. Для RadioChoice я бы порекомендовал реализовать FocusedRadioChoice:

public class FocusedRadioChoice<T> extends RadioChoice<T> {
//constructors...
    @Override
    protected IValueMap getAdditionalAttributes(int index, T choice) {
        super.getAdditionalAttributes(0, choice);
        AttributeMap am = new AttributeMap();
        am.put("autofocus", "");
        return am;
    }
}
0 голосов
/ 03 апреля 2012

Если вы используете кнопку Ajax, вы можете просто вызвать target.focusComponent(myComponent); в методе кнопки onSubmit.

0 голосов
/ 15 декабря 2010

Есть ли способ добиться того же без JavaScript?

(Я реализую форму с панелью обратной связи, которая появляется только когда Javascript выключен, поэтому не имеет смысла зависеть от JavaScript там ..., -)

Я мог только найти ответы, которые используют JS .focs () ... возможно, Wicket 1.5 предоставит метод Component.setFocus () ...

...