2011-01-11 27 views
2

我有一個區域包含一個包含循環的窗體。當某人更改循環內的文本字段時,它會更新整個表單並在onKeyUp事件上循環。如何在Tapestry5區域更新後設置焦點

我想找到一種方法來告訴Tapestry將焦點返回到上次更新的文本字段。我認爲我有這個工作,但區域更新似乎使焦點設置後立即失去焦點的文本字段。我可以將焦點設置在區域外的一個沒有問題的區域,因此它似乎是導致問題的區域更新。

有關如何處理此問題的任何建議?

回答

5

聽起來像是你需要將焦點設置在區完成重裝後。每當我需要做一個任務一樣,我成立了偵聽JavaScript中的掛毯區更新的事件的觀察員:

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

希望這有助於。

3

Form組件具有autofocus參數,默認情況下該參數爲true,導致一小部分JavaScript與表單一起呈現。 JS在窗體加載後將焦點設置爲第一個窗體元素。

設置autofocusfalse禁用此行爲:

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

謝謝。我實際上已經嘗試了這兩種方式,似乎並不是問題所在。我可以將焦點設置爲區域更新之外的任何字段,而不會出現問題。它只是在區域中的那些我不能讓光標保持活動狀態。 – Mark 2011-01-12 15:07:47

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可以確保你不會遇到原型問題。