Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2019, 11:13
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

Функция click в цикле
Здравствуйте друзья. Помогите пожалуйста разобраться. У нас есть скрипт.
<script type="text/javascript">
$('.trigger').click(function() {
   $('.st').toggle();
});
</script>

При нажатии на элемент с классом trigger
<input class="trigger">

У tbody
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

Меняется style на
<tbody class="st" style="display: table-row-group;">ТЕКСТ...</tbody>

Проблема заключается в том, что этих tbody много
<input class="trigger">
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

<input class="trigger">
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

<input class="trigger">
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

Допустим при нажатии на первый элемент с классом trigger, мы получаем
<input class="trigger">
<tbody class="st" style="display: table-row-group;">ТЕКСТ...</tbody>

<input class="trigger">
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

<input class="trigger">
<tbody class="st" style="display: none;">ТЕКСТ...</tbody>

То есть меняется style в первом tbody, но если нажать на второй элемент в классом trigger ничего не происходит, пока снова не нажмем на первый элемент, чтобы изменился второй. Как сделать чтобы скрипт работал для каждого элемента с классом trigger и tbody не зависели друг от друга. Нажали на первый элемент получили style="display: table-row-group;", нажали на третий элемент получили style="display: table-row-group;" и так далее.
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2019, 11:26
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от denis_kontarev
То есть меняется style в первом tbody, но если нажать на второй элемент в классом trigger ничего не происходит, пока снова не нажмем на первый элемент, чтобы изменился второй.
У вас код отличается от того, что вы продемонстрировали?
Текущий код должен работать следующим образом:
При нажатии на любой элемент с классом .trigger изменить видимость на противоположную для всех элементов с классом .st .

<table> не может иметь прямых потомков с тэгом <input>.


<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<input class="trigger" data-target="st-1">
<div class="st" style="display: none;" data-name="st-1">ТЕКСТ...</div>

<input class="trigger" data-target="st-2">
<div class="st" style="display: none;" data-name="st-2">ТЕКСТ...</div>

<input class="trigger" data-target="st-3">
<div class="st" style="display: none;" data-name="st-3">ТЕКСТ...</div>

<script>
$('[data-target].trigger').click(function(){
    $('[data-name="'+this.dataset.target+'"]').toggle();
});
</script>
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2019, 11:37
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

Полная структура html
Соглашусь. Привел не полный код. Вот полная структура. Нам необходимо менять style в tbody при нажатии на class="trigger" для каждого tbody. На каждой странице разное количество <div class="spoiler">, бывает 10, а бывает 50. Отображение в цикле идет. При нажатии на <input class="trigger"> для всех элементов с классом st видимость менять не нужно. Необходимо поменять видимость при нажатии на <input class="trigger"> именно для того номера div, где это произошло, чтоб они друг от друга не зависели.
<div class="spoiler">
 <input class="trigger">
  <table>
   <tbody class="st" style="display: none;">ТЕКСТ...</tbody>
     </table>
       </div>

<div class="spoiler">
 <input class="trigger">
  <table>
   <tbody class="st" style="display: none;">ТЕКСТ...</tbody>
     </table>
       </div>

<div class="spoiler">
 <input class="trigger">
  <table>
   <tbody class="st" style="display: none;">ТЕКСТ...</tbody>
     </table>
       </div>

Последний раз редактировалось denis_kontarev, 13.02.2019 в 11:46.
Ответить с цитированием
  #4 (permalink)  
Старый 13.02.2019, 11:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$('.trigger').click(function() {
   $(this).next().css({display: здесь можно организовать скрыть/закрыть, это нужно?});
});
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2019, 12:10
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

А можно реализовать с .toggle();
Сообщение от laimas Посмотреть сообщение
$('.trigger').click(function() {
   $(this).next().css({display: здесь можно организовать скрыть/закрыть, это нужно?});
});
А можно ли это как то реализовать с .toggle(); что при повторном нажатии на элемент с классом trigger, менялось допустим с невидимого на видимый и обратно с видимого на невидимый.
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2019, 12:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от denis_kontarev
менялось допустим с невидимого на видимый и обратно с видимого на невидимый.
Ну если бы у вас была задача определить display как block/none, то есть .slideToggle(), но у вас то не block нужно задавать, а table-row-group.

