2009-11-19 71 views
0

我有一个输入字段,它具有焦点时出现的字段提示。问题是我正在使用原型效果并且提示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 }); 
     } 
    } 

我通过打电话的聚焦状态fieldHint(),并通过任意的onblur调用disableFieldHint()或onkeydown事件......所以,我认为它感到困惑,因为工作的onkeydown最初隐藏的提示,但如果偷看类型,然后一切退格,然后再次开始输入,onKeyDown + value =“”将为true,并且由于fieldHint()是一个切换键,它会在人们输入时再次显示fieldhint,并且所有内容都被零除 - 除非窥视再次退格并且再次开始打字,然后所有东西都会颠倒过来 - 除非他们再次退格并再次打字,那么这就是所有的fubar,并且像是在相反的日子里呆了几秒钟。

我明白我可以使用style.display来显示或隐藏提示,但淡入淡出让我看起来更像是我知道自己在做什么(显然不是这样)。

谢谢亲切,好的先生们。

回答

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,不01,或"TRUE""FALSE"。有了这个说法,只要调用isTyping(),就必须在自己的代码中进行更新,并确保您传递的是布尔类型,而不是字符串"TRUE""FALSE"

+0

例如,PLZ?[................ .....] – stormdrain 2009-11-20 14:57:08

+0

非常感谢您的反馈。对于另一篇文章感到抱歉;我在这里有点新,礼节不是我的强项。我会听从你的建议。 我什么都不是,如果不是我的代码冗余。与我的例子相比,你的例子简洁明快。然而,我无法测试它,因为我必须做更多的努力才能使其发挥作用,并且现在是一个完全不同的野兽。有一个问题:“^”究竟做了什么?我试图寻找它,但空了。它是“或”运营商吗?如果是这样,它与“||”有什么不同?再次感谢。 – stormdrain 2009-11-23 17:28:54

+0

这是xor操作符。它与'||'相似,但如果*只有一个值为真,则为真,与“||”相反,如果其中任何一个或两个都为真,则为真。你的代码正在检查它们是否都是真的,或者它们是否都是假的,做'!(a^b)'检查以确保它们没有区别。然而,再看一遍后,它可以简化为'else if(为什么=='模糊'&&打字==先){'。既然要求它们都是真的或者都是假的,如果它们是平等的,那么这个要求必须是真实的。 – 2009-11-23 19:59:08

0

行..感谢Justin Johnson的指导,这是我想出的故障...我添加了一个基于模糊或keydown设置的函数...然后添加了一个var说人们已经开始打字是因为onkeydown检查仍然存在问题,因为如果他们正在键入并且在keydown上调用了禁用功能,即使打字是真实的,它仍然会激活cuz它被称为隐藏最初的keydown上的提示... Uhhh ,不知道这是否合理。

无论如何,它会检查它是否是最初的keydown,如果它隐藏了提示,如果不是,它不会隐藏它(因为它已经隐藏了,并且再次调用hide会显示它[thx TOGGLE!] )。它还可以防止节目提示再次来了,如果有人类型然后再只后退然后类型....武汉理工大学

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 }); 
    } 
} 
+0

我编辑了我的答案。将来,您不需要发布更多代码作为答案,只需编辑原始问题即可。事情保持更有组织的方式。 – 2009-11-20 19:22:09