在Titanium中动态设置passwordMask

时间:2013-09-10 02:29:43

标签: passwords titanium titanium-alloy

由于Titanium不允许您手动更改文本字段的hintText颜色,因此我必须手动设置hintText。因此,我必须在我正在使用的一个字段上动态更改passwordMask设置。

但是,我的行为很奇怪,我无法判断我是否做错了,或者是否是Titanium中的错误。

所以,这是我的标记:

<TextField id="password" onFocus="passwordFocusEvent" onReturn="passwordReturnEvent" onBlur="passwordBlurEvent" value="password"></TextField>

我的一些控制器代码:

function passwordFocusEvent(e) {
    slideViewUp();
    if (e.value === 'password') {
        e.source.setPasswordMask(true);
        e.source.value = '';
    }
}

function passwordBlurEvent(e) {
    if (!e.value) {
        e.source.setPasswordMask(false);
        e.source.value = 'password';
    }
}

function passwordReturnEvent(e) {
    slideViewDown();
    passwordBlurEvent(e);
}

发生的事情很奇怪。当我专注于密码字段时,它仍然是纯文本。我输入一些文字,然后点击关闭另一个字段,保持为纯文本。

我点击回密码字段,它仍然是纯文本。

现在这是奇怪的。到目前为止,我只是假设它不起作用。但是,当我第二次点击时,会设置passwordMask。

主要WTF。

我甚至尝试使用$.password.passwordMask = true;直接定位该字段,但同样如此。

1 个答案:

答案 0 :(得分:1)

不幸的是,你不能这样做。小字According to the docs on Ti.UI.TextField;

  

注意:在iOS上,必须在创建此文本字段时指定passwordMask。

虽然不是全部坏消息,但有几种方法可以解决这个问题,一种方法是通过收听change事件自行制作密码掩码:

var theStoredPassword = '';
$.password.addEventListener('change', function(e) {
    var newpass = e.source.value; 

    if(newpass.length < theStoredPassword.length) {
        // Character deleted from end
        theStoredPassword = theStoredPassword.substring(0, theStoredPassword.length-1);
    } else {
        // Character added to end
        theStoredPassword += newpass.substring(newpass.length-1);
    }
    // Mask the text with unicode ● BLACK CIRCLE, 25CF
    $.password.value = new Array(newpass.length + 1).join('●');
});

另一种选择是,只要用户关注密码字段,就会有两个文本字段并将它们交换出来,最上面的一个会有自定义的hinttext,最下面的一个是passwordMasked。事实上,这可能比我刚编写的更容易。 : - )