停止在另一个事件侦听器中传播特定事件
Stop propagation of a specific event inside another event listener
我有一个侦听器附加到 window
对象上的调整大小事件。在我的代码的更深处,我有一些 input
字段。
为了避免在 android 设备上出现一些问题,我想 防止调整大小侦听器被触发 当输入字段被聚焦时(android打开键盘时设备调整浏览器大小 window,与 IOS) 不同。
main.js
window.addEventListener(‘resize’, () => {
// Some stuff here
});
someFile.js
field.addEventListener(‘input’, () => {
// Here I want to disable the resize event only once
});
我遇到了以下解决方案,到目前为止没有任何成功:
removeEventListener()
根本不适合,因为我需要指定对侦听器函数的引用。不仅要把监听器一个一个去掉,还要全部列出来,然后重新绑定。
event.stopPropagation()
someFile.js
field.addEventListener(‘focusin’, () => {
window.addEventListener(‘resize’, event => {
event.stopPropagation();
// also tried event.stopImmediatePropagation()
});
});
但是由于侦听器是按声明顺序调用的,所以它不会阻止任何事情(最后声明)。另外,我必须在 focusout
.
上重新绑定所有内容
我想要的
我知道一些使用全局变量的技巧可以达到我想要的效果,但它们有点难看,更不用说我尽量尽量避免使用全局变量.
有什么优雅的方法可以在所有调整大小的侦听器上调用一个早期的stopPropagation()
函数,并防止它们从代码内部的深层函数触发?
或者是否有更好的体系结构,例如可以在页面上的任何输入元素获得焦点时触发的全局函数,并且无论焦点元素如何都阻止调整大小事件?
我会无条件地添加一个 resize
侦听器,并在其中检查 document.activeElement
是否是以下字段之一:
window.addEventListener(
'resize',
(e) => {
if (document.activeElement && document.activeElement.matches('input')) {
console.log('propagation stopped');
e.stopPropagation();
} else {
console.log('propagation not stopped');
}
},
true // enable useCapture here with this third argument
// to stop propagation as early as possible
);
<input>
更改传递给 matches
的选择器字符串以满足您的需要。上面的代码片段使用 input
,它将匹配任何输入字段。如果您只想在焦点输入的 class 为 foo
时停止传播,您可以使用
.matches('input.foo')
要匹配多个选择器,用逗号分隔,例如
.matches('input, textarea')
将同时匹配输入和文本区域。
另请记住,Javascript 语法需要直引号,而不是 so-called 智能引号,这会导致语法错误。
我有一个侦听器附加到 window
对象上的调整大小事件。在我的代码的更深处,我有一些 input
字段。
为了避免在 android 设备上出现一些问题,我想 防止调整大小侦听器被触发 当输入字段被聚焦时(android打开键盘时设备调整浏览器大小 window,与 IOS) 不同。
main.js
window.addEventListener(‘resize’, () => {
// Some stuff here
});
someFile.js
field.addEventListener(‘input’, () => {
// Here I want to disable the resize event only once
});
我遇到了以下解决方案,到目前为止没有任何成功:
removeEventListener()
根本不适合,因为我需要指定对侦听器函数的引用。不仅要把监听器一个一个去掉,还要全部列出来,然后重新绑定。
event.stopPropagation()
someFile.js
field.addEventListener(‘focusin’, () => {
window.addEventListener(‘resize’, event => {
event.stopPropagation();
// also tried event.stopImmediatePropagation()
});
});
但是由于侦听器是按声明顺序调用的,所以它不会阻止任何事情(最后声明)。另外,我必须在 focusout
.
我想要的
我知道一些使用全局变量的技巧可以达到我想要的效果,但它们有点难看,更不用说我尽量尽量避免使用全局变量.
有什么优雅的方法可以在所有调整大小的侦听器上调用一个早期的stopPropagation()
函数,并防止它们从代码内部的深层函数触发?
或者是否有更好的体系结构,例如可以在页面上的任何输入元素获得焦点时触发的全局函数,并且无论焦点元素如何都阻止调整大小事件?
我会无条件地添加一个 resize
侦听器,并在其中检查 document.activeElement
是否是以下字段之一:
window.addEventListener(
'resize',
(e) => {
if (document.activeElement && document.activeElement.matches('input')) {
console.log('propagation stopped');
e.stopPropagation();
} else {
console.log('propagation not stopped');
}
},
true // enable useCapture here with this third argument
// to stop propagation as early as possible
);
<input>
更改传递给 matches
的选择器字符串以满足您的需要。上面的代码片段使用 input
,它将匹配任何输入字段。如果您只想在焦点输入的 class 为 foo
时停止传播,您可以使用
.matches('input.foo')
要匹配多个选择器,用逗号分隔,例如
.matches('input, textarea')
将同时匹配输入和文本区域。
另请记住,Javascript 语法需要直引号,而不是 so-called 智能引号,这会导致语法错误。