如何重新获得IE中ajax下拉元素的焦点?

时间:2011-09-14 10:16:55

标签: javascript ajax focus

我有一个下拉元素,它被渲染为通常的HTML元素。下拉元素在每次更改时使用ajax提交自己。问题是我需要为页面实现特定的Tab键顺序。为了防止在ajax调用回来时失去信息的挫败感,我添加了一个屏幕禁用器,它阻止任何用户交互,直到ajax调用返回。值得注意的是,下一个标签顺序元素有时会被禁用,具体取决于下拉列表的值。

现在,一切都在Firefox和Chrome上工作正常,因为当用户离开该字段时会触发'change'事件:他按下tab,屏幕disabler弹出并要求稍等一下,ajax完成后我的javascript处理正确的下一个元素的Tab键顺序。

然而,IE8 / 7有自己的问题。在IE'更改'事件中,下拉菜单的方式与Firefox / Chrome不同。它会在每次更改值时触发。因此,在屏幕禁用器淡出后,我需要再次聚焦到同一个下拉菜单,因为用户可能使用了向上或向下箭头键来更改值,他可能愿意上下移动下拉菜单菜单了。

当Ajax回调回来时,我尝试使用Primefaces和jQuery的功能来运行某些javascript。但是,它没有奏效。有时下拉有所集中,但事后直接失去焦点。我尝试使用javascript的超时,但是,下拉元素以某种方式获得了“未完全”焦点:按下“Tab”键跳转到页面顶部并按下向上或向下箭头键用于跳出下拉列表而不是改变它的价值。

我的最终解决方案(遗憾的是,仍然不能接受)如下(id是'select'元素的id):

if (jQuery.browser.msie || jQuery.browser.opera) {
    interval = setInterval(function (){
       if (document.activeElement.id != id) {
           document.getElementById(id).focus();
        } else {
            clearInterval(interval);
    }
    }, 500); 
}

这将获得“完整”焦点,TAB和UP / DOWN箭头键的行为与预期一致。但是,在速度稍慢的计算机上使用向上/向下键来更改值排队的间隔太多,有时网站变得不可用。焦点只是一直跳回到下拉状态,用户必须等待10秒或更长时间才能清除间隔。

所以,我想问一个更好的解决方案来解决这个问题。

1 个答案:

答案 0 :(得分:1)

我认为你应该使用onblur下拉事件代替onchange,如果我理解正确的话,这将是正确的解决方案。