Двойное событие
Всем доброго времени суток =)
Надеюсь, сможете помочь в нелегком деле)) На сайте событие click отрабатывает (похоже, всегда) по 2 раза. Вот ивой пример с пояснениями: var clickCount = 0; $("#button-cart").one("click", function(event) { event.preventDefault(); ++clickCount; if (clickCount%2 == 1) { console.log(clickCount); //Выводит дважды одно число! form = $(this).closest("form"); data = {"items": {}, "action": "ADD2BASKET"}; id = form.find(".pid").val(); quantity = form.find(".qty_input").val(); data["items"][id] = {new_quantity: quantity}; $.ajax({ url: "/ajax/basket.php", data: data, success: function(result) { console.log(result); $(".notification .success").html("Товар "+result.last_added+" успешно добавлен в <a href='/personal/cart/'>корзину покупок!</a><a href='#' class='close'></a>"); $(".notification .success .close").click(function(event) { event.preventDefault(); $(".notification .success").fadeTo("fast", 0).html(""); }); $("#cart-total").html(result.fullQuantity+" "+declination("товара", "товаров", "товар", result.fullQuantity)+" на "+result.allSumm+" р."); $(".notification .success").show().fadeTo("fast", 1); $.scrollTo("#header", 500); } // return false; }) } }); }); Это последний вариант, с вызовом через .one. Результат тот же, функция отрабатывает 2 раза. Кроме того, на строчке 6 в консоль дважды вылетает одно и то же число. У меня закончились соображения по этому поводу, в гугле тоже ничего полезного не нашел.. Надеюсь на вашу помощь) Вживую, например, тут: http://simtele.ru/catalog/iphone_5s/...2016Gb%20Gold/ |
Цитата:
Косяк и проявится. ;) |
Простой пример я сделал такой:
$(".description").click(function(event) { console.log(event); }) Результат: ![]() Если посмотреть на timestamp, видно, что клик был сделан 1 раз. Естественно, пытался в отладчике брейкпоинты ставить, тоже ничего не дало. Сначала обрабатывается мой скрипт, затем лезет в библиотеку jQuery, затем снова в скрипт. |
Странную весч нашел (правда, не факт, что поможет):
![]() Кнопка как раз та, что нужна мне. Почему jquery на нее повесился? И может ли это как-то влиять вообще)) На клик по div.description он не вешается так же, как на эту кнопку. Однако, функция все равно отрабатывает 2 раза. UPD: Кстати, сначала я вешался не на клик по кнопке, а на submit формы. Результат был тот же самый. |
Либо два вложенных элемента с одним классом, либо ты просто два раза подключил свой скрипт.
|
Цитата:
Тестовый пример должен работать прямо тут в теме. |
Цитата:
Цитата:
|
Цитата:
Начнем, например, с этого <!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> <!-- <link rel="stylesheet" type="text/css" href="tmp.css" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> --> <style type="text/css"> </style> <script type="text/javascript"> $(function (){ $(".description").click(function(event) { alert(1); }) }); </script> </head> <body> <p class='description'>Test</p> </body> </html> Цитата:
Что ты с ним должен сделать, чтобы событие начало срабатывать дважды? |
Судя по тому, что нашел в интернете, то либо дважды повесить обработчик, либо вложить внутрь элемент с тем же классом. На сайте, с которым я работаю, не обнаружил ни того, ни другого.
|
Эллурн,
может добавить отмену всплытия чтобы форма не отрабатывала клик |
Цитата:
На сайте ты уже накосячил, да так, что даже найти косяк не в состоянии... А пример пока работает правильно. Т.ч. наращивая его у тебя есть все шансы найти свой косяк. ;) |
К счастью или к сожалению, сайт делал не я. "Мелкие доработки" типового решения сторонних разработчиков под одну из CMS выливаются в целую эпопею из-за непредусмотрительности тех самых разработчиков. Эта ошибка уже была на сайте, когда я за него взялся.
Пример некомпетентности: сейчас увидел, что, чтобы достать маленькую табличку, они аяксом подгружают целиком главную страницу (маленькая фича: если бы они использовали буферизацию вывода, нагрузка на сервер снизилась бы в разы, так же как и время загрузки данных, которое сейчас составляет больше секунды; а ведь еще можно учесть, что нужный им кусок страницы находится в шапке сайта). Ну что же, буду изображать школоло :) Первый пример сделаю, когда покушаю. |
<!DOCTYPE html> <html> <head> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <!-- <link rel="stylesheet" type="text/css" href="tmp.css" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> --> <style type="text/css"> </style> <script type="text/javascript"> $(function (){ $(".btn").click(function(event) { event.preventDefault(); console.log("Click!"); }) }); </script> </head> <body> <button class="btn">Click me!</button> </body> </html> Выдает по одному клику за раз. Расположенная на целевой странице функция $("некоторые_селекторы").click(function(event) { event.preventDefault(); console.log("Click!"); }) Выдает 2 клика за раз. Наверняка происходит вся гадость где-то в подключенных скриптах, а это в основном минимизированные библиотеки, коих немало. В читабельных скриптах на быстрый взгляд ничего подозрительного не нашел, брейкпоинты тоже ничего не дали. Что интересно (только сейчас это проверил): если функцию подключить после загрузки страницы в консоли (а не в файле .js), то клик проходит только 1 раз. Не мучайте, подскажите, как найти, пожалуйста =) |
Всем спасибо :) Методом научного тыка нашел, что часть скриптов через API CMS подключается-таки дважды. На кол надо сажать таких разработчиков... Неделю времени убил на эту хрень, ибо в коде помойка натуральная.
|
Часовой пояс GMT +3, время: 06:02. |