слишком много ошибок рекурсии в jquery - PullRequest
0 голосов
/ 25 октября 2010

этот код:

$ (документ) .ready (function () {
$ ('body'). click (function (evt) {
if (evt.target.nodeName === 'A' && $ (evt.target) .hasClass ('cross-link')) {
$ ( 'А [HREF = # 2]) триггер ( 'щелчок');.
}});});

дано мне и ошибка "слишком много рекурсии"

Можно подумать, что я должен просто прикрепить обработчик к элементу сшивки. Я попробовал это, но не смог заставить его работать, потому что DOM загружается до того, как будут созданы элементы класса перекрестных ссылок. что мне нужно сделать, чтобы это исправить, или у вас есть лучшее представление о том, что я должен сделать, чтобы реализовать то, что я пытаюсь сделать?

если вы хотите увидеть ошибку для себя, перейдите на eataustineat.com/testfolder/ введите «d» в поле поиска выберите собаку всемогущим (именно здесь вы должны заметить «слишком большую ошибку рекурсии») он сместит div влево, но это будет очень неприятно.

Ответы [ 5 ]

2 голосов
/ 25 октября 2010

Вы можете использовать live или delegate для добавления прослушивателей для элементов, которые создаются позже:

$("a.cross-link").live("click", function()
{
   $('a[href=#2]').trigger('click');
   window.location.hash = "#2";
});

Однако нажатие не вызывает событие перехода по умолчанию на URL-адрес по умолчанию, поэтому вам нужно сделать это вручную.

1 голос
/ 25 октября 2010

Если после создания документа добавляются элементы, которым необходимо существующее событие, вы можете использовать live

$(document).ready(function() {
    $('.cross-link').live(function() {
        $('a[href=#2']).click(); //No cross-link class allowed on this element as it is responsible for the recursion
    });
});
0 голосов
/ 31 мая 2017
$('body').click(function(evt) {
    if(evt.target.nodeName === 'A' && $(evt.target).hasClass('cross-link')) {
        $('a[href=#2]').trigger('click');
    }
  });

Вы пропустите оператор else из if-else.

0 голосов
/ 25 октября 2010

для ссылки на мой комментарий выше, вот как я это сделал.Я рекомендую использовать live tho ...


var open = function (myObj, animationTime) {
    //do stuff
    $(myObj).unbind('click');
    $(myObj).click(function () {
        close(myObj, timer);
    });
}

var close = function (myObj, animationTime) {
    //dostuff
    //remove close click event and then rebind the click event to open
    $(myObj).unbind('click');
    $(myObj).click(function () {
        open(myObj, timer);
    });
}

$(".mySelector").click(function () {
    open($(this), timer);
});


0 голосов
/ 25 октября 2010

Ну, рекурсия происходит из-за срабатывания

$('a[href=#2]').trigger('click');

Когда этот элемент выбирается из события, он вызывает еще одно событие, которое будет обрабатываться тем же кодом и так далее.

Это должно работать:

    $(document.ready)(function(){
      $('.cross-link').click(function(){
       #('a[href=#2').click();
});
});

Кроме того, с точки зрения производительности более оптимальным является добавление идентификатора ко второй ссылке, поскольку выбор по идентификатору выполняется быстрее, чем по атрибуту.Если вы все еще хотите выбрать href, и есть только одна такая ссылка:

#('a[href=#2 :first').click();
...