Я очень ценю ответ Р. Райта, но задержка в 200 мс, которая добавлялась к размытию выпадающего меню, не соответствовала стандартам UX.Поэтому я немного углубился в javascript blur и обнаружил, что у него есть атрибут relatedTarget
, который можно использовать, чтобы увидеть, на каком элементе был сделан клик.
Обратите внимание, что это каким-то образом работает только с элементами DOM с атрибутом tabindex
, поэтому мне также пришлось изменить обработчик результатов Semantic Search , чтобы каждый результат имел атрибут tabindex=0
.Кроме того, можно переопределить фокусный CSS по умолчанию, который применяется к элементам с tabindex
.
Используя это, я отредактировал handleBlur
, чтобы установить open: true
, если _.contains(event.relatedTarget.classList, 'title')
.
Вот мой соответствующий код:
constructor(props) {
super(props);
this.handleResultSelect = this.handleResultSelect.bind(this);
this.handleFocusSearch = this.handleFocusSearch.bind(this);
this.handleBlurSearch = this.handleBlurSearch.bind(this);
this.state = ({
results: [{
"title": "Roob, Cummerata and Watsica"
},
{
"title": "Stanton, Kessler and Walsh"
},
{
"title": "Boyle, Schuppe and Renner"
}],
value: '',
open: false,
});
}
handleBlurSearch (event) {
let open = _.contains(event.relatedTarget.classList, 'title');
this.setState({
open: open,
focused: false,
});
}
handleFocusSearch () {
this.setState({
open: true,
focused: true,
});
}
handleResultSelect(e, {result}) {
this.setState({ value: result.title, open: false });
}
render() {
var searchProps = {
input: <input className='custom-form-field' placeholder={this.props.placeholder}/>,
open: this.state.open,
onFocus: this.handleFocusSearch,
onBlur: this.handleBlurSearch,
results: this.state.results,
onResultSelect: this.handleResultSelect,
};
return (
<SemanticUI.Search {...searchProps} />
);
}