JavaScript的blur事件中的一些问题。

    设想一下有这样的一种情况:

    在一个文本框失去焦点的时候触发onblur事件,如果不符合验证就select到这个文本框上。
现在有多个文本框每个文本框都有onblur事件,当第一个文本框和第二个文本框的值都不符合验证的时候。在其之间切换光标就会造成死锁。

这个问题似乎很好解决,以下是某人给出的回答:

    可以这样,你让用户再填写多个文本框的时候,如果第一个填写的有问题,就让焦点再回到第一个文本框,这样除非第一个文本框中的内容是合法的,否则用户无法点击到第二个文本框上.这样就不回出现"死锁"问题.这是一个方法.还有就是再点击button按钮的时候对所有文本框做校验,如果有一个不符合,就让button的disable='true',甚至可以提示用户那个文本框有什么样的错误.

    这样的回答看似有道理,但是实际上并不能解决问题,因为这里造成死锁的原因主要是“在光标之间切换”。

    如果第一个文本框不合法,第二个也不合法,第一个文本框上按TAB切换到下一个文本,这个时候光标首先离开第一个文本到第二个文本,第一个文本的值不合法又把焦点给指定到第一个文本框上,这个时候焦点就离开了第二个文本,第二个文本也不合法又把焦点给指定到第二个文本框上,这个时候第一个…………第二个…………第一个…………

    本人没有试过,但是blur确实很容易引起一些问题。我遇到的问题不是死锁,而是在ajax中blur事件的触发离提交表单发生得太近的情况。

    我要提交一个注册表单,表单域中依次有name  password  验证码三个input框,nameflag passflag verifyflag三个全局变量的初始值为false,当输入的格式不对,或者值不满足服务器的要求时,onblur事件处理函数将三个flag继续保持false,如果格式正确,同时服务器返回的值也正确,那么将该flag变为true。为了能即时的返回用户提示信息,我给name和验证码输入框的onblur事件中提交了ajax请求。好了,输好name以后,离开焦点转到密码输入框,ajax告诉我name不存在,可以使用,然后我填写密码,接下来填写验证码,当我一填写完验证码,我开始点提交了,这时我发现提交不了,因为if语句判断verifyflag值还是false,再点第二次,才能提交。

    是怎么回事呢,原来是因为ajax是异步请求,异步请求不等服务器返回,js就开始执行下面的操作了,当点击提交,判断verifyflag发现还是false,而这时说不定服务器才刚刚改变了verifyflag,所以第二次点击提交能成功。解决这个问题我们可以讲ajax的请求设置成同步的。