当用户点击不在Firefox中工作的特定div时,防止模糊

时间:2009-07-08 12:58:46

标签: javascript jquery firefox focus

当您单击特定div时,我使用jquery将焦点保持在文本框上。它在Internet Explorer中运行良好,但在Firefox中运行良好。有什么建议吗?

var clickedDiv = false;

$('input').blur(function() { if (clickedDiv) { $('input').focus(); } });

$('div').mousedown(function() { clickedDiv = true; })
        .mouseup(function() { clickedDiv = false });

2 个答案:

答案 0 :(得分:4)

要注意的是:jquery对象上的focus()方法实际上并不关注它:它只是调用焦点处理程序的情况!要实际关注项目,你应该这样做:

var clickedDiv = false;
$('input').blur( function() {
    if(clickeddiv)  {
        $('input').each(function(){this[0].focus()});
    }
}
$('div').mousedown(function() { clickedDiv = true; })
        .mouseup(function() { clickedDiv = false });

请注意,我在本机DOM对象上使用了focus()方法,而不是jquery对象。

这是对您的确切代码的直接(暴力)更改。但是,如果我理解您正在尝试正确执行的操作,则在输入焦点时单击特定div 时,您将尝试聚焦输入框。

以下是我对你如何做的看法:

var inFocus = false;
$('#myinput').focus(function() { inFocus = true; })
             .blur(function() { inFocus = false; });
$('#mydiv').mousedown(function() {
    if( inFocus )
        setTimeout( function(){ $('#myinput')[0].focus(); }, 100 );
}

注意:我已经暂停了对有问题的输入进行聚焦,因此输入实际上可能会在同一时间失去焦点。否则我们会在它即将失去它之前给予关注。至于100毫秒的决定,这真的是一个侥幸。

干杯,

JRH


编辑以回应@Jim的评论

第一种方法可能不起作用,因为这是错误的方法。

关于第二个问题,我们应该在本机DOM对象上使用.focus()而不是在它周围的jQuery包装器上,因为本机.focus()方法使对象实际抓住焦点,而jquery方法只调用与<{1}}事件关联的事件处理程序

因此,当jquery方法调用焦点事件处理程序时,本机方法实际上授予焦点,因此导致调用处理程序。这个方法的名称重叠是不幸的命名法。

答案 1 :(得分:1)

我通过document.onclick简单地替换模糊事件来解决它,如果没有输入或div,则检查点击的元素

var $con = null; //the input object
var $inp = null; // the div object

function bodyClick(eleId){
    if (eleId == null || ($inp!= null && $con != null && eleId != $inp.attr('id') &&   
            eleId != $con.attr('id'))){
        $con.hide();
    }
}
function hideCon() { 
    if(clickedDiv){
         $con.hide();
    }

}
function getEl(){
var ev = arguments[0] || window.event,
origEl = ev.target || ev.srcElement;
eleId = origEl.id;
bodyClick(eleId);
}
document.onclick = getEl;

希望你觉得它很有用