在jsf组件中按下回车键时限制Ajax机制

Posted

技术标签:

【中文标题】在jsf组件中按下回车键时限制Ajax机制【英文标题】:Restrict Ajax Mechanism while enter key is pressed in jsf component 【发布时间】:2017-11-21 07:31:05 【问题描述】:

这里是捕获和禁用回车键的选择器

$(".disableEnterKey").keydown(function(event) 

    var charCode = event.charCode || event.keyCode || event.which;
    if (charCode === 13) 

        event.preventDefault();

        return false;
    
);

禁用primefaces-timepicker输入字段的回车键

    <pe:timePicker id="startTime"
    value="#xxx.xxx.var"
     mode="popup" startHours="0" endHours="23"
     showPeriod="true" widgetVar="startTimeWidget" 
     styleClass="form-control keyDownFalse disableEnterKey" >
        <p:ajax event="timeSelect" partialSubmit="false"
        listener="#xxx.var"
        update="endTime, duration" 
        oncomplete="keyDownFalse()"/>
    </pe:timePicker>

但这里的问题是 ajax 标签下的 update 属性。即,一旦触发开始时间选择器事件,我将更新结束时间选择器。但它应该只在从开始时间选择器中选择小时和分钟而不是按 enter 键时触发。

一旦在开始时间按下回车键,结束时间就会更新。

所以请建议我在按 Enter 时限制 ajax 机制的确切方法是什么。提前致谢。

【问题讨论】:

您在 oncomplete 中没有返回任何内容...您应该... ***.com/questions/34354839/… 是重复的吗? @Kukeltje,我认为return 不会影响任何更改。即 oncomplete="return keyDownFalse()"。 我也试过了。但对我的用例没有影响。 在 ajax 请求结束时会触发 oncomplete... 确定需要吗?但现在我想起来了(你确实需要'return'),你不能阻止来自ajax 调用本身的ajax 调用。您需要在 timePicker 上首先阻止调用。白天让我看看我是否能找到“某种”重复 【参考方案1】:

这种行为的根源实际上是设计使然, 在 enter 键上,原始 jQuery 插件 fgtimepicker 触发了值的更新,正好是 here。

要解决此问题,最简单的方法是扩展插件并更改此特定行为。扩展方法的一个例子:

$.extend($.fgtimepicker, 
   _doKeyDown: function (event) 
       //copy original source here with different handling for 13/enter case        
   
);

输入案例处理的完整示例如下:

<script>
//<![CDATA[
    $.extend($.fgtimepicker, 
        _doKeyDown: function (event) 
            var inst = $.fgtimepicker._getInst(event.target);
            var handled = true;
            inst._keyEvent = true;
            if ($.fgtimepicker._timepickerShowing) 
                switch (event.keyCode) 
                    case 9:
                        $.fgtimepicker._hideTimepicker();
                        handled = false;
                        break; // hide on tab out
                    case 13:
                        //CHANGE Enter KEY BEHAVIOUR
                        //NO NEED TO FIRE THE UPDATE ---> $.fgtimepicker._updateSelectedValue(inst);
                        $.fgtimepicker._hideTimepicker();
                        handled = false;
                        break; // hide on tab out
                    case 27:
                        $.fgtimepicker._hideTimepicker();
                        break; // hide on escape
                        default:
                            handled = false;
                
             else if (event.keyCode == 36 && event.ctrlKey)  // display the time picker on ctrl+home
                $.fgtimepicker._showTimepicker(this);
             else 
                handled = false;
            
            if (handled) 
                event.preventDefault();
                event.stopPropagation();
            
    
 );
 //]]>
 </script>

这将防止由 Enter 键引起的任何更新事件。

请注意,这段脚本必须像 document.ready 一样立即启动,这就是我在 &lt;script&gt; 标签中包含扩展的原因,以便以后的人更清楚。

【讨论】:

以上是关于在jsf组件中按下回车键时限制Ajax机制的主要内容,如果未能解决你的问题,请参考以下文章

当用户在文本框中按下回车键时如何不关闭表单

在表单中按 Enter 时执行的默认操作

如何判断何时在 TextBox 中按下回车键?

如何检测是不是在JS中按下回车键[重复]

在 React Native 中按下回车时如何禁用在多行 TextInput 中插入新行

Java Swing组件回车键触发按钮