установка переменной для использования с функцией щелчка jquery

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

$('a.highslide').each(function() {
  hsGroup = $(this).attr("rel");

  if(hsGroup.length > 1){
     hsGroup = hsGroup.replace(/\s/g , "-");     
  }    

  this.onclick = function() {
    return hs.expand(this, { slideshowGroup: hsGroup });

  }
});

этот код устанавливает onclick, который запускает всплывающее окно highslide. Я добавил свойство slideshowGroup и код hsGroup над ним, который извлекает содержимое атрибута Rel для определения группы каждого из них. Проблема, как вы можете сразу увидеть, заключается в том, что содержимое hsGroup не является локальным для этой анонимной функции. Таким образом, во время выполнения его значение всегда одинаково для каждой ссылки, к которой применяется. Я просмотрел несколько примеров закрытия, но пока не смог заставить их работать в моей ситуации.

Спасибо,


person Nathan    schedule 21.10.2010    source источник
comment
РЖУ НЕ МОГУ! / facepalm. Думаю, это была одна из тех недель.   -  person Nathan    schedule 21.10.2010


Ответы (2)


Вам просто нужен var, чтобы сделать это для каждой ссылки, например:

$('a.highslide').each(function() {
  var hsGroup = $(this).attr("rel");
  //^ -- add this

  if(hsGroup.length > 1){
     hsGroup = hsGroup.replace(/\s/g , "-");     
  }    

  this.onclick = function() {
    return hs.expand(this, { slideshowGroup: hsGroup });

  }
});

Без var у вас есть одна глобальная hsGroup переменная, которая повторно используется для каждого цикла и в конечном итоге имеет то же самое последнее значение, которое использовалось при каждом щелчке.

Или просто выполните замену во время события click, например:

$('a.highslide').click(function() {
  var hsGroup = $(this).attr("rel");
  if (hsGroup.length > 1) hsGroup = hsGroup.replace(/\s/g , "-");    
  return hs.expand(this, { slideshowGroup: hsGroup });
});
person Nick Craver    schedule 21.10.2010

Это потому, что вы не объявляете hsGroup как локальный, вам не хватает var:

var hsGroup = $(this).attr("rel");

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

person Felix Kling    schedule 21.10.2010