【问题标题】:TextField Valdiation in Appcelerator TitaniumAppcelerator Titanium 中的文本字段验证
【发布时间】:2011-07-31 10:56:51
【问题描述】:

如何在 Titanium 或 JavaScript 中验证我的 TextField 以将其限制为仅数字。

var txt_appt2 = Titanium.UI.createTextField({
    top:2,
    left:240,
    width:75,
    color:'#000',
    backgroundColor:'#fff',
    font: {fontSize: 12}
});

【问题讨论】:

    标签: javascript android titanium


    【解决方案1】:

    对于那些想知道为什么他们会遇到连续循环和错误的人;

    问题在于没有监听 onChange 事件。这是正确的事件,因为每次更改值时都会触发。 IE。复制粘贴、按键等。

    在 iOS 用户可以复制和粘贴字符,即使您只限于十进制/数字键盘。

    避免尝试通过引用文本字段属性本身来直接设置字段值。而是使用文本字段更改时返回的文本字段属性。这样做不会导致 onChange 事件继续触发,从而导致永无止境的循环。

    // XML

    <TextField keyboardType="Ti.UI.KEYBOARD_TYPE_DECIMAL_PAD" value="0.00" onChange="Alloy.Globals.helper.decimalFormat" />
    

    // Alloy.js

    Alloy.Globals.helper = {
        decimalFormat: function(e) {
            // Strip all characters from the input except digits
            var input = e.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');
            e.source.value = input;
        }
    };
    

    【讨论】:

      【解决方案2】:

      添加

      keyboardType:Titanium.UI.KEYBOARD_NUMBER_PAD,
      

      到文本字段。

      参见http://www.lonhosford.com/lonblog/2011/04/06/titanium-limit-the-characters-in-a-textfield/的示例

      【讨论】:

      • 解决方案更好,但我认为它不会禁止用户将无效字符粘贴到字段中
      • 在iphone中你可以改变键盘和输入字符。我也相信您将能够在android中的数字之间引入空格
      【解决方案3】:
      txt_appt2.addEventListener('change',function(e){
          txt_appt2.value = txt_appt2.value.replace(/[^0-9]+/,"");
      });
      

      【讨论】:

      • 这个解决方案,对我来说,一旦你更新值就会触发 change 事件。这将导致不必要的循环。
      • 这是因为您立即将值设置到文本字段并且它一遍又一遍地触发相同的事件。尝试通过在事件侦听器块中执行“e.source.value = ....”来设置值。创建全局验证方法并从 XML 或动态构建 UI 时调用它会更容易。即:onChange="Alloy.Globals.validation.validateFloatField"Alloy.Globals.validation = { validateFloatField : function (e) { var input = e.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1'); e.source.value = input; } }