由 引起的思考

  前阵子在一个移动项目中,经过 <a href = "#" >  的方式 绑定click 事件来提交一个表单,因为表单信息比较敏感,因而采用的post 同步提交的方式,本来到也没有什么。后来万恶的PM说 “你这个按钮呀,要固定在底部比较好” ,因而乎就经过 position:fixed 固定到底部了。那么,问题来了 , 在ios 下,虚拟键盘是浮在页面上层的,致使的结果是当键盘收起后,浮在最底部的按钮不在最底下,而跑到中间来了,(极端条件下还可能挡住输入框致使没法输入),而且随着屏幕的滚动而滚动,,(表现相似于absolute) ,,高大上的苹果也是真心坑了一回。javascript

  怎么办呢? 两种方案,一滚动时动态计算位置,实时监控位置一定是要消耗性能的,二是因为没法监控到虚拟键盘打开或者关闭,因此只能经过对表单元素绑定focus和blur事件来改变按钮position来达到想要的效果。因而balabala又搞完了。java

  搞完后就开始测试,而后有发现当有input元素处于focus状态时,点击提交按钮,无效!!!我再点,好了。。。ios

  缘由是由于blur事件会阻止click事件的执行。。。post

    好,我继续改。性能

  blur事件会阻止click事件的执行,可是不会阻止touch事件,因而想起把click改为tap吧。还真行。不用再点击两次了。测试

  大功告成,我得意的笑,我真聪明。google

  balabala 就上线了。debug

  一上线发现提交不了了。。。有必定几率出现请求被canceled 。。。orm

             

各类google没找出缘由,,问题出在哪里?click是没有问题,换成tap便有问题了,因而乎查了一下 touch event 的执行顺序,大体是这样blog

  

因而我测试 mouseup 是好的,touchend也是有问题的,,tap也是有问题的,,而当我用tap事件,handler处理的时候延迟100ms再$('*Form').submit() 又能够正常提交了。原来是submit执行的时机问题。

继续各类debug 抓虫子,,历史遗留的坑啊,,

最终到 <a href = "#" > 了,,当按钮点击事件执行,在请求hash前执行submit , 请求还没返回,因为改变了hash,同步的submit被cancel了,,,而因为各类缘由submit执行前,hash已经改变的话就能够顺利提交了,,

 

因而乎,把 <a href = "#" >  改为 <a href = "javascript:void(0)" > 终于万事大吉了。

相关文章
相关标签/搜索