2015-03-04 3 views
0

У меня есть приложение с активными действиями ajax. Так почти все мои события обрабатываются так:jQuery on scroll event not firing

jQuery('body').on('click', '#id', function (event) { 

    // Do something 

}); 

вместо:

jQuery('#id').click(function() { 

    // Do something 

}); 

Это работает со всеми событиями довольно хорошо, за исключением события прокрутки, как это не работает:

jQuery('body').on('scroll', '#id', function (event) { 

    // Do something 

}); 

С событием mousewheel он отлично работает. Есть ли что-то неправильное или нет события прокрутки?

+1

Вы должны хотя бы знать, что делегирование всех событий до тела не очень хорошая практика, и, как правило, следует избегать, если у вас есть другие параметры или статические родительские элементы, которые можно использовать вместо этого. – adeneo

ответ

3

Вопрос заключается в том, что scroll событие не пузырек вверх по DOM, поэтому делегация с live(), on() или delegate() не будет работать.

Вам придется привязать обработчик событий к динамически созданному элементу самостоятельно.

Reference

+0

Это похоже на не слишком большое решение. Но, вероятно, это единственное, что можно сделать ... возможно, также будет возможно синхронизировать обработчик событий после каждого вызова ajax, но мой код составляет несколько тысяч строк большого су ... – Grandy

2

Не уверен, если это поможет

$(window).on('scroll', function(){ 
    $("#head").html($(this).scrollTop()); 
}); 

JSfiddle

+0

Да, прокрутка работает в окне или iframe – MaxZoom

+0

Абсолютно нет, но спасибо. Ваше решение является стандартным способом jquery для события прокрутки, но вы не можете привязать его к элементам, которые не находятся в dom во время выполнения. Таким образом, для всего, что создается динамически, это решение бесполезно, если вы не внесете его в сам ответ ajax (именно это и предложил BenM). – Grandy

0

Чтобы иметь возможность стрелять событие прокрутки в DOM элемента, вы должны сделать это в вашем CSS:

selector { overflow-y: scroll }