angular - 如何识别来自Event()rxjs的按键
问题描述
我使用来自 rxjs 的 fromEvent() 来收听用于搜索列表的输入框。当用户按下该键时,我想跳过键“TAB”。如何修改下面的代码,使我们从按下的键中跳过 TAB 键?然后搜索按下的其他键。
const keyup6$ = fromEvent(searchBox6, 'keyup')
keyup6$.pipe(
map((i: any) => i.currentTarget.value),
debounceTime(1000))
.subscribe(x => {
this.countryId = x;
console.log(this.countryId);
this.fetchCustomersCount();
this.searchCustomer();
});
解决方案
我假设您的意思是要阻止导航到 tab 键上的文本框。看来您只能在 keydown 事件上抓住 Tab 键按下。
该示例显示了将 keydown 和 keyup 事件合并到一个流中。keydown 将过滤 Tab 按键并阻止默认行为。请注意,这可能是一个可访问性问题。
过滤掉keydown后,它会收到Tab的keyup,我也过滤掉了keyup事件。
const searchBox6 = document.getElementById('searchBox6');
const keydown6$ = rxjs.fromEvent(searchBox6, 'keydown');
const keyup6$ = rxjs.fromEvent(searchBox6, 'keyup');
const {
map,
debounceTime,
tap,
filter,
ignoreElements
} = rxjs.operators;
rxjs.merge(
keydown6$.pipe(
// Only take tab keys Can also use event.keyCode, which says it is deprecated, but your
// code is using const, so I think you would be okay using KeyboardEvent.key...
filter(event => event.key === 'Tab'),
// Prevent the default event
tap(event => event.preventDefault()),
// Don't care about doing anything with keydown from here
ignoreElements()
),
keyup6$.pipe(
// Tab keys are now emitting keyup because the keydown behavior was prevented
filter(event => event.key !== 'Tab')
)
).pipe(
// Your code...
rxjs.operators.map((i) => i.currentTarget.value),
debounceTime(1000))
.subscribe(x => {
console.log(x);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.0/rxjs.umd.js"></script>
<input id="searchBox6">
推荐阅读
- javascript - 奇怪的是,window.document 没有返回理想情况下应该返回的正确对象。为什么?
- touchscreen - 我可以将此触摸屏与我的 ESP32 控制器一起使用吗?
- amp-html - amp-consent 和 IAB 同意字符串实施详细信息
- swift - 使用哪种颜色可以快速反转暗模式
- android - 用户杀死应用程序后发出网络请求
- c++ - while 这个while循环在满足条件时没有终止
- php - exec 或 shell_exec 或超时 windows server 2016
- unpivot - 如何在 Google Dataprep / Trifacta 中取消旋转未知数量的列?
- ruby - 基于关联记录列值的Rails连接查询
- c - 如何操作 char 指针内容?