funcreal 发表于 2013-1-23 02:59:07

页面控件事件和页面刷新的一个小陷阱

    这个小陷阱很小,以至于在公网上晒了5个多月才暴露出来。
    业务页面是这样的,一个下拉框和一个可办理业务列表。下拉框中是可选地市,业务列表中是当前选中的地市可办理的业务。当客户从下拉框中选择一个地市的时候,页面自动重新加载。当客户点击某业务办理的链接时,会把下拉框的当前地市值和业务的唯一标识发到服务器端。
   
<select name="city"id="city" onchange="changeCity()">... ...</select><script language="javascript">function changeCity(){window.location= '... ...?city='+ document.getElementById('city').value;}</script> 
    表面看上去,没有任何问题。测试也没出现状况。但是,这两天接到一个诡异的投诉:B地市的客户办理了A地市的业务。我经过一番折腾,排除种种可能后,最终确定错误就在这个页面。
    案发现场重现:客户首先查看A地市的业务,然后又想看看B地市的业务,于是从下拉框中选择B地市,此时就会触发changeCity函数。当网速很慢的时候,window.location这句话不会立刻执行,而是能看到地址栏中的进度条慢慢地爬行。但此时id为“city”的这个select控件的值已经变为了B地市。如果客户不留意,没等页面刷完就去点业务的话,就出现了B地市的客户办理了A地市的业务的情况。
    要解决这个问题有很多种方法,当选择地市的时候禁用当前页面所有业务,或者用ajax方式改造一下都行。
    通过这个小问题,我想应该能够引出一系列类似的问题。页面其实并不简单。
页: [1]
查看完整版本: 页面控件事件和页面刷新的一个小陷阱