Подія jQuery Button.click () запускається двічі


81

У мене така проблема з цим кодом:

<button id="delete">Remove items</button>

$("#delete").button({
     icons: {
             primary: 'ui-icon-trash'
     }
}).click(function() {
     alert("Clicked");
});

Якщо я натисну цю кнопку, сповіщення з’явиться два рази. Справа не тільки в цій конкретній кнопці, але і в кожній кнопці, яку я створюю.

Що я роблю не так?


Відповіді:


66

Ваш поточний код працює, ви можете спробувати тут: http://jsfiddle.net/s4UyH/

У вас є щось поза прикладом, яке запускає інший .click(), перевірте, чи немає інших обробників, які також ініціюють clickподію для цього елемента.


28
Ти правий! Я ставлю .unbind ("клацання") перед .click (). Зараз він працює належним чином. Мені доводиться шукати елемент, який ініціює подію вдруге ... Щиро дякую!
user276289

1
Це більше схоже на те, що ви двічі прив’язували одну і ту ж подію кліку. jQuery поставить прив'язки в чергу, тому, якщо ви прив'яжете кілька подій клацання до одного елемента, при натисканні на нього всі вони спрацюють. Невелика різниця полягала б у тому, що подія кліку була запущена двічі порівняно з тією ж подією кліку, прив'язаною до елемента двічі.
MacAnthony

16
@ user276289 - Можливо, ваш цілий код працює більше одного разу, переконайтесь, що він включений лише один раз на сторінці.
Нік Кравер

3
Дякую Ніку Краверу! Це була саме моя проблема, у мене був вбудований код у діалоговому вікні jQuery, тому він був запущений знову, коли було відображено діалогове вікно jQuery UI.
James,

3
Це правильна відповідь. Багато разів подвійне завантаження одного і того ж файлу JS також призводить до цієї помилки.

129

У цьому випадку ми можемо зробити наступне

$('selected').unbind('click').bind('click', function (e) {
  do_something();
});

Я мав подію запускатися два рази спочатку, коли сторінка оновлювалася, вона запускалася чотири рази. Це пройшло через багато безрезультатних годин, перш ніж я зрозумів це за допомогою пошуку в Google.

Потрібно також сказати, що код спочатку працював, поки я не почав користуватися віджетом гармошки JQueryUI.


8
Цей варіант також працює:$('.element').unbind("click").on('click', function(e) { ... });
Росді Касім

Саме те, що я шукав. Також можна підтвердити, що коментар @RosdiKasim правильний - це те, що я використав.
Новокаїн

Це відповідь, яку я шукав, і отримав її протягом 5 хвилин .. дякую
Алауддін Ахмед,

40

Дивна поведінка, яку я також переживав. Тож для мене "повернення помилкового" зробило свою справу.

        $( '#selector' ).on( 'click', function() {
            //code
            return false;
        });

Дякую! У моєму випадку я не міг відв'язати або вимкнути свій обробник подій, а просто повернення false спрацювало!
bergie3000

6
Це спрацювало і у мене, але я хотів би знати, чому.
Аллен Лю

Погляньте на відповідь Нура.
Арман Петросян

1
Це спрацювало для мене. Кліки не ініціюються більше одного разу. Однак, якщо клік прив'язаний до прапорця, він не перевіряється на події кліку.
Ребекка Меріц

19

Якщо ви використовуєте

$( document ).ready({ })

або

$(function() { });

кілька разів функція клацання спрацьовує стільки разів, скільки використовується.


1
це виправлене видобуток.
Квварадха,

13

Ви можете спробувати це.

    $('#id').off().on('click', function() {
        // function body
    });
    $('.class').off().on('click', function() {
        // function body
    });

8

Це також може бути викликано наявністю як елемента , так inputі label всередині елемента із засобом прослуховування кліків.

Ви натискаєте на label, що викликає подію клацання, а також іншу подію клацання на inputдля label. Обидві події спливають на ваш елемент.

Дивіться цю ручку вигадливого перемикача лише для CSS: https://codepen.io/stepanh/pen/WaYzzO

