Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Обработчик click вызывается несколько раз или не всегда вызывается (https://javascript.ru/forum/jquery/15318-obrabotchik-click-vyzyvaetsya-neskolko-raz-ili-ne-vsegda-vyzyvaetsya.html)

OlegJquery 21.02.2011 23:24

Обработчик click вызывается несколько раз или не всегда вызывается
 
Добрый день,

Используем MSVS/C#/MVC2

Скрипт в динамически подгружаемом ascx (правда, он подгружается каждый раз при загрузке страницы):

Код:

<script type="text/javascript">

    $(document).ready(function () {

        $('#myGrid .my_link').live('click', function () {
            if (confirm('Вы уверены?')) {
            //
            }
        });

    });    // document ready

</script>

Есть 2 пары вариантов:
1. Заворачивать в $(document).ready(function () или нет.
2. Ставить live или просто click:
Код:

        $('#button1').click(function () {
            $.ajax({

Если не заворачиваем в document.ready, а ставим live, то почему-то нажатие срабатывает, но далеко не всегда! (Нормально работает после перезагрузки частей страницы через AJAX, а при первой загрузке страницы не реагирует).

Если ставим live внутри document.ready, диалог по confirm вызывается несколько раз!
(При старте один раз, потом после каждой перезагрузки части страницы по AJAX добавляется по разу.)

Если ставить просто click внутри document.ready, то он работает, но только если контрол подгружается при первой загрузке страницы. А если он подгружается потом, то на нажатие никто не реагирует...

Как быть? Хочется ставить обработчики именно в том файле ascx, где лежат элементы, на которые они должны навешиваться.
Читал похожие темы здесь, все только обсмеивали авторов, а что конкретно делать (устроил бы именно такой ответ!!!), толком не предлагали. Мы сейчас занимаемся углублением знаний по C#/прочим языкам и сферам, связанным с приложением, а на JS/Jquery времени катастрофически не хватает.

Physicist 21.07.2011 20:28

Хм... Я тоже с этим столкнулся, а ответа действительно нет.
Меня лишь спасло то, что в моём примере достаточно ограничитться методом click(). А как быть с live сам несколько дней голову ломаю. Кстати у и при "$(document).ready(function ()" не всегда работало.

kobezzza 21.07.2011 20:37

Цитата:

Если не заворачиваем в document.ready, а ставим live, то почему-то нажатие срабатывает
document.ready - это событие, когда DOM (сам скелет) был полностью загружен. Лучше юзать, для надёжности.

Срабатывает не всегда (когда без document.ready), потому, что у тебя элемент на который вешает обработчик не загрузился, следовательно его нет. А срабатывает потом, что когда грузиш его второй раз - элемент уже есть.

live - этот метод делегирует события, т.е. накладывает на родителя событие, а при срабатывании смотрит на ком оно сработало (т.е. на детях)

Цитата:

Если ставим live внутри document.ready, диалог по confirm вызывается несколько раз!
Ну поставь ему return false; в конце, должно помочь.


Часовой пояс GMT +3, время: 06:43.