我正在使用JSP编写登录页面。它非常简单,但是在IE8和Firefox中的行为却有所不同(令人惊讶的是)。我尚未测试这是其他浏览器。
我可能可以使用一些Javascript进行修复,但是在我寻求解决方法之前,我一直在寻找有关该行为的更多信息,以期获得更清洁的修复程序并避免将来出现此问题。
服务器端生成的HTML代码段是这样的:
<form name="member_session_info" method="post" autocomplete="off" action="/membersession" onsubmit="return validate_form()" > <input type="hidden" id="memberSessionAction" name="memberSessionAction" value="" /> <input type="hidden" name="homePage" value="/2009/aas/aas_home.jsp" /> <input type="hidden" name="memberLandingPage" value="/2009/aas/aas_member_landing.jsp" /> <input type="hidden" name="memberProfilePage" value="/2009/aas/aas_member_profile.jsp" /> <input type="hidden" name="passwordRecoveryPage" value="/2009/aas/aas_password_recovery.jsp" /> <input id="uname" class="text xsmall right" name="username" value="USERNAME" onclick="checkClickUser()" onKeyPress="checkKeyPress(event, 'login', sendProfile)" style="width: 220px;" type="text"> <input id="pass" class="text xsmall right" name="password" value="PASSWORD" onclick="checkClickPassword()" onKeyPress="checkKeyPress(event, 'login', sendProfile)" style="width: 220px;" type="password"> <a href="javascript:sendProfile('startPasswordRecovery');" class="xsmall">FORGOT PASSWORD</a> </form>
支持它的Javascript是:
<script type="text/javascript" language="JavaScript"> function validatePost(code, doAlert) { postValid = true; return postValid; } function sendProfile(action) { document.getElementById("memberSessionAction").value = action; document.member_session_info.submit(); return false; } function initializePage() { } function validate_form() { return false; } function checkClickUser() { var username; username = document.getElementById("uname").value; if (username == "USERNAME") { // Clear the field since it's the first time document.getElementById("uname").value = ""; } return true; } function checkClickPassword() { var username; username = document.getElementById("pass").value; if (username == "PASSWORD") { // Clear the field since it's the first time document.getElementById("pass").value = ""; } return true; } function checkKeyPress(event, object, func) { var keycode; if (window.event) keycode = window.event.keyCode; else if (event) keycode = (event.which) ? event.which : event.keyCode; else return true; if ((keycode == 13)) // check for return { func(object); return true; } return true; } </script>
基本症状是:如果使用选项卡从表单的用户名字段导航到密码字段,则密码将正确突出显示并在FF中被清除,而在IE8中则不会被清除。在IE8中,跳至密码字段会将光标移到密码框的最开始,将默认值(PASSWORD)保留在原位,而不是将其清除。
知道为什么会这样吗?这是我只需要破解的IE8的已知错误或固有缺陷,还是可以在某个地方添加一些代码以更正确地处理IE8?
如果根据我的描述仍无法解决问题,我可以尝试阐明问题,或者只是抛出屏幕截图/视频剪辑,或者将HTML的静态副本上传到某个地方。(如果是最后一个,我可以推荐一个好的网站或服务来进行此操作,因为实际的网站仍在开发中,尚不支持Web。)谢谢!
编辑: 将onclick属性更改为onfocus可解决该问题,但又暴露了一个问题(请参阅我的评论@David)。这可能与checkKeyPress的编写方式有关吗?这是我从网站其他地方借来的功能。特别是我想知道是否可以更改其return语句。也许它根本不应该返回true / false /什么?
编辑2: 我完全删除了checkKeyPress方法以查看是否是引起问题的原因,并且它什么也没有改变。
完整的源代码在这里。焦点随机跳转到的div位于正文顶部的两个“全局导航”注释之间。仍然不知道为什么会这样。为了查看焦点是否以某种方式被重置,我在焦点正在随机跳转到的区域上方添加了另一个div,希望焦点会开始跳转到新的div。没有。仍然将焦点切换到其中包含图像的div。我完全被困扰了。
由于丢失的焦点似乎每6000毫秒发生一次,因此我将责任归咎于/js/qm_scripts.js中的expandone()/ contractall()。
您的登录表单位于“ dropmsg0” div中,导致其每6秒短暂隐藏一次并重新显示。隐藏时,这些文本框在IE8中失去焦点。我将重命名div以便排除在代码之外,或者将代码脚本修改为在只有一个dropmsg div时不运行。