当您单击特定div时,我使用jquery将焦点保持在文本框上。它在Internet Explorer中运行良好,但在Firefox中运行良好。有什么建议吗?
var clickedDiv = false;
$('input').blur(function() { if (clickedDiv) { $('input').focus(); } });
$('div').mousedown(function() { clickedDiv = true; })
.mouseup(function() { clickedDiv = false });
答案 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;
希望你觉得它很有用