jQuery перебирает функцию

Довольно новичок в jquery и небольшая проблема с написанной мной функцией, очень похожей на эта проблема, и если что-то происходит, то, по-видимому, у меня проблема с закрытием. Как сказал Питер Бейли в вышеупомянутой теме, происходит следующее:

  1. Перебрать некоторые значения
  2. Определить / назначить функцию в этой итерации, которая использует повторяющиеся переменные
  3. Вы узнаете, что каждая функция использует только значения с последней итерации.
  4. Какого черта?

Это мой код:

var pages=['home', 'about', 'events', 'info', 'qa', 'photos', 'contact'];

for (i in pages) {

    $link='"'+"[href$='gaction.php?page="+(pages[i])+"']"+'"';
    $source="/images/"+(pages[i])+".png";

    $($link).hoverIntent(function() {
        $('#logo_text').stop(true, true).fadeOut(
        0,
        function() {
            $('#logo_text').attr('src', $source).fadeIn('slow'); // swaps logo
        });
    }, function() {
        $('#logo_text').stop(true, true).pause(300).fadeOut(
        0,
        function () {
            $('#logo_text').attr('src', '/images/name.png').fadeIn('slow'); //swaps back
        });
    });
}

Я знаю, что определение $ link довольно запутанное, но этот бит работает.

Функция предназначена для замены изображения в #logo_text на изображение в зависимости от ссылки, на которую наведен курсор, но к ее концу каждая ссылка меняет изображение на «контактное» (последнее).

Не совсем понял, как исправить это из другого потока, поэтому, если кто-то может помочь, это было бы здорово!


person Mike    schedule 30.01.2010    source источник


Ответы (1)


Вы можете просто использовать оператор jQuery.each, и по самой его структуре создается замыкание. Затем обязательно объявите переменные с var, и все будет готово:

var pages=['home', 'about', 'events', 'info', 'qa', 'photos', 'contact'];

$.each( pages, function(){
  var $link='"'+"[href$='gaction.php?page="+ this +"']"+'"';
  var $source="/images/"+ this +".png";

  ... rest of function untouched

});

Есть несколько способов переписать функцию, но, честно говоря, если ваш работает на вас (селекторы), то все в порядке. Только вместо использования fadeOut(0, function ...) просто используйте hide().attr('src', $source ).fadeIn('slow')

person Doug Neiner    schedule 30.01.2010
comment
Вы уверены в этом? Разве у вас нет проблемы с тем, что внутренние функции на самом деле не создаются до тех пор, пока не будет запущен обратный вызов hoverIntent? - person Bruce; 30.01.2010
comment
Однако у меня все еще был pages(i) вместо this, поэтому спасибо, что заставили меня перечитать мою функцию :) - person Doug Neiner; 30.01.2010