Я пытаюсь написать видео покер на Javascript, чтобы разобраться в его основах, и столкнулся с проблемой, когда обработчики событий нажатия jQuery запускаются несколько раз.
Они прикреплены к кнопкам для размещения ставки, и это прекрасно работает для размещения ставки на первую руку во время игры (стрельба только один раз); но при ставке на вторую руку она запускает событие нажатия дважды каждый раз, когда нажимается кнопка ставки или ставка на ставку (таким образом, в два раза правильная сумма ставится для каждого нажатия). В целом, этот шаблон повторяется для количества раз, когда событие нажатия срабатывает при однократном нажатии кнопки ставки - где i-й член последовательности относится к ставке на i-ю руку с начала игры: 1, 2, 4 , 7, 11, 16, 22, 29, 37, 46, что, по-видимому, равно n (n + 1) / 2 + 1 для чего бы то ни было - и я не был достаточно умен, чтобы понять это, я использовал OEIS , :)
Вот функция с обработчиками событий click, которые работают; надеюсь, это легко понять (дайте мне знать, если нет, я тоже хочу стать лучше):
/** The following function keeps track of bet buttons that are pressed, until place button is pressed to place bet. **/
function pushingBetButtons() {
$("#money").text("Money left: $" + player.money); // displays money player has left
$(".bet").click(function() {
var amount = 0; // holds the amount of money the player bet on this click
if($(this).attr("id") == "bet1") { // the player just bet $1
amount = 1;
} else if($(this).attr("id") == "bet5") { // etc.
amount = 5;
} else if($(this).attr("id") == "bet25") {
amount = 25;
} else if($(this).attr("id") == "bet100") {
amount = 100;
} else if($(this).attr("id") == "bet500") {
amount = 500;
} else if($(this).attr("id") == "bet1000") {
amount = 1000;
}
if(player.money >= amount) { // check whether the player has this much to bet
player.bet += amount; // add what was just bet by clicking that button to the total bet on this hand
player.money -= amount; // and, of course, subtract it from player's current pot
$("#money").text("Money left: $" + player.money); // then redisplay what the player has left
} else {
alert("You don't have $" + amount + " to bet.");
}
});
$("#place").click(function() {
if(player.bet == 0) { // player didn't bet anything on this hand
alert("Please place a bet first.");
} else {
$("#card_para").css("display", "block"); // now show the cards
$(".card").bind("click", cardClicked); // and set up the event handler for the cards
$("#bet_buttons_para").css("display", "none"); // hide the bet buttons and place bet button
$("#redraw").css("display", "block"); // and reshow the button for redrawing the hand
player.bet = 0; // reset the bet for betting on the next hand
drawNewHand(); // draw the cards
}
});
}
Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи или предложения, или если решение моей проблемы похоже на решение другой проблемы здесь (я просмотрел много одноименных веток и не смог найти решение, которое могло бы работать для меня).
источник
var amount = parseInt(this.id.replace(/[^\d]/g,''),10);
И если вы собираетесь использовать одно и то же свойство элемента более одного раза, кэшируйте это свойство, не ищите его. Поиск дорог.Ответы:
Чтобы убедиться, что только клик действия, используйте это:
источник
.unbind()
устарела, и вы должны использовать.off()
метод вместо. Просто позвоните.off()
прямо перед звонком.on()
.Это удалит все обработчики событий:
Чтобы удалить только зарегистрированные обработчики событий click
источник
.один()
Лучшим вариантом будет
.one()
:В случае нескольких классов, и каждый класс нужно нажать один раз,
источник
onclick
событий в тот же элемент , но в разных местах , это не повлияет на остальное, в то время какunbind()
иoff()
просто уничтожить другиеonclick
s раз спасибоЕсли вы обнаружите, что .off () .unbind () или .stopPropagation () по-прежнему не решают вашу конкретную проблему, попробуйте использовать .stopImmediatePropagation (). Отлично работает в ситуациях, когда вы просто хотите, чтобы ваше событие обрабатывалось без каких-либо пузырей и без выполнение любых других событий, которые уже обрабатываются. Что-то вроде:
делает трюк!
источник
Если вы вызываете эту функцию при каждом «щелчке», то при каждом вызове она добавляет другую пару обработчиков.
Добавление обработчиков с помощью jQuery не похоже на установку значения атрибута «onclick». Можно добавить столько обработчиков, сколько пожелаете.
источник
Событие будет срабатывать несколько раз, когда оно будет зарегистрировано несколько раз (даже если один и тот же обработчик).
например
$("ctrl").on('click', somefunction)
если этот фрагмент кода выполняется каждый раз, когда страница частично обновляется, событие также регистрируется каждый раз. Следовательно, даже если щелкнуть Ctrl только один раз, он может выполнить «некоторую функцию» несколько раз - сколько раз он будет выполняться, будет зависеть от того, сколько раз он был зарегистрирован.это верно для любого события, зарегистрированного в JavaScript.
решение:
убедитесь, что вы звоните только один раз.
и по какой-то причине, если вы не можете контролировать архитектуру, сделайте это:
$("ctrl").off('click'); $("ctrl").on('click', somefunction);
источник
У меня была проблема из-за разметки.
HTML:
JQuery
Вы заметили, что у меня есть один и тот же класс «myclass» дважды в html, поэтому он вызывает click для каждого экземпляра div.
источник
Лучшим вариантом будет использование выключения
источник
Все, что касается .on () и .one () великолепно, а jquery великолепно.
Но иногда вы хотите, чтобы было немного более очевидно, что пользователю не разрешено нажимать, и в этих случаях вы можете сделать что-то вроде этого:
и ваша кнопка будет выглядеть так:
источник
Это происходит из-за того, что конкретное событие несколько раз связано с одним и тем же элементом.
Решение, которое сработало для меня:
Убить все события, прикрепленные с помощью
.die()
метода.А затем прикрепите свой метод слушателя.
Таким образом,
должно быть:
источник
Мы должны
stopPropagation()
Для того, чтобы избежать кликов триггеров событие слишком много раз.Это предотвращает всплытие события в DOM-дереве, предотвращая уведомление любых родительских обработчиков о событии. Этот метод не принимает никаких аргументов.
Мы можем использовать,
event.isPropagationStopped()
чтобы определить, был ли когда-либо вызван этот метод (для этого объекта события).Этот метод работает и для пользовательских событий, запускаемых с помощью trigger (). Обратите внимание, что это не помешает запуску других обработчиков на том же элементе.
источник
В моем случае я использовал «делегат», поэтому ни одно из этих решений не сработало. Я полагаю, что это была кнопка, появляющаяся много раз через вызовы ajax, которая вызывала проблему множественного щелчка Решения использовали тайм-аут, поэтому распознается только последний щелчок:
источник
Docs:
http://api.jquery.com/one/
источник
источник
.one срабатывает только один раз за всю жизнь страницы
Поэтому, если вы хотите выполнить проверку, это не правильное решение, потому что, когда вы не покидаете страницу после проверки, вы никогда не вернетесь. Лучше использовать
источник
Когда я имею дело с этой проблемой, я всегда использую:
Таким образом, я развязываю и переплетаю одним и тем же ходом.
источник
https://jsfiddle.net/0vgchj9n/1/
Чтобы событие всегда срабатывало только один раз, вы можете использовать Jquery .one (). JQuery один гарантирует, что ваш обработчик событий вызывается только один раз. Кроме того, вы можете подписать свой обработчик событий на один, чтобы разрешить дальнейшие щелчки, когда вы закончите обработку текущей операции щелчка.
...
источник
Попробуйте так:
источник
В моем случае событие onclick запускалось несколько раз, потому что я сделал общий обработчик события сравнительно как
изменился на
а также приходится делать отдельные обработчики для статических и динамических кликов, для статического клика на вкладке
источник
В моем случае я загружал один и тот же
*.js
файл на странице дважды в<script>
теге, поэтому оба файла прикрепляли обработчики событий к элементу. Я удалил дубликат декларации, и это решило проблему.источник
Другое решение, которое я нашел, состояло в следующем: если у вас есть несколько классов и вы работаете с переключателями при нажатии на ярлык.
источник
У меня была эта проблема с динамически сгенерированной ссылкой:
$(document).on('click', '#mylink', function({...do stuff...});
Я нашел замену
document
с'body'
фиксированным вопросом для меня:$('body').on('click', '#mylink', function({...do stuff...});
источник
Unbind () работает, но это может вызвать другие проблемы в будущем. Обработчик запускается несколько раз, когда он находится внутри другого обработчика, поэтому держите ваш обработчик снаружи, и, если вы хотите, чтобы значения обработчика были вложенными, присвойте их глобальной переменной, которая будет доступна вашему обработчику.
источник
Если это работает нормально
источник
Приведенный ниже код работал для меня в моем приложении чата для обработки нескольких событий, вызывающих щелчок мышью, более одного раза.
if (!e.originalEvent.detail || e.originalEvent.detail == 1) { // Your code logic }
источник