如何模糊自定义元素?

How can I blur out of a custom element?

经过常规输入后,我制作了一个自定义小部件。

<input>

<div class="widget" tabindex="0">
  <input tabindex="-1"/>
</div>

同样,使用 Tab 键 进入 小部件有效:

var widget = document.querySelector('.widget')
var innerInput = widget.querySelector('input')

widget.addEventListener('focus', function(event){
  widget.classList.add('highlighted')
  innerInput.focus()
})

这是一个working JDFiddle

但是从小部件中按 Tab 键返回不起作用。由于内部 input 是焦点,我附加了一个 blur 事件侦听器,它也模糊了小部件。我 认为 这将 select 以前的常规输入。但它什么也没做。

// This doesn't work
innerInput.addEventListener('blur', function(event){
  console.log('blurring!')
  widget.classList.remove('highlighted')
  widget.blur();
})

如何使自定义元素的制表符有效?

正如@dandavis 指出的(Dan,添加您自己的答案!)您可以使用tabindex 删除小部件元素的tabbability,这会将焦点元素移动到前一个元素。

var widget = document.querySelector('.widget')
var innerInput = widget.querySelector('input')

widget.addEventListener('focus', function(event){
  widget.classList.add('highlighted')
  innerInput.focus()
  widget.tabIndex = -1;
})

innerInput.addEventListener('blur', function(event){
  console.log('blurring!')
  widget.classList.remove('highlighted')
  setTimeout(function(){ 
    widget.tabIndex = 0; 
  }, 0);
})

working fiddle