подія click () викликає двічі у jquery


113

Я встановив елемент посилання та назвав його подія клацання у jquery, але подія натискання викликає двічі, дивіться нижче код jquery.

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

Порадьте, будь ласка.

Дякую.


2
Проблема, ймовірно, десь у вашому сценарії.
karim79

3
якщо ви не можете знайти, де ви зробили речі, щоб зателефонувати цьому двічі, зробіть скасування ("клацання") перед натисканням (...).
regilero

regilero: точно, вся база коду дуже велика. куди мені це покласти?
domlao

2
ви можете виявити, які функції прив'язуються до цієї події кліку: stackoverflow.com/questions/570960/…
Anh Pham

Відповіді:


229

Переконайтесь і переконайтеся, що ви випадково не включили свій скрипт двічі на вашу HTML-сторінку.


1
Це було проблемою для моєї справи. Це моя подія клацання заграла. Дякуємо за вказівник. :) +1
Тахір Акрам

22
Я просто переглянув це рішення і сміявся, думаючи, що "я не дурний, щоб зробити це" ... виявляється, я зробив саме це. Дуже дякую.
JazzyP

1
Дякую! Це виявилося і для мене проблемою. Він мав у шаблоні леза laravel та вкладеному шаблоні, який називав @parent за однойменною назвою розділу. На жаль Знову дякую!
Філіп Харрінгтон

1
Дякую за цю пораду. Боровся з цим понад 20 годин, і ця порада привела мене до правильного шляху. Я використовував MVC ScriptBundles, але також посилався безпосередньо на файли сценаріїв, і це дублювало події
Manish

хаха ... Я був там ... Я поклав провину на третю сторону, але саме я двічі пов'язував файл .js.
Джуліан

76

Зняти скасування перед натисканням;

$("#link_button").unbind('click');
$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

1
спробуйте $ ("# link_button"). unbind (); або зробіть простий тест, щоб перевірити, скільки разів цей код читається, якщо не раз ...
TheSystem

3
це просто виправлення помилки під час польоту, а не справжнє рішення. це робить трюк і допомогло мені, але ви повинні знайти справжню проблему і зробити постійне виправлення.
Хуан Ігнасіо

1
це дійсно корисно в моєму випадку, тому що мені потрібно кілька разів викликати методи зі своїми подіями після деяких дзвінків Ajax, він починає надмірно натискати (я не знаю, чи існує це слово). Для моєї ситуації це означає рішення.
Thiago C. S Ventura

Виправлена ​​проблема зі сценарієм, який був включений лише один раз. Дякую!
К. Рода


36

Я спробував e.stopImmediatePropagation(),; Це, здається, працює для мене.



Дякую, це робота ... до речі, після прочитання зрозумійте, що це запобігає виконанню будь-яких батьківських обробників
Nandlal Ushir

18

У моєму випадку я використовував наведений нижче сценарій для подолання проблеми

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

off()розв’язує всі події, на які пов'язується #id. Якщо ви хочете від’єднати лише clickподію, тоді використовуйте off('click').


8

Просто зателефонуйте .off () прямо перед тим, як зателефонувати .on ().

Це видалить усі обробники подій:

$(element).off().on('click', function() {
// function body
});

Щоб видалити лише зареєстровані обробники подій "натисніть":

$(element).off('click').on('click', function() {
// function body
});

7

Досить поширеним рішенням проблеми з двома клацаннями є введення

e.stopPropagation()

наприкінці вашої функції (якщо ви користуєтеся function(e)цим). Це запобігає появі барботингу події, що може призвести до другого виконання функції.


6

У мене була така ж проблема, але ви можете спробувати змінити цей код

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

до цього:

$("#link_button").button();
$("#link_button").unbind("click").click(function () {
   $("#attachmentForm").slideToggle("fast");
});

Для мене цей код вирішив проблему. Але будьте уважні, щоб випадково не включити свій скрипт двічі на вашу сторінку HTML. Я думаю, що якщо ви робите ці дві речі правильно, ваш код буде працювати правильно. Дякую


3

будь ласка, спробуйте це

$('#ddlSupervisor').live('change', function (e) {
    if (e.handled !== true) { //this makes event to fire only once
    getEmployeesbySupervisor();
    e.handled = true;
   }
});

Я змінив "наживо" на "увімкнено" і, здається, працює на мене. Тож подія спрацьовує лише час, коли натискається кнопка.
Вікнешвар

Це місце на.
LargeTuna

3

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

var called = false;
$("#ColorPalete li").click(function() {
    if(!called)
    {
             called = true;
             setTimeout(function(){ //<-----This can be an ajax request but keep in mind to set called=false when you get response or when the function has successfully executed.
                 alert('I am called');
                 called = false;
             },3000);

    }
});

Таким чином він спочатку перевіряє, скоріше функція була викликана чи ні.



3

Це питання старіше, але якщо ви використовуєте делегування подій, саме це спричинило мене.

Після вилучення .delegate-twoйого двічі перестали виконувати. Я вважаю, що це станеться, якщо на одній сторінці присутні обидва делегати.

$('.delegate-one, .delegate-two').on('click', '.button', function() {
    /* CODE */
});

2

цей фрагмент коду не містить нічого поганого. Це ще одна частина вашого сценарію, як розповів @karim


2

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

   $("#txtChat").keypress(function(event) {
        if (event.which == 13) {
            $('#btnChat').click();
            $('#txtChat').val('');
            return false;
        }
    });