В общем это ведь не сложно, определите .data({mode: 0}) для кнопок, а в обработчике:

$('.trigger').click(function() {
    var o = $(this), d = o.data('mode') ^ 1; 
    o.data({mode: d}).next().css({display: ['none','table-row-group'][d]});
});

и будет то же самое, но с другими стилями.

<style>
.box {
    display: none;
    width: 50px;
    height: 50px;
    background: #000;
}
</style>
<button data-mode="0">Show/Hide</button>
<div class="box"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$('[data-mode]').click(function() {
    var o = $(this), d = o.data('mode') ^ 1;
    o.data({mode: d}).next().css({display: ['none', 'block'][d]})
})
</script>

Последний раз редактировалось laimas, 13.02.2019 в 12:50.
Ответить с цитированием
  #7 (permalink)  
Старый 13.02.2019, 12:56
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

laimas благодарю за ответ, дома попробую реализовать и сообщу вам как получилось
Ответить с цитированием
  #8 (permalink)  
Старый 14.02.2019, 09:08
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

Спасибо за отклик
Сообщение от laimas Посмотреть сообщение
Ну если бы у вас была задача определить display как block/none, то есть .slideToggle(), но у вас то не block нужно задавать, а table-row-group.

В общем это ведь не сложно, определите .data({mode: 0}) для кнопок, а в обработчике:

$('.trigger').click(function() {
    var o = $(this), d = o.data('mode') ^ 1; 
    o.data({mode: d}).next().css({display: ['none','table-row-group'][d]});
});

и будет то же самое, но с другими стилями.

<style>
.box {
    display: none;
    width: 50px;
    height: 50px;
    background: #000;
}
</style>
<button data-mode="0">Show/Hide</button>
<div class="box"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$('[data-mode]').click(function() {
    var o = $(this), d = o.data('mode') ^ 1;
    o.data({mode: d}).next().css({display: ['none', 'block'][d]})
})
</script>
К сожалению не тот функционал Все работает замечательно, но только для div, а нужно строго чтоб менялся стиль в tbody, скорей всего это из за .next().css так как переходит на след элемент. А tbody элементов через 3-4

Последний раз редактировалось denis_kontarev, 14.02.2019 в 09:13.
Ответить с цитированием
  #9 (permalink)  
Старый 14.02.2019, 10:09
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от denis_kontarev
К сожалению не тот функционал
Функционал который и требуется, а вот поиск нужного, так как вы показываете и описывается на это и ... Укажите нужное в таблице, в коде ее возвращает .next() (если конечно структура такая как ранее была показана):

o.data({mode: d}).next().find('СЕЛЕКТОР НУЖНОГО').css({display: ['none', 'block'][d]})

Последний раз редактировалось laimas, 14.02.2019 в 10:14.
Ответить с цитированием
  #10 (permalink)  
Старый 14.02.2019, 11:53
Аспирант
Отправить личное сообщение для denis_kontarev Посмотреть профиль Найти все сообщения от denis_kontarev
 
Регистрация: 01.04.2018
Сообщений: 46

Сообщение от laimas Посмотреть сообщение
Функционал который и требуется, а вот поиск нужного, так как вы показываете и описывается на это и ... Укажите нужное в таблице, в коде ее возвращает .next() (если конечно структура такая как ранее была показана):

o.data({mode: d}).next().find('СЕЛЕКТОР НУЖНОГО').css({display: ['none', 'block'][d]})
О дааа! Спасибо за пояснение! Работает как по часам! Огромное вам спасибо!!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не правильно применяется функция в цикле dand1 Events/DOM/Window 2 04.06.2014 06:53
Функция или метод click() jsjob Общие вопросы Javascript 8 15.01.2013 01:19
Как сделать чтоб функция выволнялась по click один раз или просто выполнялась? TaH4uk.pro jQuery 1 06.12.2012 22:41
Jquery функция в цикле rostrid Общие вопросы Javascript 2 22.02.2011 21:47
Привязка события click в цикле к эелементц craz Events/DOM/Window 8 14.11.2010 12:28