Javascript事件处理程序在主体上,但不在输入上
Javascript event handler on body but not on input
我有以下事件处理程序
document.addEventListener('keydown', handleBodyKeyDown, false);
如何防止它在输入框内发生
在您的handleBodyKeyDown
函数中,检查是否
event.target.tagName.toUpperCase() == 'INPUT'
(或'TEXTAREA'
).
注意:对于旧版本的IE,使用event.srcElement.tagName
一样:
document.addEventListener('keydown', handleBodyKeyDown, false);
function handleBodyKeyDown(event)
{
var e = event || window.event,
target = e.target || e.srcElement;
if (target.tagName.toUpperCase() == 'INPUT') return;
// Now continue with your function
}
注:如果页面上有jQuery,为什么要使用addEventListener
?在jQuery中,所有这些都为您整理好了:
$(document).on('keydown', ':not(input)', function(e)
{
// Your code goes here...
});
在handleBodyKeyDown
方法中,检查事件是否起源于input
元素:
function handleBodyKeyDown(event) {
if (event.target.tagName.toUpperCase() === 'INPUT') {
return; // do nothing
}
// do the rest of your code
}
注意toUpperCase
调用是必要的,因为决定tagName
属性的情况的条件非常复杂,有时几乎是不可控的。
参见event.target
。
如果您正在使用jQuery
,您可以尝试使用is()
方法来测试目标元素是input
,然后什么都不做。
function handleBodyKeyDown(event) {
if ($(event.target).is("input")) {
return;
}
else{
//Do your stuff here
}
}
这对我有用:
const fromInput = event => event.srcElement instanceof HTMLInputElement;
function handleBodyKeyDown(event) {
if(fromInput(event))
return;
// do your magic here
}
你可以这样做:
handleBodyKeyDown = function(e) {
var e = e || window.event
if (e.target.tagName != "INPUT") {
// handle this since it isn't input
}
}
有时候(对我来说)最好不要阻止它的发生,而是在事件情况下忽略它,当它在输入中发生时。看来这也是你的情况。
只要检查evt.target || evt.srcElement
属性(现代框架为你做这个规范化工作,所以,很可能这将被称为目标),无论它是否是输入。
QuirksMode告诉您如何获得事件的目标。你可以检查它是不是一个输入:
function doSomething(e) {
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
if( targ.tagName != "INPUT" ) {
//Perform your action here
}
}
你的问题被标记为jQuery,在这种情况下,你可以只测试事件。目标为框架为您规范化。
$(document).bind("keydown", function (event) {
if(event.target.tagName != "INPUT") {
//Do something
}
});
HandleBodyKeyDown函数将在任何情况下被调用。如您所示,您无法阻止它对记录方法的调用。您只能添加一个逻辑来检查这是否为"输入"和返回。另外(如果需要的话)你可以防止它冒泡:
function handleBodyKeyDown(ev) {
ev=ev||event;
var sender=ev.target||ev.srcElement;
if(sender.tagName.toLowerCase()==="input") {
if(ev.stopPropagation)ev.stopPropagation();
else ev.cancelBubble=true; // for IE8 or less
return true; // do not prevent event from default action
}
// your code for global keydown
}
如果你正在使用Prototype(你已经标记了,但你也有两个其他框架标记),那么事件可以注册和过滤在一个像这样:
document.on('keydown', ':not(input)', handleBodyKeyDown);
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 可以't让我的if语句处理js中的html表单输入
- 名称输入的索引
- 如何编写HTML输入的JS内联
- 要求输入在数据列表中
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- 如何将输入(type=text)从html表单传递到javascript函数
- 单击jquery清除输入值
- 而循环只设置php中输入字段中的第一个值
- 在输入字段中将最小金额设置为
- jQuery自定义验证比较多个输入的序列
- Sails.js:同时发布文本输入和一个文件
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- 主体单击删除功能上的输入框宽度
- 使用生成器等待输入,然后再继续 forEach 循环的主体
- 当输入聚焦时,在主体上添加点击事件,然后在模糊时将其移除
- Angular Bootstrap提前输入-追加到主体-卡住
- Javascript事件处理程序在主体上,但不在输入上
- 附加输入范围到主体和控制视频播放速率javascript