2016-02-19 3 views
4

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

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
    <script type="text/javascript"> 
document.addEventListener('mousedown', function (e) { 
    console.log('mousedown', e); 
    if (e.target.getAttribute('id') === 'target' && !e.__redispatched) { 
     console.log('cancelling'); 
     e.preventDefault(); 
     e.stopPropagation(); 
     e.stopImmediatePropagation(); 
     setTimeout(function() { 
      var re = new MouseEvent('mousedown', { 
       bubbles: true, 
       cancelable: true, 
       view: window, 
       screenX: e.screenX, 
       screenY: e.screenY, 
       clientX: e.clientX, 
       clientY: e.clientY, 
       ctrlKey: e.ctrlKey, 
       shiftKey: e.shiftKey, 
       altKey: e.altKey, 
       button: e.button, 
       buttons: e.buttons, 
       relatedTarget: e.relatedTarget, 
       region: e.region 
      }); 
      re.__redispatched = true; 
      document.getElementById('target').dispatchEvent(re); 
     }, 100); 
    } 

}) 
    </script> 
    <input id="target" type="text"/> 
</body> 
</html> 

Console показывает, что событие должным образом повторно отправлено, потому что он захвачен target элемента, но фокус не получил к этому элементу.

Когда я пытаюсь, не вмешиваясь в события, фокус получается прямо перед mousedown Событие обрабатывается.

Возможно ли обработать это поведение только путем повторной отправки события mousedown или мне нужно вручную обработать focus? Или я делаю что-то не так с событием?

Спасибо.

ответ

3

focus запускается после получения события mousedown. Однако браузер не запускает обработчики по умолчанию для untrusted events, например MouseEvent, с использованием dispatchEvent.

Вы должны ввести focus ввод вручную.