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

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

var clickedDiv = false; $('input').blur(function() { if (clickedDiv) { $('input').focus(); } }); $('div').mousedown(function() { clickedDiv = true; }) .mouseup(function() { clickedDiv = false }); 

注意: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对象。

这是对您的确切代码的直接(powershell)更改。 但是,如果我理解您正在尝试正确执行的操作, 则在输入处于焦点时单击特定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方法只调用事件focus事件关联处理程序

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

我通过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; 

希望你觉得它有用