jquery: привязать событие щелчка к загруженному ajax elmente? live () не будет работать? - PullRequest
0 голосов
/ 22 февраля 2011

Эй, ребята, У меня есть поле ввода, которое ищет совпадающие символы на странице. Эта страница просто перечисляет якорные ссылки. Поэтому при вводе текста я постоянно загружаю () (используя метод jquery load ()) эту страницу со всеми ссылками и проверяю соответствие символов. Если найдена соответствующая ссылка, она отображается для пользователя. Однако все эти ссылки должны иметь e.preventDefault () на них.

Это просто не сработает. #found - это контейнер, который показывает совпадающие элементы. На всех ссылках, на которые вы нажали, должна быть функция protectDefault ().

редактирование:

/*Animated scroll for anchorlinks*/
var anchor = '',
    pageOffset = '',
    viewOffset = 30,
    scrollPos = '';
$(function() {
    $("a[href*='#']").each(function() {
        $(this).addClass('anchorLink');
        $(this).bind('click', function(e) {
            e.preventDefault();
            //console.log('test');
            anchor = $(this).attr('href').split('#')[1];

            pageOffset = $("#"+anchor).offset();

            scrollPos = pageOffset.top - viewOffset;
            $('html, body').animate({scrollTop:scrollPos}, '500');
        })      
    });
});

Ну, я ищу все ссылки, содержащие #. Так что я знаю, что эти элементы являются якорями, которые переходят на другие элементы. Я не хочу, чтобы моя страница перепрыгивала, а скорее плавно прокручиваю к этому элементу с помощью этого #id

Это прекрасно работает, когда я использую bind('click', ... для обычных элементов страницы, которые были загружены при открытии страницы. Это не работает для якорей, которые были загружены через AJAX! Если я изменю bind на live, то ничего не изменится для загруженных ajax элементов - они все равно не будут работать. Однако обычные якоря, которые всегда были на странице, также не запускают функцию. Так что с live () ничего не работает!

1 Ответ

0 голосов
/ 22 февраля 2011

Когда вы говорите «это не сработает», вы имеете в виду, что ваша функция не была вызвана или вы не можете отменить ее?Насколько я знаю, вы не можете отменить живые события.В jQuery 1.4 вы можете использовать return false, чтобы отменить распространение живого события.Вызов e.preventDefault () не будет работать.

Редактировать: правильно, поэтому этот код должен работать в основном.Что он по-прежнему не будет делать, так это то, что он не добавит класс 'anchorLink' к вашим новым якорям.Однако, если щелчки сработают, дайте мне знать, и я дам вам правильный код, чтобы добавить класс тоже!

var anchor = '',
    pageOffset = '',
    viewOffset = 30,
    scrollPos = '';
$(function() {
    $("a[href*='#']").each(function() {
        $(this).addClass('anchorLink');
    });


    $("a").live('click', function(e) {
        if ($(this).attr("href").indexOf("#") > -1) {
            e.preventDefault();
            //console.log('test');
            anchor = $(this).attr('href').split('#')[1];

            pageOffset = $("#" + anchor).offset();

            scrollPos = pageOffset.top - viewOffset;
            $('html, body').animate({ scrollTop: scrollPos }, '500');
            //nikhil: e.preventDefault() might not work, try return false here
        }
    });
});
...