2

Виклик unbindвирішив мою проблему:

$("#btn").unbind("click").click(function() {
    // your code
});

2

Я не знаю, чому, але у мене була ця проблема

$(document).on("click", ".my-element", function (e) { });

Коли я змінив його на

$(".my-element").click(function () { });

Проблема була вирішена. Але напевно щось не так у моєму коді.


це працювало для мене в laravel, не знаю, що викликає це питання
хан Фарман

1

Мене обдурив вибір, який відповідає декільком елементам, тому кожен був натиснутий. :firstдопомогли:

$('.someClass[data-foo="'+notAlwaysUniqueID+'"]:first').click();

1

У мене теж було це питання на ФФ. Однак мій тег був прив’язаний до <a>тегу. Хоча <a>тег нікуди не дінеться, він все-таки зробив подвійне клацання. Я замінив <a>тег на <span>тег, і проблема з подвійним клацанням зникла.

Іншою альтернативою є повністю видалити атрибут href, якщо посилання нікуди не йде.


Це насправді не відповідає на питання. Якщо у вас інше питання, ви можете задати його, натиснувши Задати питання . Ви також можете додати щедрості, щоб привернути більше уваги до цього питання, як тільки у вас буде достатня репутація .
Шон Патрік Флойд

@SeanPatrickFloyd: Насправді це відповідь. Навіть якщо це сформульовано для підняття червоних прапорів.
Дедуплікатор

1

Я зіткнувся з цим питанням, оскільки мій $(elem).click(function(){});сценарій був розміщений вбудованим файлом у розділ, на який було встановлено style="display:none;".

Коли дисплей css переключився на блок, сценарій додав слухача подій вдруге. Я перемістив сценарій до окремого файлу .js, і слухач дублікатів подій більше не ініціювався.


1

Коли я використовую цей метод на сторінці завантаження з jquery, я пишу $('#obj').off('click');перед встановленням функції клацання, тому міхур не виникає. Працює для мене.


1

Моя проста відповідь полягала в тому, щоб перетворити прив'язку клацання у функцію і зателефонувати, що з натискання елемента - спрацювало частування! тоді як нічого з цього не зробили


0

Якщо ваша подія дзвонить двічі-три або більше, це може допомогти.

Якщо ви використовуєте щось подібне для запуску подій ...

$('.js-someclass').click();

… Тоді зверніть увагу на кількість .js-someclassелементів, які ви маєте на сторінці, тому що це спровокує подію натискання для всіх елементів - і не лише один раз!

Просте виправлення - це переконатися, що ви натискаєте клацання лише один раз, вибравши лише перший елемент , наприклад:

$('.js-someclass:first').click();

0

Зрозуміло, що десь у вашому сценарії (сценаріях) подія "натискання" знову прив'язується до того ж елемента, як і кілька інших відповідей / коментарів.

У мене була подібна проблема, і для того, щоб переконатися, я просто додав console.logкоманду до свого сценарію, як у наступному фрагменті:

$("#link_button")
    .button()
    .click(function () {
        console.log("DEBUG: sliding toggle...");
        $("#attachmentForm").slideToggle("fast");
    });

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

консоль розробника

Якщо вам потрібен швидкий виправлення, рішення, запропоноване іншими коментаторами щодо використання offметоду (btw unbindзастаріло з часу jQuery 3.0), щоб відключити подію до (повторного) прив'язування, воно добре працює, і я рекомендую також:

$("#link_button")
    .button()
    .off("click")
    .click(function () {
        $("#attachmentForm").slideToggle("fast");
    });

На жаль, це лише тимчасовий патч! Після того, як проблема із тим, щоб зробити вас шефом щасливою, буде вирішена, вам слід ще трохи зануритися в свій код і виправити проблему "дублювання прив'язки".

Фактичне рішення, звичайно, залежить від конкретного випадку використання. У моєму випадку, наприклад, виникла проблема "контексту". Мою функцію викликали в результаті виклику Ajax, застосованого до певної частини документа: перезавантаження всього документа фактично перезавантажувало і контекст "сторінки", і "елемент", в результаті чого подія була пов'язана з елементом двічі .

Моє рішення цієї проблеми в тому, щоб ефективно використовувати JQuery одну функцію, яка є таким же , як на за винятком , що подія автоматично несвязанное після його першого виклику. Це було ідеально для мого випадку використання, але, знову ж таки, це не може бути рішенням для інших випадків використання.


-1

Була така ж проблема. Це працювало для мене -

$('selector').once().click(function() {});

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


Для мене видає помилку ... Плюс це брудне рішення - функція виконується не один раз, рішення - розмістити її десь в іншому місці та використовувати console.log () для моніторингу речей.
tylerl

-1

У моєму випадку HTML був викладений так:

<div class="share">
  <div class="wrapper">
    <div class="share">
    </div>
  </div>
</div>

І мій jQuery був таким:

jQuery('.share').toggle();

Це мене збентежило, бо нічого, здається, не відбувається. Проблема полягала в тому, що внутрішня .shares toggle скасує зовнішню .shares toggle.


-1

Я вирішив цю проблему, змінивши тип елемента. замість кнопки я розміщую дані, і ця проблема більше не виникає.

вкладається:

<button onclick="doSomthing()">click me</button>

замінити:

<input onclick="doSomthing()" value="click me">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.