JQuery: доступ к оригинальному объекту jquery внутри каждого - PullRequest
2 голосов
/ 22 мая 2009

Я пытаюсь реализовать поведение переключателя HTML на наборе DIV в JQuery. Я хочу удалить класс "set" из всех элементов, а затем использовать addClass (), чтобы заново установить (один) элемент, по которому щелкнули:

$(".button").each(function() {
  $(this).click(function(){
    // what goes here to call removeClass() on *all* the elements?
    $(this).addClass("set");
  });
});

Я хочу вызвать removeClass () для всех элементов - в данном случае $ (". Button"), но я не могу явно ссылаться на $ (". Button").

Я не могу просто вызвать $ (". Button"). RemoveClass ("set") вне цикла, поскольку это является частью более крупной программы, и поведение внутри цикла each () может быть изменено другими параметрами.

Есть ли способ получить доступ к полному набору элементов изнутри или передать их как переменную? Или есть другой способ решения проблемы?

Ответы [ 7 ]

3 голосов
/ 22 мая 2009

Возможно, вы ищете новую селекторную функцию , поскольку вы создаете плагин:

jQuery.fn.test = function() {
    console.log(this.selector); // .button
};

$('.button').test();
2 голосов
/ 22 мая 2009

Если вы не можете жестко закодировать селектор во внутренних функциях, jQuery может фактически вернуть строку, использованную в качестве селектора в исходном вызове. См. $ ('. Bla'). Селектор

Это было добавлено только в более новой версии.

0 голосов
/ 22 мая 2009

Все еще не уверены, почему вы не можете ссылаться на $ ('. Button') из внутренней функции, но можете ли вы вместо этого захватить ссылки в свободной переменной?

var buttons = $(".button");
buttons.each(function() {
  $(this).click(function(){
    // what goes here to call removeClass() on *all* the elements?
    buttons.removeClass('set');
    $(this).addClass("set");
  });
});
0 голосов
/ 22 мая 2009

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

Интересно, потому что это в дорожной карте под radioClass ()

То, что вы хотите, это siblings , и не используйте каждый из них для установки события щелчка.

$(".button").click(function() {
  $(this).addClass('set');
  $(this).siblings('.button').removeClass('set');
});

См. Этот пример для вышеуказанного в действии:

http://jsbin.com/ewiqe

0 голосов
/ 22 мая 2009

просто изменить:

$(".button").each(function() {
  $(this).click(function(){
    $('.button').removeClass("set");
    $(this).addClass("set");
  });
});

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

0 голосов
/ 22 мая 2009

Вы говорите "но я не могу явно указать $ (". Button ")." Почему это так?

$(".button").each(function() {
  $(this).click(function(){
    $('.button').removeClass('set'); // this should do it
    $(this).addClass("set");
  });
});
0 голосов
/ 22 мая 2009

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

Внутри вашего цикла вы можете получить все что угодно с помощью jquery $ ("div") // внутри цикла

...