谷歌浏览器中Javascript onFocus事件持续触发-这是一个bug吗?

3
我写了一个小的JavaScript函数,当 form 输入文本字段触发 onFocus 时,检查 cookie 是否存在。

如果找到 cookie,则会弹出对话框,欢迎用户回到网站。

但是在 Chrome 中,每次关闭对话框后都会弹出新的对话框。我想这是因为文本字段仍然处于“已聚焦”状态。

但是在 Firefox 或 IE9 中,不会出现此问题。

我通过添加我目前已经注释的代码行来解决 Chrome 中的问题。但是我想知道这种行为是否被认为是错误还是正常行为,如果这是正常行为,那么其他浏览器为什么表现得不同呢?

以下是 JavaScript 代码示例:

//var checked = 0;
var checkIt = getCookie('cia_db');
function checkCookie() {

//  if(checked == 0) {

        if(checkIt == 'logged_in') {
            alert('Welcome back to CIA headquarters.');
            //return true;
        }
    //}
        //checked++;
}

以下是 HTML 代码:

<form id="form1" name="form1" action="" method="get">
<input type="text" name="username" id="username" value="smeegle" size="15" onfocus="checkCookie();">

etc...


我认为这是一个错误,因为onfocus应该在元素获得焦点时触发。它并没有说“只要元素保持焦点”。与onfocus相反的是onblur,它被定义为“当元素失去焦点时触发”,而且onblur只会触发一次。 - Ayush
我觉得这也是一个bug。在Chrome 17中没有修复。也许你应该提交一个bug报告。http://jsfiddle.net/x2Zvz/ - mrtsherman
@mrtsherman 我不会称这为一个 bug。尝试使用 console.log 而不是 alert,它将完美地工作,因为当警报被“确认”后,Chrome 将焦点返回到 input 元素,触发 onfocus 事件处理程序进入无限循环。 - Some Guy
你真的要这样做吗?显示一个警报,上面写着“欢迎回到中央情报局总部。”这是个坏主意,除非你想让用户对网站感到恼火。 - Ruan Mendes
嗯,是的,我正在显示它,此时用户将被重定向到cia.gov。我认为Amaan和Dr Molle可能是正确的,但事实仍然是只有Chrome有这种行为。为什么Firefox和IE9没有将焦点返回到输入字段并创建无限循环呢? - Buttle Butkus
1个回答

5
这个字段在alert弹出时将失去focus(),chrome在alert关闭后会将焦点返回到输入框,所以onfocus会再次触发。
其他浏览器可能在关闭警告后将焦点给予窗口,因此onfocus不会再次触发。
我不认为这是bug,而是一种不同的行为。
解决方案:
在alert()之前移除焦点。

1
你已经正确地解决了问题,但更好的解决方案是在处理onfocus事件时不显示警报。以一种不那么侵入式的方式显示你的消息。移除焦点会改变用户原本想要做的事情。 - Ruan Mendes
如果您从带有accesskey和onfocus属性的按钮或处理程序中调用,焦点行为可能会成为一个问题。Google Chrome开发人员应该考虑验证调用者是否没有定义一个带有onfocus的访问密钥,因为这很容易导致javascript对话框(alert/confirm/prompt)之间产生循环。正如Juan Mendes所提到的,避免使用javascript对话框可以帮助解决问题,但是这种行为会干扰与触发时直接关联的onfocus事件的accesskey功能。 - Arachnid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接