Примітка: Це не стосується jQuery, власний прослуховувач запускається вдвічі, як показано на пера.


отже, що має бути виправлення для цього? це мій сценарій
mars-o

4

Це може бути спричинено з таких причин:

  1. Ви не раз включали сценарій в один і той же файл html
  2. Ви двічі додавали прослуховувач подій (наприклад: usingonclick атрибута елемента, а також за допомогою jquery
  3. Подія продувають до деякого батьківського елемента. (Ви можете розглянути можливість використанняevent.stopPropagation ).
  4. Якщо ви використовуєте template inheritanceлайкextends в Django, швидше за все , ви включили сценарій в більш ніж один файл , які в поєднанні один з одним includeабоextend теги шаблонів
  5. Якщо ви використовуєте Django шаблон, ви неправильно розмістили blockвсередині іншого .

Отже, вам слід або виявити їх, і видалити копію імпорту. Це найкраще, що потрібно зробити.

Іншим рішенням є видалення всіх clickпрослуховувачів подій у сценарії, наприклад:

$("#myId").off().on("click", function(event) {
event.stopPropagation();
});

Ви можете пропустити, event.stopPropagation();якщо ви впевнені, що подія не відображається.


Дякуємо, що включили очевидний номер 1 у свою відповідь. Я не можу повірити, що не усвідомлював, що саме це відбувається. (facepalm)
Джош-Кост

3

У мене була та сама проблема, і я спробував все, але це не спрацювало. Тому я використав наступний фокус:

function do_stuff(e)
{
    if(e){ alert(e); }
}
$("#delete").click(function() {
    do_stuff("Clicked");
});

Ви перевіряєте, чи не є цей параметр нульовим, ніж код. Отже, коли функція спрацює вдруге, вона покаже, що ви хочете.



1

Я виявив, що прив'язка елемента. Клацніть у функції, яка трапляється більше одного разу, поставить її в чергу, тому наступного разу, коли ви її клацнете, вона спрацює стільки разів, скільки було виконано функції прив'язки. Помилка новачка, можливо, на моєму кінці, але, сподіваюся, це допоможе. TL, DR: переконайтеся, що ви прив’язали всі кліки функції налаштування, яка відбувається лише один раз.


1

Подібно до того, що Нік намагається сказати, подія ззовні викликає подію двічі. Щоб вирішити цю проблему, слід використовувати event.stopPropagation (), щоб батьківський елемент не міг.

$('button').click(function(event) {
    event.stopPropagation();
});

Сподіваюся, це допоможе.


Це не спрацювало для мене. Щось, що спричиняло натискання, було викликано не раз.
Ребекка Меріц

1

у моєму випадку я використовував команду зміни таким чином

$(document).on('change', '.select-brand', function () {...my codes...});

а потім я змінив шлях до

$ ('. select-brand'). on ('change', function () {... мої коди ...});

і це вирішило мою проблему.


0

Якщо ви не хочете, щоб ваша кнопка була кнопкою надсилання, закодуйте її як Видалити елементи, які повинні вирішити вашу проблему. Якщо ви не вказали тип для елемента кнопки, за замовчуванням це буде кнопка надсилання, що призведе до виявленої вами проблеми.


Вибачте - було дивно завантажено. Просто додайте type = "button" всередину тегу кнопки, і це має зробити.
user2672224

0

Пов’язана зі Відповіддю Степана.

у моєму випадку у мене є і те, inputі інше labelу моєму .click()слухачі.

я просто замінив labelна div, це спрацювало!


0

Якщо ви використовуєте AngularJS:

Якщо ви використовуєте AngularJS, а ваша подія натискання jQuery знаходиться ВНУТРІ КОНТРОЛЕРА , це буде порушено самим фреймворком Angular і запускатиметься двічі. Щоб вирішити цю проблему, перемістіть її з контролера та виконайте наступне:

// Make sure you're using $(document), or else it won't fire.
$(document).on("click", "#myTemplateId #myButtonId", function () {
   console.log("#myButtonId is fired!");
   // Do something else.
});

angular.module("myModuleName")
   .controller("myController", bla bla bla)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.