primefaces jsf p:ajax事件keyup忽略箭头键

时间:2014-11-04 19:12:45

标签: ajax jsf primefaces keyup

我有一个inputText字段,旁边有一个验证按钮。单击“验证”按钮时,它会执行一些后端验证,并在按钮旁边显示绿色复选标记。我希望绿色复选标记在值更改时消失,并且在失去焦点时立即消失,因为页面上有一个测试按钮,我也在有效时禁用/启用。所以event =“blur”或者even =“change”将不起作用,因为他们可以在输入文本字段更改时单击该按钮。我使用了keyup,效果很好,但是箭头键和标签等...触发事件,我不想要它们。

<h:inputText id="baseURL" style="width:425px;" value="#{View.baseURL}">
    <p:ajax event="keyup" update="validIcon :addEditCatalogForm:testUrlButton" listener="#{View.resetValidation()}"/>
</h:inputText>    

我为此看到了JQuery选项,但我需要一个与jsf和primefaces标签一起使用的选项。

3 个答案:

答案 0 :(得分:1)

从我在这里看到的内容:http://forum.primefaces.org/viewtopic.php?f=3&t=24788

解决方案将接近:

<h:inputText id="baseURL" style="width:425px;" value="#{View.baseURL}" onkeyup="if (event.keyCode != ####_YOUR_KEYS_####) return false;">
    <p:ajax event="keyup" execute="@this keyCode" update="validIcon :addEditCatalogForm:testUrlButton" listener="#{View.resetValidation()}"/>
</h:inputText>    

答案 1 :(得分:1)

因此,使用Thrax的答案,我使用后端做到了。我认为这个解决方案很麻烦,我希望有更简洁的方法来做到这一点,所以如果有其他人有更好的解决方案,请告诉我。

以下是代码:

  <h:inputText id="baseURL" style="width:425px;" value="#{bean.valueYouAreChanging}" onkeyup="document.getElementById('#{keyCode.clientId}').value=event.keyCode">
        <p:ajax event="keyup" process="@this keyCode" update="validIcon :form:testUrlButtonPost" listener="#{bean.resetValidation}"/>
  </h:inputText>
  <h:inputHidden id="keyCode" binding="#{keyCode}" value="#{bean.keyCode}" />

这是bean代码。我不想要很多键来触发更改,例如箭头键,标签,输入,主页,结尾等......

public void resetValidation() {

    String[] invalidKeys = {"9","13","16","17","18","19","20","33","34","35","36","37","38","39","40","45","224"};
    List<String> keys = new ArrayList<>();
    for(String key : invalidKeys) {
        keys.add(key);
    }
    if(!keys.contains(keyCode)) {
        validBaseURL = false;
    }
}

答案 2 :(得分:0)

我发现了一个更简单的解决方案,只需将无效键数组作为JS数组字符串返回:

public String getInvalidKeysJSArray() {
    return "[9, 13, 16, 17, 18, 19, 20, 33, 34, 35, 36, 37, 38, 39, 40, 45, 224]";
}

然后在您的输入组件中,onkeyup参数看起来像

onkeyup="return '#{keyUtilsController.invalidKeysJSArray}'.indexOf(event.keyCode) &lt; 0;"

请注意,IE Array原型可能不包含indeoxOf函数。