Page 53 - JavaScript修炼之道
P. 53

42       第四部分  表单技巧


             任务 18  暂时禁用提交按钮


                 有时候,表单要花一点时间等待服务器处理。这有可能是在用老式的 <input type="file"..
             />  域上传大文件,或者服务器由于某种原因还没来得及响应。无论如何,我们不希望我们还在
             处理它的时候用户再次提交表单。要知道遇到重复提交是很令人恼火的事。

                 为了避免重复提交,可以禁用已提交过的表单的所有提交方式。这实际上就是禁用带有
             type="submit"或者type="image"属性的<input>或<button>标签。由于有的浏览器(比如“可
             爱”的MSIE)对CSS属性选择器处理得不好,我们最好还是给这些元素标记上特定class属性,
             比如submit,然后再用这个class属性选择想禁用的元素。

                 右页的第一段脚本通过很短的Prototype代码实现了这个功能。它非常简洁。

                 你可能想进一步给表单加一些等待提交时的UI装饰——因为并非所有的浏览器都清楚地显
             示被禁用的区域,而且你也可能想要强调正在处理之中(你肯定不只是因为那东西讨厌所以才
             禁用它的吧)。

                 第二段脚本展示了怎样通过给被禁用的<input>标签填加自定义class属性来实现等待时的
             UI装饰。因为用CSS做的UI更新不像禁用函数调用那么实时,所以浏览器在提交开始之前需要一
             段间歇,否则提交开始之后浏览器就可能一直处理提交事件,而不再响应UI更新请求。因而我们
             通过delay()把submit()调用延迟十分之一秒。

                 另外,注意到这里的JavaScript代码还用到了that = this闭包技巧。你也许知道,调用函
             数(这里是要 delay()的那个)有可能会丢失当前束定,即this引用的值。一种办法是强制保
             持束定,这需要一层额外的函数封装,比较麻烦。我们这里用闭包来让那个临时定义的匿名函数

             中的代码维持到原先的this(被提交的表单对象)的引用,使得在适当的时候能够调用它的
             submit()。
                        ①









             ——————————
                ① 觉得JS的函数束定很晕吧?在http://www.alistapart.com/articles/getoutbindingsituations/上有我的ALA文章你可以看
                  看。搞不太清楚闭包,也不知道怎么发挥其作用?我的朋友Juriy  “Kangax”Zaytsev就这个问题写了一篇很棒的
                  文章,网址在http://msdn.microsoft.com/en-us/scriptjunkie/ff696765.aspx。
   48   49   50   51   52   53   54   55   56   57   58