Вопрос:
Довольно просто. У меня есть обработчик события blur(), который запускает функцию, я хочу, чтобы функция не срабатывала, когда размытие запускается щелчком по определенному элементу.
Я попробовал document.activeElement, но я получаю HTMLBodyElement вместо элемента, на который я нажимаю.
код:
$j(«.input_filtrare_camp»).blur( function(event) { nr_img = this.parentNode.id.split(«_»)[1]; //alert(document.activeElement); if(document.activeElement.id.indexOf(«img_exact») < 0) //run only if the id of the element I clicked on doesn’t contain «img_exact» enter_input_filtrare(event.target); });
конечно же, предупреждение предназначено для устранения неполадок.
Я использовал решение techfoobar следующим образом:
var currElem = null; $(document).mousedown(function(e) { currElem = e.target; }); $j(«.input_filtrare_camp»).blur( function(event) { nr_img = this.parentNode.id.split(«_»)[1]; if(currElem.id.indexOf(«img_exact») < 0) //run only if the id of the element I clicked on doesn’t contain «img_exact» enter_input_filtrare(event.target); });
Отметьте ответ PointedEars на важную информацию по этой проблеме.
Лучший ответ:
Проверьте эту скрипту:
Решение устанавливает активный элемент в документе mousedown, который запускается для всех элементов документа, и использует это для определения того, следует ли выполнять код в событии размытия.
CODE
var currElem = null; $(document).mousedown(function(e) { currElem = e.target; }); $(‘#f1’).blur(function() { if(currElem != null && currElem.id != «f3») { $(this).val(‘F1: clicked elem is not f3, blur event worked’); // do your blur stuff here } else { // for demo only, comment this part out $(this).val(‘F1: clicked elem is f3, no blur event’); } }); Ответ №1
Следующий код расскажет вам, куда сосредоточился, для него требуется setTimeout, потому что, как говорили другие, когда размывается, новый элемент может не получить фокус. Однако реальный трюк состоит в том, чтобы знать, что document.activeElement содержит элемент, имеющий фокус. Этот ответ будет работать даже при изменении фокуса по другим причинам, кроме нажатия
http://jsfiddle.net/mendesjuan/crenZ/
HTML
<input id=»inp1″ /> <input id=»inp2″ />
JS См. Обнаружение фонового ввода формы с использованием JavaScript или jQuery
$(‘input’).blur(function(){ // Need a setTimeout // There is no guarantee of where the focus went, but after the // current event is processed, it will be available setTimeout(function(){ // The currently focused element console.log(document.activeElement); }, 0); }) Ответ №2
Использовать event.target – Свойство целевого события выдает элемент, вызвавший событие.
<html> <head> <script type=»text/javascript»> function getEventTrigger(event) { var x=event.target; window.alert(«The id of the triggered element: » + x.id); } </script> </head> <body > <p id=»p1″ onmousedown=»getEventTrigger(event)»> Click on this paragraph. An alert box will show which element triggered the event.</p> </body> </html> Ответ №3
Это невозможно при прослушивании событий blur. Событие blur, вызванное им, происходит, когда элемент теряет фокус. Событие click происходит после того, как элемент получает фокус, после события focus для того же элемента. В результате существует промежуточное состояние, в котором ни один элемент не имеет фокуса:
<!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Strict//EN» «http://www.w3.org/TR/html4/strict.dtd»> <html> <head> <meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″> <title>DOM Test Case: Event Order</title> <script type=»text/javascript»> function debugEvent (event) { /* or window.alert(…); */ console.log(event, «on», event.target || window.event.srcElement); } function body_load () { var elements = document.forms[0].elements; var foo = elements[«foo»]; var bar = elements[«bar»]; foo.onblur = bar.onfocus = bar.onclick = debugEvent; } </script> </head> <body onload=»body_load()»> <h1>DOM Test Case: Event Order</h1> <form action=»»> <div> <input name=»foo»> <input name=»bar»> </div> </form> </body> </html>
Смотрите также: Спецификация событий уровня DOM уровня 2: события HTML
Что вы можете сделать, так это использовать прослушиватель для события, которое происходит перед событием blur. Событие mousedown, предложенное @techfoobar, похоже, является таким событием (в Chromium 18.0.1025.168 (Developer Build 134367 Linux)), но нет стандартного, даже черновика спецификации, чтобы поддержать это вверх. См. Также: Каков приоритет события в JavaScript?
Во всяком случае, это решение является неполным, так как событие blur и событие click могут быть вызваны также нажатием клавиши (комбинации), например. Обработка события keydown должна помочь, но решение все равно будет неполным.
Поэтому, вероятно, ваш подход неверен.
¹ Конечно, если вы ограничиваете себя jQuery и аналогичными библиотеками (которые указывают теги $j()), вы также можете попробовать себя в тестировании в подмножестве браузеров, которые, по их утверждению, поддерживаются. Но вам придется перепроверить это с каждым новым браузером и каждой новой версией браузера и библиотеки.