jQuery .live () не работает с событием клика - PullRequest
3 голосов
/ 04 апреля 2011

У меня есть календарь ajax, который меняет месяц при нажатии на некоторые стрелки.По какой-то причине событие click не работает в методе live ().Раньше работал, но сейчас нет по какой-то причине.

Если я заменю live () на click (), это сработает, но мне нужен метод live ().

Допущения

  • Я использую последнюю версию jQuery.
  • Нет ошибок JS.
  • HTML действителен
  • Обнаружен селектор ax-btn (длина = 2)
  • console.log ('Got this далеко!') Срабатывает корректно.
  • console.log ('Sidebar Cal Clicked') не стрельба на всех.
  • Работа в среде Wordpress.
  • DOCTYPE установлен для HTML5

//ajax calendars
jQuery(document).ready(function($) {

    //sidebar
    $(function() {
        var s = $('#s-calendar'), p = s.closest('.widget');
        console.log('Got this far!');

        //prevent collapse
        p.css('min-height', p.height());

        s.find('a.x-btn').live('click', function(e) {
            console.log('Sidebar Cal Clicked');
            var d = $(this).attr('data-cal-date'), n = $(this).attr('data-nonce');
            var url = $(this).attr('data-ajaxurl');
            $.ajax({
                url:url,
                type:'POST',
                data:'action=wpcal&sidebar=true&_wpcal_nonce='+n+'&date='+d,
                success:function(data) {
                    s.fadeOut(500, function() {
                        s.html(data).fadeIn(500);
                    });

                }
            });
            return false;
        });

    });
});

ОТВЕТ

Оказывается, другой кусок JS заставлял концерт не работать.Метод live () требует распространения событий для правильной работы.У меня в верхней части кода была небольшая строка JS, которую я иногда нахожу полезной.

$('body a[href=#]').click(function(event) { event.preventDefault(); });

Я использую этот код, чтобы предотвратить переход страницы при щелчке по бесполезным ссылкам.Это завершает распространение на все теги 'A', которые с href = "#" при их нажатии.Я удалил его, и все работает нормально.

Кроме того, несмотря на то, что говорят документы jQuery, при использовании jQuery 1.5.2 метод live () работает после обхода DOM.Я все равно изменил его, чтобы быть в курсе документации.Но это работает!Спасибо за помощь, ребята!

Ответы [ 6 ]

3 голосов
/ 04 апреля 2011

Я думаю, это связано с предварительной оценкой s.find.Дает ли использование этого кода разные результаты?

$('#s-calendar a.x-btn').live('click', function(e) {
1 голос
/ 04 апреля 2011

См. Предостережения в реальном времени: http://api.jquery.com/live/#caveats

В частности:
"Методы обхода DOM не поддерживаются для поиска элементов для отправки в .live (). Скорее, .live ()метод всегда должен вызываться сразу после селектора ... "

1 голос
/ 04 апреля 2011

Я подозреваю, что здесь может быть какая-то проблема

s.find('a.x-btn')

Не должно быть никаких проблем с живым кликом.

0 голосов
/ 07 сентября 2015

Функция live () была удалена для версий jQuery> 1.9.Попробуйте что-то вроде $ ('# button_id'). On ('click', 'button_tag_type', function) или $ ('body'). On ('click', '.Button_class', function)

0 голосов
/ 04 апреля 2011

Может ли это быть вызвано тем, что у вас есть готовый вложенный документ?Вы можете удалить второй?

//ajax calendars
jQuery(document).ready(function($) {

    //sidebar
    $(function() { // remove this one
0 голосов
/ 04 апреля 2011

Я думаю, что проблема здесь:

s.find('a.x-btn')

Не возвращается правильный элемент.

...