2011-11-02 60 views
18

这个问题已经被问/回答(大部分)之前,但我已经试过三件事冒泡停止事件,但没有奏效:火灾的输入按键事件两次

return false; 
e.stopPropagation(); 
e.preventDefault(); 

(返回false应该采取关心其他两个的,正确的)

这里的HTML:

<div class="tags-holder"> 
    <input type="text" class="addField" id="addField_<%= visit.id %>" placeholder="add a new tag"> 
</div> 

而且JS(UPDATE清理):

$('.addField').show().keyup(function(event){ 
    event.preventDefault(); 

     if(event.keyCode == 13 || event.keyCode==9) { 
    ProfilePage.createTag(this, 'nada', 'addField') 
     $(this).hide().val(''); 

     return false;  
    } 

});

我在那里留下了多余的塞子,但是真的不应该返回false只干掉冒泡? (使用Chrome)。

线索?键代码= 13是 “输入”

+0

为什么你要做'$(field).functionCall()'而不是'field.functionCall()'? –

+1

我创建了[jsFiddle](http://jsfiddle.net/thomas_peklak/dNKZ7/3/)代码,但没有看到任何问题 - 您尝试阻止的行为是什么? – topek

+0

谢谢。这样可行;也许这是事件冒泡的东西给DOM(我没有发布整个页面)。 问题是,它会触发createTag()函数两次,这是有问题:) – bear

回答

10

哇。你的帮助很棒,帮助我思考。

但是这个解决方案有点像cop-out;有效的,但条件不应该在那里摆在首位。

这是,这是我在从这里找到注释: http://yuji.wordpress.com/2010/02/22/jquery-click-event-fires-twice/

$('.plus').unbind('click').bind('click',function(e){  
console.log('clicked') 
    var id=$(this).attr('plus_id'); 
    var field=$('<input type="text">').attr({'placeholder':'add a new tag','id': 'addField_' + id, 'visit_id':id}); 
    field.focus(); 
    field.show().keydown(function(event){ 
     event.stopImmediatePropagation(); 
     if(event.keyCode == 13 || event.keyCode==9) { 
      console.log(event) 
      ProfilePage.createTag(field, 'nada', 'addField') 
      field.hide().val(''); 
      return false;  
     } 
    }).click(function(e){ 
     return false; 
    }) 
    ; 
$(this).append(field); 
return false;  
    }); 
+0

哦,这很奇怪。现在呢?如果是这样,那太棒了!但是根据你发布的文章,这听起来像是有超过$(document).ready()函数的问题。这是什么情况? –

+0

顺便说一下,我正在阅读更多关于它似乎这是设置keyup事件处理程序的一个特定问题。*显然*推荐使用_keypress_处理程序.. http://stackoverflow.com/questions/2387316/jquery-textbox-keyup-firing-twice –

+0

我会检查出@mmmshuddup,但我认为这个问题是非常具体的项目;事实证明,页面上的所有内容都会触发额外事件 – bear

0

尝试改变的

$(field).functionCall() 

所有实例

field.functionCall() 

因为场已经是一个jQuery对象。

好吧,现在我们已经确定这不是错误。我在Firefox 7和Chrome 15中进行了测试,发现if语句中的代码块在按下Enter键时仅触发一次。尝试检查以确保createTag()函数内部的某些内容不会执行两次任务。

+0

坏习惯... jquery忽略它,但我已经做出了改变,但没有任何改善。 – bear

+0

Dangit。是的,无论如何,无论如何,无论如何,这都是黑暗中的一击。嗯,让我想一下这个片刻。 –

+0

@ user508708我在topek创建的同一个jsFiddle中为createTag()做了一个模拟函数。警报只会被触发一次..在这一点上,如果不知道DOM中究竟有什么内容以及ProfilePage对象的引用是非常困难的。 –

0

您认为在气泡出现时捕捉事件的意义如何?我只用这个测试页面发射一次。

<!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> 

也许这是你的选择。它嵌套在另一个.addTag内吗?当我更改jQuery选择器,并使div和输入相同的类,我开始得到两个事件触发。就像这样:

$('.thing').show().keyup(...); 

......还有......

<div class="thing"> 
    <input class="thing" type="text" /> 
</div> 
1

希望这将解决您的问题。 而不是使用event.preventDefault()使用下面显示的这两个。 在Microsoft浏览器中使用 event.cancelBubble = true; 如果W3C模型浏览器使用 事件。stopPropagation();

而不是Keyup事件善意地使用按键事件,因为在按键本身输入将被发送到输入字段,所以你不想出现的任何输入将出现在字段上。所以输入按钮事件将被触发。

而不是返回false使用event.returnValue = false。

6

尝试解除绑定事件首先把它绑定,请参考下面的代码:

$('.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;  
} 

的解释是here,我写了一个关于这个职位上我的新博客。

0

这是一个总是让我疯狂的问题,但我认为这是解决方案 只是返回false,如果你返回true,它会随机地重复它自己,所以即时猜测它必须有一个侦听器,侦听真正的响应。

简答 添加返回false;

$("#register-form #first_name").keyup(function(event) { 
console.log('hello world'); 
return false; 

});

在原始问题中,如果仔细观察代码,看起来返回false被写得太早了。

7

我有同样的问题,我用上面的方法,它为我工作。

$(document).unbind('keypress').bind('keypress', function (e) { 
    // some logic here 
});