Входные сигналы
Этот вопрос был задан/ответил (в основном) раньше, НО Я пробовал три вещи, чтобы остановить событие от пузырьков, но ничего не сработало:
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>
И JS (UPDATE CLEANED UP):
$('.addField').show().keyup(function(event){
event.preventDefault();
if(event.keyCode == 13 || event.keyCode==9) {
ProfilePage.createTag( this, 'nada', 'addField')
$(this).hide().val('');
return false;
}
});
Я оставил избыточные пробки там, но на самом деле не должен возвращать ложные просто убить пузырь? (используя Chrome).
Clue? keyCode = 13 - "Enter"
Ответы
Ответ 1
Ого. Ваша помощь была отличной и помогла мне продумать это.
НО решение кажется немного похоже на копирование; но условие никогда не должно быть в первую очередь.
Вот он, который я нашел в комментариях отсюда:
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;
});
Ответ 2
У меня была такая же проблема, и я использовал выше метод, и он работает для меня.
$(document).unbind('keypress').bind('keypress', function (e) {
// some logic here
});
Ответ 3
Попробуйте сначала отвязать событие, затем привяжите его, см. ниже код:
$('.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;
}
Объяснение здесь, я написал сообщение об этом в своем новом блоге.
Ответ 4
Надеюсь, это решит вашу проблему.
Вместо использования event.preventDefault() используйте эти два, показанные ниже.
В случае использования браузерами Microsoft
event.cancelBubble = true;
В случае использования браузеров моделей W3C
event.stopPropagation();
И вместо события Keyup любезно используйте событие нажатия клавиши, потому что во время нажатия клавиши ввод будет отправлен в поле ввода, чтобы любые входы, которые вы не хотите появляться, появлялись в поле. Таким образом, будет активировано событие ввода.
Вместо return false use event.returnValue = false.
Ответ 5
Попробуйте изменить все экземпляры
$(field).functionCall()
to
field.functionCall()
поскольку поле уже является объектом jQuery.
Хорошо, теперь мы установили, что это не ошибка. Я тестировал в Firefox 7 и Chrome 15 и видел, что блок кода в операторе if запускается только один раз при нажатии кнопки ввода. Попробуйте проверить, чтобы что-то внутри функции createTag() ничего не делало дважды.
Ответ 6
Как вы думаете, поймать событие, когда оно пузырится. Я получаю только один выстрел с этой тестовой страницей.
<!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>
Ответ 7
Это проблема, которая всегда сводит меня с ума, но я думаю, что это решение
просто верните false, если вы вернете true, он повторяет его самостоятельно, поэтому я предполагаю, что у него должен быть слушатель, который слушает истинные ответы.
Короткий ответ
Добавить return false;
$("#register-form #first_name").keyup(function(event) {
console.log('hello world');
return false;
});
в исходном вопросе, если вы внимательно посмотрите на код, кажется, что return false было написано на одну строку слишком рано.