input中的回车事件引起的页面调转
前两天发现一个bug,当在一个input输入框中按下回车时,页面会调转到别的页面,但是触发的keydown事件中并没有页面调转相关的操作,页面为什么会调转呢?主要原因是form表单中只有一个input输入框和一个button按钮,当input中按下回车时,不仅自身绑定的keydown事件触发,而且button的onclick事件也会触发,他们顺序执行,也正是onclick事件中的方法使页面跳转到了别的页面。ok明白了原因就好解决了,可是还有疑问,这里的bug只出现在neo同学的浏览器中,而我自己和组内别人的浏览器中并不出现,这又是为什么呢?经过调试才发现,neo同学的浏览器加载后会报一个QuotaExceededError的异常,keydown事件的函数执行到本地储存的setItem函数时报错QuotaExceededError(google该报错:用户关闭了本地存储或存储已被占满),之后的操作就不执行了,然后跳转到首页,也就是由于js执行过程中有错误而有没有进行异常处理引起的,那么就对setItem方法加上try{…}catch语句块,之后调试,ok一切正常页面不再跳转到别的页面。似乎这样就解决了这个问题,但是当用alert调试时又出现此问题,而用console.log调试却不会出现该问题,显然当keydown事件的执行函数中出现类似于报错或者等待用户操作的中断行为时,button的onclick事件还是会执行,那么就把onclick事件先去掉看看是否成功,去掉后发现这次form表单直接提交了,也就是说对于上面的一个表单,input中的keydown事件触发的函数执行中若中断,button有onclick事件时会执行onclick事件,没有则会执行form表单绑定的事件,如果form表单也没有事件,那么form表单就直接提交。最后将button按钮换成了a标签成功了,即使input的keydown事件执行的函数中断也不会出现页面跳转的问题了,而页面样式通过class定义的,所以button换成a也不需要再更改样式。
总结:当一个form表单中只有一个input输入框和一个button按钮时,触发input的keydown(key=13,即回车)事件,keydown事件指定函数会执行,如果执行过程中出现中断,那么就会执行button的oncllick事件或者提交表单。