而输入有焦点

时间:2009-11-19 20:43:05

标签: javascript prototypejs

我有一个输入字段,其具有在聚焦时出现的字段提示。问题是我正在使用原型效果并提示Effect.toggle',如果有人在字段中输入,那么退格,则提示全部向后。有没有办法在输入有焦点时设置var或case或者可以设置的东西?

   function fieldHint(fieldName,cloneField){
        var hint = $(fieldName);
        var clone = $(cloneField);
        //only show fieldhint if input is empty
        if(clone.value==''){
            Effect.toggle(hint,'appear', { duration: 0.3 });
            //clone position of input box for fieldhint
            hint.clonePosition(clone,{
                offsetTop: 18,
                offsetLeft: 15,
                });
        }
    }
    function disableFieldHint(input,why,fieldName){
        var hint = $(fieldName);
        var input = $(input);
        var inputLength = input.value.length;
        if(why=='key' && inputLength<1){
            Effect.toggle(hint,'appear', { duration: 0.1 });
        }
        if(why=='blur' && inputLength<1){
            Effect.toggle(hint,'appear', { duration: 0.1 });
        }
    }

我通过onFocus调用fieldHint()并通过onBlur或onKeyDown调用disableFieldHint()所以我认为它变得混乱,因为onKeyDown最初工作以隐藏提示,但如果窥视类型然后退格所有内容,则开始输入再次,onKeyDown + value =“”将是真的,并且因为fieldHint()是一个切换,它将在人们输入时再次显示fieldhint,并且所有内容都被零除 - 除非窥视然后再次退格并再次开始输入,然后一切都是颠倒的世界 - 除非他们再次退格并再次开始打字,那么它就像fubar一样,并且相反的一天持续几秒钟。

我知道我可以使用style.display来显示或隐藏提示,但渐渐使我看起来更像我知道我在做什么(显然不是这样)。

谢天谢地,先生们。

2 个答案:

答案 0 :(得分:0)

我会在触发onKeyDown时设置一个标记,并将其清除onBlur,例如fieldName.hasStartedInput = true。这样,你可以在尝试显示提示之前检查标志,如果是,则不显示提示。

编辑:处理您发布的新代码。这有点复杂和重复,所以我为你修剪了一下。我没有你所有的代码,所以我显然无法测试它,但你至少应该能够得到这个想法。

var typing = false, first = false;

function isTyping(areThey) {
    typing = areThey;
}

function fieldHint(fieldName, cloneField) {
        var hint  = $(fieldName);
        var clone = $(cloneField);

        // only show fieldhint if input is empty
        if ( clone.value == '' && !typing && !first ) {
                first = true;
                Effect.toggle(hint, 'appear', { duration: 0.3 });
                //clone position of input box for fieldhint
                hint.clonePosition(clone, {
                        offsetTop: 18,
                        offsetLeft: 15,
                });
        }
}

function disableFieldHint(input, why, fieldName) {
    var hint = $(fieldName);
    if ( why == 'key' && typing && first && $(input).value.length == 0 ) {
        Effect.toggle(hint, 'appear', { duration: 0.1 });
        first = false;
    }
    else if ( why == 'blur' && typing == first ) {
        Effect.toggle(, 'appear', { duration: 0.1 });
    }
}

重点是不要忘记JavaScript有真正的布尔类型,这意味着你可以使用truefalse,而不是0和{ {1}},或1"TRUE"。话虽如此,您必须在调用"FALSE"的地方更新您自己的代码,并确保传入的是布尔类型,而不是字符串isTyping()"TRUE"。 / p>

答案 1 :(得分:0)

好的..感谢Justin Johnson的指导,这是我想出的火车残骸......我添加了一个基于模糊或keydown设置的功能...然后添加了一个var来说人们已经开始输入因为onkeydown检查仍然存在问题,因为如果他们正在键入并且在keydown上调用了禁用,即使键入为true,它仍会激活,因为它被调用以隐藏初始keydown上的提示......呃,不知道这是否有意义。

无论如何,它检查它是否是初始keydown,如果是隐藏提示,如果不隐藏它(因为它已经隐藏了,再次调用hide会显示它[thx TOGGLE!]) 。它还可以防止显示提示再次出现,如果某人键入然后退格,然后再次输入.... wut

    typing = '';
function isTyping(areThey){
    if(areThey == 'TRUE'){
        typing = 'TRUE';
    }else{
        typing = '';
    }
}

frst=0;
function fieldHint(fieldName,cloneField){
    var hint = $(fieldName);
    var clone = $(cloneField);

    //only show fieldhint if input is empty
    if((clone.value=='') && (typing != 'TRUE') && (frst==0)){
        frst = 1;
        Effect.toggle(hint,'appear', { duration: 0.3 });
        //clone position of input box for fieldhint
        hint.clonePosition(clone,{
            offsetTop: 18,
            offsetLeft: 15,
            });
    }
}

function disableFieldHint(input,why,fieldName){
    var hint = $(fieldName);
    var input = $(input);
    var inputLength = input.value.length;
    if(why=='key'){
        switch(typing){
            case 'TRUE':
                if((inputLength<1) && (frst==1)){
                    Effect.toggle(hint,'appear', { duration: 0.1 });
                    frst = 0;
                }
        }
    }
    if((why=='blur')&&(typing=='TRUE')&&(frst==1)){
        Effect.toggle(hint,'appear', { duration: 0.1 });
    }
    if((why=='blur')&&(typing=='')&&(frst==0)){
        Effect.toggle(hint,'appear', { duration: 0.1 });
    }
}