Javascript 输入触发按键事件两次
这个问题以前曾被问过/回答过(大部分),但我尝试了三种方法来阻止事件冒泡,但都没有效果:Javascript 输入触发按键事件两次,javascript,jquery,dom,jquery-events,Javascript,Jquery,Dom,Jquery Events,这个问题以前曾被问过/回答过(大部分),但我尝试了三种方法来阻止事件冒泡,但都没有效果: return false; e.stopPropagation(); e.preventDefault(); (return false应该处理另外两个,对吗?) 以下是html: <div class="tags-holder"> <input type="text" class="addField" id=&qu
return false;
e.stopPropagation();
e.preventDefault();
(return false应该处理另外两个,对吗?)
以下是html:
<div class="tags-holder">
<input type="text" class="addField" id="addField_<%= visit.id %>" placeholder="add a new tag">
</div>
}))
我把多余的塞子放在那里,但真的不应该返回false,简单地杀死冒泡?(使用铬)
线索?keyCode=13是“Enter”尝试更改
$(field).functionCall()
到
因为字段已经是jQuery对象
现在我们已经确定这不是错误。我在Firefox7和Chrome15中进行了测试,发现if语句中的代码块只在按下enter键时触发一次。尝试检查以确保createTag()函数中的某些内容没有执行两次。当事件冒泡时,您认为捕获事件的方法是什么。我只有一次在这个测试页面被射击
<!DOCTYPE html>
<html>
<head>
<title>Scratch</title>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.setOnLoadCallback(function (){
$('input[type="text"]').keyup(function (){
console.debug('keyup');
});
});
google.load('jquery', '1.6.4');
</script>
</head>
<body>
<div class="something">
<input type="text" />
</div>
</body>
</html>
……还有
<div class="thing">
<input class="thing" type="text" />
</div>
哇。你的帮助很好,帮我想清楚了 但这个解决方案感觉有点像逃避责任;有效,但条件一开始就不应该存在 在这里,我在这里的评论中发现:
$('.plus')。解除绑定('click')。绑定('click',函数(e){
console.log('clicked')
var id=$(this.attr('plus_id');
var field=$('').attr({'placeholder':'addanewtag','id':'addField'+id',visit_id':id});
field.focus();
field.show().keydown(函数(事件){
事件。stopImmediatePropagation();
if(event.keyCode==13 | | event.keyCode==9){
console.log(事件)
ProfilePage.createTag(字段'nada','addField')
field.hide().val(“”);
返回false;
}
})。单击(功能(e){
返回false;
})
;
$(此).append(字段);
返回false;
});
希望这能解决您的问题。
不要使用event.preventDefault()而是使用以下两种方法。
如果是Microsoft浏览器,请使用
event.cancelBubble=true;
对于W3C模型,浏览器使用
event.stopPropagation()
请使用keypress事件来代替Keyup事件,因为在keypress过程中,输入将被发送到输入字段,所以无论您不希望出现什么输入,都会出现在字段上。因此,将触发enter按钮事件
使用event.returnValue=false代替return false。尝试先解除绑定事件,然后绑定它,请参阅下面的代码:
$('.addField').show().unbind('keyup').keyup(function(event){
event.preventDefault();
if(event.keyCode == 13 || event.keyCode==9) {
ProfilePage.createTag( this, 'nada', 'addField')
$(this).hide().val('');
return false;
}
一个解释是,我在我的新博客上写了一篇关于这个的帖子。这个问题总是让我发疯,但我认为这就是解决办法 简单地返回false,如果你返回true,它会随机重复,所以我猜它一定有一个侦听器来监听真实的响应 简短回答 添加返回假
$("#register-form #first_name").keyup(function(event) {
console.log('hello world');
return false;
}))
在最初的问题中,如果你仔细看代码,似乎返回false写得太早了一行。我也有同样的问题,我使用了上述方法,它对我有效
$(document).unbind('keypress').bind('keypress', function (e) {
// some logic here
});
我在使用角度11 EventEmitter时遇到了这个问题。我通过创建事件发射器的新实例解决了这个问题 事件被触发
@Output() keypress = new EventEmitter();
onKeyPress(event) {
this.keypress = new EventEmitter();
this.keypress.emit(event);
}
为什么要执行
$(field).functionCall()
而不是field.functionCall()
?我创建了一个代码的示例,没有发现任何问题-您试图阻止的行为是什么?谢谢。这是可行的;可能是由于DOM(我没有发布整个页面)导致事件冒泡。问题是它触发了createTag()函数两次,这是有问题的:)@mmmshuddup我现在清理了它——谢谢你的输入。当然!是的,我也试过玩JSFIDLE,它对我来说很好!哪些浏览器有问题?坏习惯…jquery忽略了它,但我做了更改,但没有改进。该死。是的,不可否认,不管怎么说,这一次是在黑暗中拍摄的。嗯,让我想一想。@user508708我在topek创建的同一个JSFIDLE中为createTag()创建了一个模拟函数。此警报仅触发一次。。在这一点上,如果不知道DOM中到底有什么以及ProfilePage对象引用了什么,就很难确定。我认为你是对的。该页面是相当动态的,可能无法完整发布。我会开始缩小范围,看看是否能解决这个问题。不过,我很惊讶,我们不能简单地消除冒泡…哦,还有一个线索:我正在用$(document)初始化它。准备好了(function())哦,很奇怪。那么它现在对你有用了吗?如果是的话,那太好了!但是根据你发表的那篇文章,这个问题听起来好像有超过$(document)。准备好了()函数。这是怎么回事?顺便说一句,我读了更多关于它的内容,这似乎是设置keyup事件处理程序的一个特定问题。显然建议使用keypress处理程序。我会检查一下@mmmshuddup,但我认为这个问题非常特定于该项目;事实证明,页面上的所有内容都是tra events.so@mmmshuddup,我在这里发布的内容是有效的。但事实证明,这是另一个函数中的一个问题,该函数正在引入额外的内容。解除事件绑定是有效的,但对于更好的实现IMHO来说,这也是不必要的。感谢您的帮助!对于我来说,event.stopImmediatePropagation();
是让jQuery停止调用处理程序两次的关键。博客帖子链接已断开
$('.addField').show().unbind('keyup').keyup(function(event){
event.preventDefault();
if(event.keyCode == 13 || event.keyCode==9) {
ProfilePage.createTag( this, 'nada', 'addField')
$(this).hide().val('');
return false;
}
$("#register-form #first_name").keyup(function(event) {
console.log('hello world');
return false;
$(document).unbind('keypress').bind('keypress', function (e) {
// some logic here
});
@Output() keypress = new EventEmitter();
onKeyPress(event) {
this.keypress = new EventEmitter();
this.keypress.emit(event);
}