IE8 / Firefox行为差异

时间:2009-08-13 17:05:28

标签: html jsp servlets internet-explorer-8 focus

我正在编写作为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中,Tab键到密码字段会将光标移动到密码框的最开头,保留默认值(PASSWORD),而不是清除它。

有关为何发生这种情况的任何想法?这是IE8的一个已知错误或固有缺陷,我将不得不破解,或者我可以在某处添加一些代码以更正确地处理IE8?

如果我的描述中的问题不明确,我可以尝试阐明或只是抛出屏幕截图/视频片段,或者在某处上传HTML的静态副本。 (如果是最后一个,我可以使用一个好的网站或服务的推荐来实现这一点,因为实际的网站仍然在开发中,但尚未提供给网络。)谢谢!

编辑:将onclick属性更改为onfocus修复了该问题,但又引发了另一个问题(请参阅我的评论@David)。这可能与checkKeyPress的编写方式有关吗?这是我从网站其他地方借来的功能。特别是我想知道是否更改其返回语句可能是修复。也许它根本不应该返回真/假/任何东西?

编辑2:我完全删除了checkKeyPress方法以查看是否导致问题,并且它什么都没改变。

完整的来源是here。随机跳转的div是两个“全局导航”注释之间的一个,在身体的最顶端。仍然不知道为什么会这样。为了看看焦点是否以某种方式重置,我在焦点随机跳跃的那个上方添加了另一个div,期望焦点开始跳转到新的div。它没有。它仍然将焦点切换到带有图像的div。我完全被哄骗了。

2 个答案:

答案 0 :(得分:2)

如果您将支票放入onfocus而不是onclick怎么办?从技术上来说,切换到某个字段并不是一次点击。

答案 1 :(得分:1)

由于丢失的焦点似乎每6000毫秒发生一次,我将责任归咎于/js/qm_scripts.js中的expandone()/ contractall()。

您的登录表单位于“dropmsg0”div中,导致其短暂隐藏并每6秒重新显示一次。隐藏时,文本框在IE8中失去焦点。我要么重命名div来排除if to ticker,要么修改ticker脚本以便在只有一个dropmsg div时不运行。