改善登陆界面的用户体验: 自动聚焦表单
作者:sofish 来源:幸福收藏夹 发布时间:2009-12-09 16:13:00
在登陆界面中,通常,最重要的部分为登陆的Form表。一个非常棒的提升体验的做法是,在载入页面时自动聚焦到第一个提供用户输入的表单框,让用户不用再多一个点击,就可以输入。这被很多网站采用。记得这在10个改善UI设计的技术(2)这篇文章中也有提到过,这也被很多网站采用,比如 * 就是这样:
当然,自动聚焦不仅仅适合在登陆界面,而适合在任何需要的界面。比如WordPress登陆后台的界面和支付宝的登陆界面,都采用了自动聚焦的方法。
而具体应该是怎样实现的呢?假设我们的表单如下:
<form id="signin" method="post" name="signin" action="http://www.happinesz.cn"> <input value="hidefor" type="hidden" name="hide" /> <input id="usr" name="usr" /> <input id="pwd" type="password" name="pwd" /> <input id="smbt" value="submit" type="button" name="smbt" /></form>
我们要让焦点落在id="usr"
的input
上,用 Javascript 的方法,我们可以这样做:
document.forms["signin"].elements["usr"].focus();
这里是当我们明确知道要在那个表单上添加 focus
的时候可以用的方法。这里,elements
也可以用方括号的方法来获取input
表单,比如.elements[0]
即为第一个input
表单。当我们要聚焦的 input
前面有type="hidden"
的隐藏input
,由于隐藏的input
是不支持.focus
的,一旦应用其上,就会出现Javascript错误,要避免这样的的错误。我们可以搜索第一个表单中,第一个非隐藏的 input
,并给加上.focus
:(除非你是想封装起来,自动判断,不然,最好不要用这个方法,多浪费资源啊,又if又for的)
window.onload = function(){ if(document.forms.length>0){ for(i=0;i<document.forms[0].elements.length; i++){ var oInput = document.forms[0].elements[i]; if(oInput.type!="hidden"){ oInput.focus(); return; } } }}
到这里,很多网站都只做到这里,比如我前面提到的Wordpress的登陆界面和支付宝的登陆界面。他们的目标的相同的,提升用户体验。我的目标也这样。但是,这有时候,这并不一定提升了用户体验。为什么呢?
想想,你是不是也曾出现过这样的状况:当时,你的网速并不快,你进入www.alipay.com的时候,还没有自动聚集,因为JS还没加载。但,你已经输入用户名了,并且已经在输入密码。好,打住。我们来讲个故事:很久很久以前,有个叫sofish,他当时挂着迅雷在下载XXX东西,急着想要用支付宝,当时页面还没有加载完,输入用户名后,正准备输入密码(习惯性地用键盘上的TAB键来切换到密码框),然后,抬头,当时,密码出现在输入用户名的框上,并且,旁边有一同学正在那里看着。
你看,你看,难道,这样的自动聚焦提升了用户的所谓的体验么? 这里,就往往相反,可能导致用户要重新改密码(比如那个当时RP比较低下的叫sofish的家伙)。
有什么方法可以解决么?当然!我们把上面的代码改装如下:
window.onload = function(){ if(document.forms.length>0){ for(i=0;i<document.forms[0].elements.length; i++){ var oInput = document.forms[0].elements[i]; if(oInput.type!="hidden" && oInput.value==""){ oInput.focus(); return; } } }}
但是,这样一来,这个聚集就会自动跳到下一个非隐藏的input
中,如果我正在输入,那不是很不爽? 嗯,当然不爽,所以,我们再折腾一下,做点小改正:
window.onload = function(){ if(document.forms.length>0){ for(i=0;i<document.forms[0].elements.length; i++){ var oInput = document.forms[0].elements[i]; if(oInput.type!="hidden" && oInput.value.length>0){ oInput.blur(); return; }else if(oInput.type!="hidden"){ oInput.focus();return } } }}
由于在oInput.type!="hidden"
中有一种情况,即当用户已经输入的时候,他会自动聚集到下一个,这样,也有问题,所以,我们让如果已经有输入的情况下,去掉所有input
的焦点,而 else if
中才让没有输入的用户自动对焦到第一个。(当然,如果有人习惯先输入密码,再输入用户名,那就再另想办法吧)。
其实,这样,有时候好用,但有时候相当于根本不去自动聚焦。不过,对于保护用户的输入(特别是密码)来说,我想,用改进的方法,会比无改进的自动聚焦和根本不自动聚集来得好。当然,我相信,会有更好的方法。请不吝赐教。其他的就让我这个爱折腾的JS编程学院新生慢慢发现吧。


猜你喜欢
- 共轭转置共轭转置The symbols (·)T , (·)∗, and (·)H are,respectively, the transp
- 为了降低用户注册难度,国际站的主注册表单一直在改进。主注册三月至今发生了两次较大的变化,现在对表单调整的地方分解如下:1. 两步
- 1. go的依赖管理发展GOPATH 所有的依赖都放置在同一路径下,可以复用下载的依赖,但是当不同项目需要依赖不同版本的依赖时,就很容易出现
- pip search报错在用pip查包名时搜到的都是:pip search xxx。但这样是报错的:查找发现pip search由于一些bu
- 登录SYS创建临时表空间/*创建临时表空间 */create temporary tablespace 表空间名 t
- 做一个将本地图片上传到mysql数据库的小实例,顺便也下载下来到桌面检测是否上传成功。在写代码之前得先在数据库中建立image表,用来存储图
- Vision Transformer(VIT)Vision Transformer(ViT)是一种新兴的图像分类模型,它使用了类似于自然语言
- 在上篇文章给大家介绍了:MySQL8.0.20安装教程及其安装问题详细教程 https://www.jb51.net/artic
- /*ajax提交的延时等待效果*/var AjaxLoding = new Object();//wraperid : 显示loding图片
- 在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异主要体现在以下几个方面:1.pyth
- 单分支结构:if 语句Python 中 if 语句的语法格式如下:if <条件>:    
- 模态框(Modal Dialogue Box)也可叫做模态对话框,或者对话框,当一个模态框被打开时,用户可以与该对话框进行交互,
- 前端技术层(图片有点偏激,仅供参考)Javascript和DOM关系很暧昧,弄不明白!CSS和HTML
- 本文通过问答的开式来解答在mysql在命名用过程中所遇到的常见问题。谁能连接,从那儿连接?你可以允许一个用户从特定的或一系列主机连接。有一个
- 前言上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSock
- 1、demo第一个代码是多线程的简单使用,编写了线程如何执行函数和类。import threadingimport timeclass Cl
- 有时候,我们需要将TensorFlow的模型导出为单个文件(同时包含模型架构定义与权重),方便在其他地方使用(如在c++中部署网络)。利用t
- 主要介绍常用的MySQL命令,包括连接数据库,修改密码,管理用户,操作数据库,操作数据表,数据库备份等,每个命令都配有实例说明,让大家更容易
- 引言:在机器学习还有深度学习中,经常会用到这几个函数,为了便于以后熟练使用,现在对这几个函数进行总结。(一)np.random.rand()
- 字符串字符串常用操作拼接字符串拼接字符串需要使用‘+’运算符可完成对多个字符串的拼接。如str =