【发布时间】:2009-08-13 17:05:28
【问题描述】:
我正在开发以 JSP 形式编写的登录页面。它非常简单,但在 IE8 和 Firefox 中表现不同(那里很令人惊讶)。我还没有测试过这是其他浏览器。
我可能会使用一些 Javascript 进行修复,但我一直在寻找有关该行为的更多信息,然后才实施一种解决方法,希望能够更清晰地修复并避免将来出现此问题。
有问题的服务器端生成的 HTML sn-p 是这样的:
<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 的静态副本。 (如果是最后一个,我可以推荐一个好的网站或服务来做这件事,因为实际的网站仍处于开发阶段,还不能在网络上使用。)谢谢!
编辑:将 onclick 属性更改为 onfocus 解决了这个问题,但又带来了另一个问题(请参阅我的评论 @David)。这可能与 checkKeyPress 的编写方式有关吗?这是我从网站其他地方借来的功能。特别是我想知道更改其返回语句是否可以解决问题。也许它根本不应该返回真/假/任何东西?
编辑 2: 我完全删除了 checkKeyPress 方法以查看是否是导致问题的原因,但它没有任何改变。
完整来源是here。焦点随机跳转到的 div 是两个“全局导航”cmets 之间的一个,位于身体的最顶部。仍然不知道为什么会这样。为了查看焦点是否以某种方式刚刚被重置,我在焦点随机跳转到的那个 div 上方添加了另一个 div,期望焦点开始跳转到新的 div。它没有。它仍然将焦点切换到其中包含图像的 div。我完全被迷惑了。
【问题讨论】:
标签: html jsp servlets internet-explorer-8 focus