2011-03-04 88 views
8

它似乎是一個簡單的要求,但我還沒有找到一種簡單的解決方案尚未:JSF:如何按下回車鍵時提交表單?

在JSF 1.2/3.3 RichFaces的web應用程序,我有各種類型的輸入部件的形式,然後是<a4j:commandButton><h:commandButton>。前者重置表單,第二個用輸入的數據執行一些操作。

我的目標是當用戶在輸入數據時按Enter鍵時觸發此操作。我怎樣才能做到這一點?

編輯:通常,我有不止一個<h:commandButton>/<form>。我想指定一個特定的默認操作。另外,我希望該解決方案能夠與AJAX(我們廣泛使用)進行良好的配合。

回答

8

除非你使用MSIE瀏覽器,實際上你只有一個沒有按鈕的輸入字段,它應該只是默認行爲。否則可能有一些(自動生成的)JS代碼搞砸了。

如果沒有文字區域的形式,一個簡單的辦法是以下幾點:

<h:form onkeypress="if (event.keyCode == 13) submit();"> 

或者,如果你有文本域,你不希望在所有非重複同樣的keypress功能-textarea輸入元素,在window onload期間運行以下腳本。在BalusC的回答

for (var i = 0; i < document.forms.length; i++) { 
    var inputs = document.forms[i].getElementsByTagName('input'); 

    for (var j = 0; j < inputs.length; j++) { 
     inputs[j].onkeypress = function(e) { 
      e = e || window.event; 
      if (event.keyCode == 13) { 
       this.form.submit(); 
       return false; 
      } 
     }; 
    } 
} 
+0

恐怕我忘了提到一些限制(參見我編輯的問題)。我不能只依賴於只有一個提交按鈕(並且如果焦點位於另一個按鈕上,我絕對不想攔截按鍵),並且我們使用AJAX風格的局部渲染,它將刪除事件偵聽器從輸入控件,不是嗎?不過,這是一個很好的起點,所以有一個upvote :-) – meriton 2011-03-04 19:54:40

6

大廈我想出了以下(在IE和FireFox測試):

<h:form id="form" onkeypress="ifEnterClick(event, #{rich:element('searchButton')});"> 

其中ifEnterClick被定義爲:

/** 
* Handler for onkeypress that clicks {@code targetElement} if the 
* enter key is pressed. 
*/ 
function ifEnterClick(event, targetElement) { 
    event = event || window.event; 
    if (event.keyCode == 13) { 
     // normalize event target, so it looks the same for all browsers 
     if (!event.target) { 
      event.target = event.srcElement; 
     } 

     // don't do anything if the element handles the enter key on its own 
     if (event.target.nodeName == 'A') { 
      return; 
     } 
     if (event.target.nodeName == 'INPUT') { 
      if (event.target.type == 'button' || event.target.type == 'submit') { 
       if (strEndsWith(event.target.id, 'focusKeeper')) { 
        // inside some Richfaces component such as rich:listShuttle 
       } else { 
        return; 
       } 
      } 
     } 
     if (event.target.nodeName =='TEXTAREA') { 
      return; 
     } 

     // swallow event 
     if (event.preventDefault) { 
      // Firefox 
      event.stopPropagation(); 
      event.preventDefault(); 
     } else { 
      // IE 
      event.cancelBubble = true; 
      event.returnValue = false; 
     } 

     targetElement.click(); 
    } 
} 

編輯:由於從Firefox中選擇一個值自動完成使用回車鍵觸發一個keydown事件,但沒有按鍵事件,使用onkeypress比onkeydown更可取。

2

只是把這個代碼在您的JS文件:

$('input,textarea').live('keydown',function(e) { // submit forms on pressing enter while focus is on any input elmnt inside form 
    if (e.keyCode == 13) { 
     $(this).closest('form').submit(); 
    } 
}); 
+2

這需要由OP未提及的jQuery。 – BalusC 2012-10-04 13:13:24

+0

另外,我確實說過它需要與AJAX一起工作,AJAX用AJAX響應替換了部分DOM。這將刪除任何由jQuery註冊的事件處理程序。此外,當用戶想要在文本區域輸入換行符時,您的解決方案將提交表單... – meriton 2012-10-04 18:52:08

0

使用PrimeFaces組件:

<!-- Default button when pressing enter --> 
<p:defaultCommand target="submit"/> 

將此與焦點組件結合使用,您將會搖滾!

<!-- Focus on first field, or first field with error --> 
<p:focus context="feesboek"/> 
相關問題