2014-05-16 46 views
4

我有一些熱鍵的JSF形式,例如,CTRL + S將保存數據。Primefaces SelectOneMenu選擇項目,當按Ctrl +鍵(熱鍵)時

問題是,當按下組合鍵並且焦點位於<p:selectOneMenu>字段時,將選擇以S開頭的第一個項目(以下示例),然後提交表單。

您可以重現此問題在showcase,在第一個字段,按CTRL +Ø。在Chrome中,至少它會選擇第一個選項,然後選擇瀏覽器「打開對話框」。

我希望此組件在按下特殊鍵時忽略該字母。

我已經測試了這個行爲對SELECT HTML元素和jQuery UI的「組合框」,但它並沒有發生。 SelectOneMenu的Primefaces實現是輸入字段的不同包裝。

我在PF用戶指南中列出的onkeyuponkeydown屬性中嘗試了return false。沒有結果。

我試着用preventDefault()return false加入jQuery鍵盤事件監聽器。沒有。

在深入研究PrimeFaces代碼之前,我想知道是否有針對這種情況的已知解決方法。

+0

在PF論壇討論的問題//論壇。 primefaces.org/viewtopic.php?f=3&t=38020&p=124953 – alfonx

回答

3

我從SVN存儲庫中檢出了更新版本的PrimeFaces源代碼。組件中有一些Javascript函數被修復。

然後我提取那些固定的函數,並把它們放在一個Javascript文件中,以覆蓋原來的。

的代碼如下:

/** 
* Fix for selectOneMenu when key is pressed along with CTRL 
*/ 
PrimeFaces.widget.SelectOneMenu = PrimeFaces.widget.SelectOneMenu.extend({ 

    bindKeyEvents: function() { 
     var $this = this; 

     this.focusInput.on('keydown.ui-selectonemenu', function(e) { 
      var keyCode = $.ui.keyCode, 
      key = e.which; 

      switch(key) { 
       case keyCode.UP: 
       case keyCode.LEFT: 
        $this.highlightPrev(e); 
       break; 

       case keyCode.DOWN: 
       case keyCode.RIGHT: 
        $this.highlightNext(e); 
       break; 

       case keyCode.ENTER: 
       case keyCode.NUMPAD_ENTER: 
        $this.handleEnterKey(e); 
       break; 

       case keyCode.TAB: 
        $this.handleTabKey(); 
       break; 

       case keyCode.ESCAPE: 
        $this.handleEscapeKey(e); 
       break; 
      } 
     }) 
     .on('keyup.ui-selectonemenu', function(e) { 
      var keyCode = $.ui.keyCode, 
      key = e.which; 
      switch(key) { 
       case keyCode.UP: 
       case keyCode.LEFT: 
       case keyCode.DOWN: 
       case keyCode.RIGHT: 
       case keyCode.ENTER: 
       case keyCode.NUMPAD_ENTER: 
       case keyCode.TAB: 
       case keyCode.ESCAPE: 
       break; 

       default: 
        var text = $(this).val(), 
        matchedOptions = null; 

        clearTimeout($this.searchTimer); 

        matchedOptions = $this.options.filter(function() { 
         return $(this).text().toLowerCase().indexOf(text.toLowerCase()) === 0; 
        }); 

        if(matchedOptions.length) { 
         var highlightItem = $this.items.eq(matchedOptions.index()); 
         if($this.panel.is(':hidden')) { 
          $this.selectItem(highlightItem); 
         } 
         else { 
          $this.highlightItem(highlightItem); 
          PrimeFaces.scrollInView($this.itemsWrapper, highlightItem); 
         } 
        } 

        $this.searchTimer = setTimeout(function(){ 
         $this.focusInput.val(''); 
        }, 1000); 

       break; 
      } 
     }); 
    } 
}); 
+0

你說:「我從SVN倉庫檢出了PrimeFaces源代碼的新版本」,但在5.0.8中我仍然看到這個問題。 您使用了哪一種--SNAPSHOT?它是一個5.1-SNAPSHOT嗎? – alfonx

+1

@alfonx那時候我從SVN主幹那裏得到了修訂版10632。我現在也嘗試過[展示案例中的新組件](http://www.primefaces.org/showcase/ui/input/oneMenu.xhtml),並且當我持有CTRL或其他特殊的關鍵。另一方面,PF有很多小錯誤,迴歸並不罕見。實際上,我不推薦JSF用於新項目,除非您的標準非常低,並且此類應用程序的時間很短。 – utluiz

+0

我可以在5.0.8 Showcase中使用Firefox 28在Linux上重現該錯誤:http:// www。primefaces.org/showcase/ui/input/oneMenu.xhtml – alfonx