2012-05-30 4 views
9

У меня есть метка и некоторые функции, выполняемые при нажатии на нее.Простой щелчок на ярлыках делает двойной щелчок

Но когда событие щелчка сделано, двойное событие щелчка не будет сделано, то мои функции запустить 2 раза ...

Вы можете увидеть свет пример here

HTML:

<label> 
<input type="checkbox" id="checkbox"> Click here 
</label> 
<input type="text" id="test" value="0"/> clicks​​​ 

JavaScript:

$(document).ready(function(){ 
    $('label').click(function(event) { 
     $('#test').val(parseInt($('#test').val())+1); 
     event.preventdefault(); 
    }); 
});​ 
  • Когда мы нажимаем на флажок, счетчик кликов +1 >> Ok
  • Когда мы нажимаем на ярлыке, счетчик кликов +2 >> Нок

Как решить эту проблему?

Редактировать

preventdefault() к preventDefault() фиксированной двойной щелчок, но теперь флажок не установлен больше ...

+0

'preventDefault' имеет капитал' "D" 'в нем. –

+0

Почему вы привязываете обработчик привязки к ярлыку? и Почему вы включаете флажок внутри метки? –

+2

@ Vega: установите флажок внутри метки, чтобы метка переключала флажок без необходимости использования атрибута 'for'. –

ответ

10

Ну это интересно. Вы видите два события click, один из них из флажка input, а другой (конечно) из label. И это имеет смысл: нажатие на label походит на щелчок по метке label этикетки, по дизайну. Here's an updated fiddle показывает, что происходит.

Так просто подключить click на флажке и не зацепить его на этикетке:

$(document).ready(function(){ 
    $('#checkbox').click(function(event) { 
     $('#test').val(parseInt($('#test').val())+1); 
    }); 
});​ 

Updated fiddle


И как Ракетно сказал в комментарии на вопрос по: preventDefault имеет капитал D в нем, поэтому ваш код бросает исключение. Но вы все равно не хотели preventDefault, потому что вы хотите, чтобы этот флажок был установлен.

+0

Идеальный ответ, спасибо большое! – Valky

+0

лучший ответ. preventDefault не нужен. – jbabey

+0

@Valky: Не стоит беспокоиться, отличный вопрос - я чему-то научился. Рад, что это помогло, –

1

Uncaught TypeError: Объект # не имеет метод 'preventdefault'

d в preventdefault должны быть капитализированы.

Редактировать: поведение браузера для флажка, помещенного в метку, запускается при щелчке по галочке при нажатии метки. Чтобы решить исходную проблему, привяжите только добавочный обработчик кликов к флажку.

$(document).ready(function(){ 
    $('#checkbox').click(function(event) { 
     $('#test').val(parseInt($('#test').val())+1); 
    }); 
});​ 

http://jsfiddle.net/vgWGT/28/

Похожие: http://www.webmonkey.com/2010/02/javascript_debugging_for_beginners/

+0

Хотя это правда, это не ответ на вопрос. :-) –

+0

Спасибо, но checkbox больше не проверяется :-( – Valky

+0

@Valky, что такое предполагаемое поведение? – jbabey

-2

Делают это так:

<div class="click"> 
<input type="checkbox" id="checkbox"> 
<label>Click here</label> 
</div> 

<input type="text" id="test" value="0"/> clicks​ 


$(document).ready(function(){ 
    $('.click').click(function(event) { 
     $('#test').val(parseInt($('#test').val())+1); 
     event.preventdefault(); 
    }); 
}); 
+0

у вас такая же синтаксическая ошибка, как и в исходном коде. – jbabey

+0

@jbabey: И ярлык перестает работать. –

+0

Действительно уродливое ... спасибо в любом случае. – Valky

2

Простое решение заключается в игнорировании одного звонка .. Смотри ниже,

$(document).ready(function(){ 
    $('label').click(function(event) { 
     if (event.target.nodeName == 'LABEL') return; 
     $('#test').val(parseInt($('#test').val())+1);   
    }); 
}); 

DEMO

+0

Ницца, дайте +1, но решение TJ Crowder светлее. – Valky

1

preventDefault() отключит оригинальная функция. Попробуйте это:

$(document).ready(function(){ 
    $('input:#checkbox').click(function() { 
     $('#test').val(parseInt($('#test').val())+1); 
    }); 
}); 
+0

То же, что и решение TJ Crowder, спасибо в любом случае и +1 – Valky

0

HTML

<input type="checkbox" id="checkbox"> 
<label for ="checkbox">Click here</label> 
<input type="text" id="test" value="0"/> clicks 

JS

$(document).ready(function(){ 
    $('label').click(function(event) { 
    var valor = parseInt($('#test').val()); 
     $('#test').val(valor+1); 
     event.preventdefault(); 
    }); 
}); 

Он работает

+1

Почему это работает Пожалуйста, объясните свой ответ. – Marcus

Смежные вопросы