如何在Tapestry5中更新区域后设置焦点

时间:2011-01-11 22:55:45

标签: tapestry

我有一个区域,其中包含一个包含循环的表单。当有人更改循环中的文本字段时,它会更新整个表单并循环onKeyUp事件。

我正试图找到一种方法告诉Tapestry将焦点返回到上次更新的文本字段。我认为我有这个工作,但区域更新似乎使文本字段在设置焦点后立即失去焦点。我可以将焦点设置为区域外的字段而不会出现问题,因此它似乎是导致问题的区域更新。

有关如何处理此事的任何建议吗?

3 个答案:

答案 0 :(得分:5)

听起来你需要在重新加载区域后设置焦点。每当我需要执行这样的任务时,我会设置一个观察者来监听Javascript中Tapestry区域更新的事件:

$('formZone').observe(Tapestry.ZONE_UPDATED_EVENT, function(event) {
    // set the focus
});   

希望这有帮助。

答案 1 :(得分:3)

Form组件有autofocus参数,默认情况下为true,导致使用表单呈现一些JavaScript。在表单加载后,JS将焦点设置为第一个表单元素。

autofocus设置为false会禁用此行为:

<form t:type="Form" t:autofocus="false">

答案 2 :(得分:3)

我知道这是一个旧线程,但我所做的是:

使用jquery:

<t:zone t:id="formZone">
<t:form .... class="formId" t:zone="formZone>
.
.
</t:form>

jQuery.noConflict();
(function($) { 
  $(document).ready(function() {
      $(".formId").find("input, select").filter(function(){
          if($(this).val() == ""){           
             return true;
          }
        }).first().focus();

  });
})(jQuery);


</t:zone>

这将关注第一个空输入或选择。当然,您必须在页面上包含jquery。 noConflict确保您不会遇到原型问题。