Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 输入触发按键事件两次_Javascript_Jquery_Dom_Jquery Events - Fatal编程技术网

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);
 }