2016-03-03 2 views
3

Мне нужно ввести элементы #Core и #Price , которые не могут совместно использовать родительский элемент. Мне нужно проверить, что оба они не находятся в фокусе, и когда у них нет функции.Убедитесь, что два элемента не находятся в фокусе

Я думал, что я мог бы просто сделать проверку, чтобы убедиться, когда один размывает другой не дано внимание, как так:

$('#Core').blur(function() { 
    if(!$("#Price").is(":focus")) { 
     getSellingPrice() 
    } 
});$('#Price').blur(function() { 
    if(!$("#Core").is(":focus")) { 
     getSellingPrice() 
    } 
}); 

Но это, кажется, срабатывает даже когда я даю фокус на другой входной узел , Я предполагаю, что когда размытие происходит, он проверяет секундную фокусировку до того, как ее еще не выбрали. Но я не уверен, как изменить код, чтобы получить желаемое поведение, чтобы убедиться, что оба элемента не находятся в фокусе, прежде чем запускать вызов функции.

Любые идеи о том, как я могу выполнить это или понять, почему этот текущий код не работает, очень ценятся.

+2

Как мог два элемента быть в центре внимания, в то же время? Я что-то пропустил от вашего вопроса? –

+0

Их не могло быть. Идея состоит в том, что один элемент находится в фокусе, и когда он теряет фокус, я хочу проверить, что другой элемент не набрал фокус перед выполнением getSellingPrice(). – user2725919

+0

К сожалению, вы не можете последовательно проверять, какой элемент был перемещен, чтобы надежно отображаться в браузерах. Не только возникают проблемы с получением информации о событиях последовательно, есть также проблемы при табуляции, если вы делаете все это одним движением. Существует свойство, которое делает это: explicitOriginalTarget, но оно доступно только в Firefox, и я считаю, что теперь IE. Следовательно, необходим тайм-аут в соответствии с решением @ adeneo. Я предлагаю вам принять его ответ, это самый надежный способ его достижения в настоящее время. –

ответ

2

Вы не можете просто проверить, что активный элемент не является ни

var elems = $('#Core, #Price').blur(function() { 
    setTimeout(function() { 
     if (elems.toArray().indexOf(document.activeElement) === -1) { 
      getSellingPrice(); 
     } 
    }); 
}); 

Но вам нужен тайм-аут, чтобы убедиться, что фокус установлен и т.д.

+0

Это надежный ответ, и я считаю, что это единственный способ надежно достичь этого, +1. –

0

Размытие элемента проходит фокус на элемент тела перед тем как перенести его на дополнительный элемент. Ужасный, как может быть таймер с одним выстрелом, может использоваться для размытия размытия с проверкой того, какой элемент был нажат. Концепции код инициируется размытость событий (перевести ваши стандарты кодирования, JQuery и применения в случае необходимости):

function blurred(el) 
{ 
    setTimeout(checkFocus, 4); // (4 == Firefox default minimum) 
} 
function checkFocus() 
{ var a = document.getElementById("a"); 
    var b = document.getElementById("b"); 
    var infocus = document.activeElement === a || document.activeElement === b; 

    if(infocus) 
     console.log("One of them is in focus"); 
    else 
     console.log(" Neither is in focus"); 
} 

HTML

a: <input id="a" type="text" onblur="blurred(this)"><br> 
b: <input id="b" type="text" onblur="blurred(this)"> 
Смежные вопросы