关于jsf 2:当JSF生成HTML代码时,textarea的onPaste属性在哪里?

Where does onPaste attribute of a textarea goes when JSF generates HTML code?

我在JSF页面中有这个

1
2
<textarea id="textarea" rows="4" cols="50"
                    onKeyPress="validate(event)" onPaste="validatepaste(event)"></textarea>

我不使用的原因是此JSF标记似乎缺少onPaste属性。

当我在Google Chrome浏览器中调试代码时,我惊讶地发现onPaste属性不存在,
呈现的html代码是,

1
2
<textarea id="j_id_2:textarea" name="j_id_2:textarea"
      onkeypress="return validate(event)" cols="15" rows="5"></textarea>

由于JSF只是HTML代码生成器,因此我无法理解它对onPaste属性的作用,为什么不支持它?

其次。如何在此html textarea上实现值绑定?

编辑:
由于onkeyup受支持且已标准化
为什么使用时onkeyup功能会中断?

我无法实现与html textarea字段相同的功能。

下列功能可防止用户通过键盘输入或复制粘贴手动输入时,将字母缩写文本替换为""。
这是代码段:

1
2
3
4
5
6
7
8
9
10
11
function validate(e) {
    console.log(e)
    var invalidcharacters = /[^0-9]/gi
    var phn = document.getElementById('textarea');
    if (invalidcharacters.test(phn.value)) {
        //e.value = e.value.replace(invalidcharacters,"");
        console.log("REPLACING");
        newstring = phn.value.replace(invalidcharacters,"");
        phn.value = newstring
    }
}

可以正常显示html,如下所示。这是jsfiddle

1
<textarea id="textarea" rows="4" cols="50" onkeyup="validate(event)"></textarea>

不能实现相同的功能

1
2
<h:inputTextarea value="#{myBean.myValue}" id="compTextArea"
onkeyup="validate(event)"></hinputTextarea>

并将js文件方法中的var phn = document.getElementById('textarea');行替换为document.getElementById('compTextArea');

为什么这看起来很奇怪?


1
<textarea ... onKeyPress="..." onPaste="...">

首先,JSF使用Facelets作为视图技术。 Facelets使用XHTML + XML生成HTML。驼峰式属性在XHTML中无效。分别是onkeypressonpaste。也许您从中获得此信息的来源是将其与" onPaste" DOM事件处理程序混淆了。

1
<textarea ... onKeyPress="..." onPaste="...">

其次,onpaste属性不是任何标准规范的一部分。另请参见有关MDN的HTMLElement.onpaste文档。 JSF并非旨在生成非标准的兼容代码,因此无法作为标准组件的属性使用(但是,一旦成为DOM标准的一部分,它可能会在将来的JSF版本中出现)。

但是,无论如何,您都可以使用新的JSF 2.2" HTML5友好标记"功能来实现它:传递属性。

1
2
3
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputTextarea ... a:onpaste="..." />

请注意,由于onpaste不属于任何当前标准,因此其功能取决于所使用的Web浏览器的版本。您的Chrome版本显然不支持它,因此在其DOM检查器中是不可见的(但仍可以在原始HTML源代码中看到,如通过右键单击,查看源代码或按Ctrl + U可以看到的那样)。

也可以看看:

  • JSF不呈现自定义HTML标记属性