слишком много ошибок рекурсии в jquery

этот код:

$(document).ready(function() {
$('body').click(function(evt) {
if(evt.target.nodeName === 'A' && $(evt.target ).hasClass('перекрестная ссылка')) {
$('a[href=#2]').trigger('click');
} });});

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

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

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


person scifirocket    schedule 25.10.2010    source источник


Ответы (5)


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

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

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

person Matthew Flaschen    schedule 25.10.2010
comment
это лучший способ. Я бы сделал проект таким образом, но узнал об этом только после того, как прошел процесс создания элемента и присоединения функции клика к объекту после его создания. - person Kieran; 25.10.2010
comment
что вы имеете в виду, что мне нужно вручную выполнить событие по умолчанию? есть ли учебник, который вы бы порекомендовали объяснить это? - person scifirocket; 26.10.2010
comment
@scifirocket, вызов trigger('click') на самом деле не приведет к URL-адресу № 2, поэтому вам нужно сделать это вручную. Я делаю это в строке window.location.hash. - person Matthew Flaschen; 26.10.2010
comment
Я все еще получаю слишком много ошибок рекурсии. Вы можете увидеть его по адресу: eataustineat.com/testfolder/index.php - person scifirocket; 27.10.2010
comment
Используйте это решение вместо моего, но удалите $('a[href=#2]').trigger('click'); поскольку единственная причина, по которой вы вызываете .click(), похоже, заключается в переходе к # 2 - person sunn0; 27.10.2010
comment
это не работает. похоже, он не активирует javascript, связанный с классом перекрестных ссылок. простое принудительное изменение местоположения на # 2 не приведет к перемещению ползунка. - person scifirocket; 27.10.2010
comment
я закончил тем, что использовал другой ползунок все вместе. но функция .live была тем, что я использовал для нового решения. если вам интересно, вы можете увидеть, что я пытался сделать, на www.eataustineat.com/testfolder2/ - person scifirocket; 31.10.2010

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

$(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
    });
});
person sunn0    schedule 25.10.2010
comment
firebug говорит мне: f не определено - person scifirocket; 25.10.2010
comment
Я реализовал это, но продолжал получать ошибку рекурсии. теперь код выглядит так: $(document).ready(function() { $('.cross-link').live('click', function() { $('a[href=#2]'). клик(); });}); - person scifirocket; 26.10.2010
comment
У вашего ‹a href=#2› также есть class=.cross-ссылка? - person sunn0; 26.10.2010
comment
Я хочу, чтобы все с классом «перекрестная ссылка» имели href=#2. Я не уверен, что это отвечает на ваш вопрос. - person scifirocket; 26.10.2010
comment
Можем ли мы увидеть немного HTML, пожалуйста? В противном случае просто выберите вышеуказанное решение. Имеет больше смысла. Вы даже можете пропустить $('a[href=#2]').trigger('click'); если единственная причина запуска щелчка — запустить событие «Перейти к URL-адресу» по умолчанию. - person sunn0; 26.10.2010
comment
Я все еще получаю слишком много ошибок рекурсии. Вы можете увидеть его по адресу: eataustineat.com/testfolder/index.php. - person scifirocket; 27.10.2010

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

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

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

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

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

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

#('a[href=#2 :first').click();
person sTodorov    schedule 25.10.2010
comment
hasClass - это функция jQuery, а не его класс. И это не сработает, потому что элементы еще не существуют, как указано в вопросе. - person Matthew Flaschen; 25.10.2010

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


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);
});


person Kieran    schedule 25.10.2010
comment
где open добавит элемент в dom и удалит/добавит функцию, а close удалит элемент из dom и добавит/удалит функцию onclick... - person Kieran; 25.10.2010

$('body').click(function(evt) {
    if(evt.target.nodeName === 'A' && $(evt.target).hasClass('cross-link')) {
        $('a[href=#2]').trigger('click');
    }
  });

Вы пропустили утверждение else из if-else.

person Tylor    schedule 31.05.2017