首先谈问题:
需求很简单,一个很简单的登陆页面,两个INPUT输入框(有户名,密码),都有各自的提示背景,onFocus的时候提示背景隐藏,onBlur的时候,如果INPUT的value为空则重新显示提示背景。HTML: <form action="" method=""> <!--用户名--> <input type="text" name="username" id="username" onFocus="toggleBg(this,'in');" onBlur="toggleBg(this,'out')"> <!--密码--> <input type="password" name="pwd" id="password" onFocus="toggleBg(this,'in');" onBlur="toggleBg(this,'out')" oninput="alert(this.value);" onpropertychange="alert(this.value)"> </form> CSS: #username,#password{background-image:url(images/input_bg);} #username{background-position:0px 0px;} #password{background-position:0px -80px;} JS: function toggleBg(){ …………//省略,需求上已经说出 }
问题:我们都知道在我们提交表单后浏览器都会有一个提示“是否保存密码”,当点击确认保存后,下次同样的登陆表单,双击username INPUT会显示出输入历史.
选中我们保存的用户名后,密码输入框会自动填充为已保存的密码。于是乎就出现了这种情况:pwd INPUT并没有触发onFocus事件,所以背景图片并没有隐藏,于是密码和背景重叠出现了。。。
问题解决历程:
2.不要password INPUT,密码输入框也用text INPUT(,,小心被别人瞧见了,隐私泄露咯,,当然可以setTimeout替换密码输入框的value为*来解决,注:INPUT的type属性是静态属性,js是无法控制更改此属性的,所以别想着onFocus的时候改变type为password)。话说,使用Period One中的方法就可以解决这个问题了。
但:
<input type="text" name="username" id="username" onFocus="toggleBg(this,'in');" onBlur="toggleBg(this,'out')" oninput="checkBg();" onpropertychange="checkBg()"><!--用户名-->即:给username INPUT添加两个触发事件onpropertychange 和oninput。checkBg()函数自然是检查password INPUT背景情况咯,隐藏其背景图片,(注:不能绑定在password INPUT上,经测试点击username INPUT下拉显示的输入过的账户让密码自动填充时,password INPUT的事件onpropertychange 和oninput并没有被触发。应该是获取焦点的input才会触发如上两个事件。)
(2)onpropertychange事件:当input设置为disable=true后,onpropertychange不会触发。
【参考】: