Я думаю, что это не проблема для регулярных выражений, вы можете взглянуть на InputWidget, где реализует willIgnore.
https://github.com/zkoss/zk/blob/master/zul/src/archive/web/js/zul/inp/InputWidget.js
_shallIgnore: function (evt, keys) {
var code = (zk.ie||zk.opera) ? evt.keyCode : evt.charCode;
if (!evt.altKey && !evt.ctrlKey && _keyIgnorable(code)
&& keys.indexOf(String.fromCharCode(code)) < 0) {
evt.stop();
return true;
}
},
И вы обнаружите, что это только обнаружениеза один символ.
Так как оно не соответствует целому слову (это плохая производительность и бесполезно в общем случае), так что есть альтернатива не использовать регулярное выражение в вашем случае.
<textbox id="telNo" xmlns:w="client" >
<attribute w:name="doKeyPress_">
function(evt){
if(this.getValue().length > 0 ){
if (!this._shallIgnore(evt, "0123456789"))
this.$doKeyPress_(evt);
}else{
if (!this._shallIgnore(evt, "05"))
this.$doKeyPress_(evt);
}
}
</attribute>
</textbox>
Вы можете проверить код на платформе ZK Fiddle.
http://zkfiddle.org/sample/1b3nlr0/1-Textbox-input-restriction-sample
Если вы действительно хотите использовать регулярное выражение для маски ввода, это не невозможно,Вы можете выполнить следующие шаги:
1. Получить старое значение
2. Попытаться добавить новый символ к значению (необходимо игнорировать регистр для некоторого специального кода ключа, как делалIgnore)
3.Используйте полный текст, сделайте регулярное выражение, если оно не совпадает, остановите событие и верните false в onKeyPress.
Но в вашем случае использования, я думаю, образец достаточно хорош.
Вы можете выбрать другой вариант, для использования плагина jquery mask, ZK может хорошо работать с большинством плагинов jQuery.
http://www.meiocodigo.com/projects/meiomask/