<body>
<form name="f1">
<input type="text" name="t1" onkeydown="document.f1.t2.value=document.f1.t1.value" />
<input type="text" name="t2" />
</form>
</body>
上面的代码小弟目的是想实现两个文本框的联动输入(英文),但是效果却不太好,输入的时候t2比t1慢一拍,比如t1输入abcd,此时t2的内容为abc。请问是为什么?
ps:用setTimeout可以实现这个效果,我想问一下上面的问题。

解决方案 »

  1.   

    <body>
    <form name="f1">
    <input type="text" name="t1" onkeyup="document.f1.t2.value=document.f1.t1.value" />
    <input type="text" name="t2" />
    </form>
    </body>
      

  2.   

    <form name="f1">
    <input type="text" name="t1" onKeyUp ="document.f1.t2.value=document.f1.t1.value" />
    <input type="text" name="t2" />
    </form>
      

  3.   

    晕,先谢谢你。那为什么我用onkeypress不可以呢?
      

  4.   

    这个要理解js线程了,我比较简单的说下吧
    开始我们js线程队列为空
    当我们点击一个按键的时候触发里面的方法"document.f1.t2.value=document.f1.t1.value",我们定义为t1,
    队列就push了t1,当t1进入队列后,渲染线程t2才形成并进入队列,因此在执行t1的时候,t2还没执行,所以document.f1.t2.value还是之前的状态,就导致了为什么会慢一拍的效果,
    而楼主说加上setTimeout就可以,onkeydown="setTimeout(function(){document.f1.t2.value=document.f1.t1.value},0)"
    是因为setTimeout会将函数放到队列的末尾执行,无论定时的毫秒数是多少都一样,所以这里面设置为0或者其他都没关系
    而用onkeyup没问题的原因是当点击按键会先触发onkeydown,所以渲染线程t2会在onkeyup=""前面执行,。。因此document.f1.t2.value已经是最新的状态了
      

  5.   

    楼主可以看看javascript引擎线程,界面渲染线程,浏览器事件触发线程的关系