Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как выбрать элементы в пределах конкретного блока (https://javascript.ru/forum/jquery/60829-kak-vybrat-ehlementy-v-predelakh-konkretnogo-bloka.html)

Socpost 22.01.2016 14:01

Как выбрать элементы в пределах конкретного блока
 
Здравствуйте форумчане.
Имеется следующая разметка:
<table>
<tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
</table>

И код, для сворачивания-разворачивания списка элементов:
<script>
    var news = 2; // - количество отображаемых новостей
    hidenews = "- скрыть старые новости";
    shownews = "+ показать все новости";
	
	$(".stroka").each(function (i) {   // - нумерация идентификаторов строк
     $(this).prop("id", "news" + i);
});

    $(".archive").html( shownews );
    $(".news:not(:lt("+news+"))").hide();

    $(".archive").click(function (e){
      e.preventDefault();
      if( $(".news:eq("+news+")").is(":hidden") )
      {
        $(".news:hidden").show();
        $(".archive").html( hidenews );
      }
      else
      {
        $(".news:not(:lt("+news+"))").hide();
        $(".archive").html( shownews );
      }
    });
  </script>

Все работает, но проблема в том, что таких строк с дивами, у которых одинаковые классы - несколько, потому действие скрипта применяется ко всем строкам сразу.:(
Я добавил динамическую нумерацию идентификаторов ячеек td, но как теперь реализовать, чтобы сворачивались-разворачивались дивы именно своей ячейки - не знаю.. Возможно я вообще не там копаю. Короче, нуб просит помощи)

рони 22.01.2016 14:23

Открывашка 248 спойлер для новостей
 
Socpost,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
  $(function(){
    var news = 2; // - количество отображаемых новостей
    hidenews = "- скрыть старые новости";
    shownews = "+ показать все новости";
  $(".stroka").each(function() {
    var b = $(".news", this).slice(news).hide();
    $(".archive", this).click(function(a) {
        a.preventDefault();
        a = +b.toggle().is(":hidden");
        $(this).text([hidenews, shownews][a])
    }).text(shownews)
});
});
  </script>
</head>
<body>
<table>
<tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  <a class="archive" href="#"></a>
  </td>
  </tr>
</table>

</body>
</html>

Siend 22.01.2016 14:33

Добавлю, что можно избежать использование:
a.preventDefault();

достаточно удалить атрибут href из ссылок, ссылка примет вид:
<a class="archive">

Упадет также и все оформление - подчеркивание и синий, но вообщем-то не очень понятно зачем вообще использовать <a> если затем ему отрубать обработчик)

Socpost 22.01.2016 14:39

Спасибо большое! Помогли сильно сэкономить время!:)

Socpost 22.01.2016 15:39

Н-да.. Вылез очередной косяк: оказалось что две соседние ячейки должны тоже показывать-скрывать элементы синхронно с первой. Вот, собственно, разметка:
<table>
<tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
    </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
    </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
  
  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
    </td>
  </tr>
</table>

Т.е. при нажатии ссылки в td class="stroka2", должны прятаться или появляться дивы во всех 3х ячейках..:(

рони 22.01.2016 15:55

Цитата:

Сообщение от Socpost
Т.е. при нажатии ссылки в td class="stroka2", должны прятаться или появляться дивы во всех 3х ячейках..

либо я вас не понимаю, либо строка 11 $("tr").each

Socpost 22.01.2016 16:20

Цитата:

Сообщение от рони (Сообщение 404641)
либо я вас не понимаю, либо строка 11 $("tr").each

Спасибо за ответ. Работает, но не синхронно: в первой ячейке видно заданное кол-во дивов, как и положено, а 2-ю и 3-ю прячет начисто, а должно быть как в первой.
Я же правильно заменил:
$("tr").each(function() { ?

рони 22.01.2016 16:32

Socpost,
так?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
  $(function(){
    var news = 2; // - количество отображаемых новостей
    hidenews = "- скрыть старые новости";
    shownews = "+ показать все новости";
    news++;
  $("tr").each(function(c) {
    var b = $(".news:nth-child(n+"+news+")", this).hide();
    $(".archive", this).click(function(a) {
        a.preventDefault();
        a = +b.toggle().is(":hidden");
        $(this).text([hidenews, shownews][a])
    }).text(shownews)
});
});
  </script>
</head>
<body>
<table>
<tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
    </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
    </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>

  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
    </td>
  </tr>
</table>


</body>
</html>

Socpost 22.01.2016 16:34

Цитата:

Сообщение от рони
так?

ИМЕННО! Спасибо Вам большое!:)

Socpost 25.01.2016 13:35

Подскажите, пожалуйста, почему при добавлении параметров в метод toggle (скорость анимации), текст ссылки изменяется только один раз?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
  $(function(){
    var news = 2; // - количество отображаемых новостей
    hidenews = "- скрыть\u00A0старые\u00A0новости";
    shownews = "+ показать\u00A0все\u00A0новости";
    news++;
  $("tr").each(function(c) {
    var b = $(".news:nth-child(n+"+news+")", this).hide();
    $(".archive", this).click(function(a) {
        a.preventDefault();
        a = +b.toggle(1000).is(":hidden");
        $(this).text([hidenews, shownews][a])
    }).text(shownews)
});
});
  </script>
</head>
<body>
<table>
<tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"><nobr></nobr></a>
    </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
    </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>

  </td>
  </tr>
  <tr>
<td class="stroka">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka1">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
  </td>
  <td class="stroka2">
  <div class="news">Первая новость</div>
  <div class="news">Вторая новость</div>
  <div class="news">Третья новость</div>
  <div class="news">Четвертая новость</div>
<a class="archive" href="#"></a>
    </td>
  </tr>
</table>


</body>
</html>


Часовой пояс GMT +3, время: 09:36.