Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   можно ли изменить свойства соседнего элемента?.. (https://javascript.ru/forum/events/21874-mozhno-li-izmenit-svojjstva-sosednego-ehlementa.html)

Nanto 27.09.2011 23:48

можно ли изменить свойства соседнего элемента?..
 
Нужно изменить свойства элемента, являющегося соседним по отношению к элементу вызывающему функцию...
Доступа по id нет, только по классу и элементу-инициализатору.
Чтобы понятнее...
есть набор таких конструкций:
<a href="#" class="no_text">Бла-бла</a><p class="new_text" style="display:none">-бла...</p>
<a href="#" class="no_text">Бла-бла</a><p class="new_text" style="display:none">-бла...</p>
...

По клику на конкретную ссылку, надо выводить содержимое <p>.
Если это нереально - бог с ним, могу и через селекторы пройти:
<a href="#" class="no_text" onclick="this.className='text'"></a>
.new_text{display:none;}
.text + .new_text{display:block;}

Но заковыка ещё в том, что должна быть отдельная ссылка, которая распахнёт или закроет все <p class="new_text">.
В принципе, опять-таки ничего сложного, но хотелось бы какое-то простое и элегантное решение, а не лепить отдельно this, и отдельно getElementsByClass...
P.S. Ну и понятное дело, что повторный клик должен возвращать всё на круги своя (т.е. надо ещё и классы сравнивать).

Триви 28.09.2011 00:17

Я правильно понял задачу?

<a href="#" class="no_text">Бла-бла1</a><p class="new_text" style="display:none">1-бла...</p>
<a href="#" class="no_text">Бла-бла2</a><p class="new_text" style="display:none">2-бла...</p>
<a href="#" class="no_text">Бла-бла3</a><p class="new_text" style="display:none">3-бла...</p>

<script type='text/javascript'>
(function() {
  var aArr = document.getElementsByTagName('A');
  var sum=0;
  for (var i=0; i<aArr.length; i++)  {
    aArr[i].onclick = function() {
        var p = this.nextSibling,
            vis = p.style.display;
        p.style.display = (vis=='none') ? 'block' : 'none';
    }
  }
})();
</script>

ksa 28.09.2011 11:50

Более универсальный вариант + с "общей" ссылкой. :)

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<style type="text/css">
</style>
<script type="text/javascript">
</script>
</head>
<body>
<a href="#" class="no_text_all">Бла-бла</a>
<a href="#" class="no_text">Бла-бла1</a>
<p class="new_text" style="display:none">1-бла...</p>
<a href="#" class="no_text">Бла-бла2</a>
<p class="new_text" style="display:none">2-бла...</p>
<a href="#" class="no_text">Бла-бла3</a>
<p class="new_text" style="display:none">3-бла...</p>

<script type='text/javascript'>
(function() {
	$(document).ready(function (){
		$('a.no_text').click(function (){
			$(this).next('p').show()
		})
	})
	$(document).ready(function (){
		$('a.no_text_all').click(function (){
			$(this).nextAll('p').show()
		})
	})
})();
</script>
</body>
</html>

Nanto 28.09.2011 13:08

ksa,
Да, хотел обойтись без фреймворков, но мне, с моей подготовкой наверное действительно лучше jQ заюзать...
Но тогда вопрос - в Вашем варианте нет проверки на "отображение элемента <p>"... А надо, чтобы по каждому клику открывалась или закрывалась...

ksa 28.09.2011 14:48

Цитата:

Сообщение от Nanto
чтобы по каждому клику открывалась или закрывалась

Ну это уже можно и как домашнее задание было сделать... :)

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<style type="text/css">
.new_text {
	display: none;
}
.new_text.on {
	display:block;
}
</style>
<script type="text/javascript">
</script>
</head>
<body>
<a href="#" class="no_text_all">Бла-бла</a>
<a href="#" class="no_text">Бла-бла1</a>
<p class="new_text">1-бла...</p>
<a href="#" class="no_text">Бла-бла2</a>
<p class="new_text">2-бла...</p>
<a href="#" class="no_text">Бла-бла3</a>
<p class="new_text">3-бла...</p>

<script type='text/javascript'>
(function() {
	$(document).ready(function (){
		$('a.no_text').click(function (){
			$(this).next('p').toggleClass('on')
		})
	})
	$(document).ready(function (){
		$('a.no_text_all').click(function (){
			$(this).nextAll('p').toggleClass('on')
		})
	})
})();
</script>
</body>
</html>

Nanto 28.09.2011 15:15

Спасибо! Так проще!
А то я уже начал городить:
var display = $('p.new_text').css('display');

и дальше присваивание через тернарный оператор...

ksa 28.09.2011 15:32

Nanto, и это я еще на 50-той странице учебника по тому ЖиКвери... :lol:

Nanto 28.09.2011 15:46

А мне приходится вот этим пользоваться...

ksa 28.09.2011 15:49

Nanto, так кто мешает скачать еще и учебник... :D Там прям всё подробненько расписано чего, как и куда...

Триви 28.09.2011 16:00

ksa, при всём моём уважении...
1. зачем два обработчика onload?
2. зачем он вообще, если вы помещаете скрипт после блока, с которым работаете?
3. Открыть/закрыть все <P> работает криво, потому что работает не со всеми <P>, а просто тупо меняет класс.

ksa 28.09.2011 16:12

1. в книжке такое не возбранялось :)
2. в контексте примера это безразницы
3. в контексте примера работает как нужно

ksa 28.09.2011 16:23

Триви, в свете последнего прочитаного, можно вообще вместо

.toggleClass('on')


использовать
http://jquery-docs.ru/effects/toggle/

Nanto 28.09.2011 16:57

Цитата:

Сообщение от ksa (Сообщение 128394)
(function() {
$(document).ready(function (){
$('a.no_text').click(function (){
$(this).next('p').toggleClass('on')
})
})
$(document).ready(function (){
$('a.no_text_all').click(function (){
$(this).nextAll('p').toggleClass('on')
})
})
})();

Сдаётся мне, this тут ни к чему...

ksa 28.09.2011 17:01

Цитата:

Сообщение от Nanto
Сдаётся мне, this тут ни к чему...

Вообще-то это элемент ДОМ. А раз так - к нему не применимы методы ЖиКвери...
Так вот конструкция

$(this)


это уже элемент ЖиКвери и к нему можно применять нужные методы.

P.S.
Но что мешает убрать и попробовать! :D

Nanto 28.09.2011 17:14

Это я к тому, что во второй части скрипта Вы вроде показываете все абзацы, так? Тогда причём тут указание на элемент DOM, вызвавший функцию (this)? Он просто присвоит всем соседним (по отношению к a.no_text_all) абзацам класс on... А надо по отношению ко всем ссылкам a.no_text.
P.S. Уж сменить класс всем <p> разом, я, конечно, смогу! :lol:

Триви 28.09.2011 17:17

Цитата:

Сообщение от ksa (Сообщение 128433)
Триви, в свете последнего прочитаного, можно вообще вместо

.toggleClass('on')


использовать
http://jquery-docs.ru/effects/toggle/

Это всё равно не решает п.3 ;)
Ладно, лучше поясню с помощью кода.
Поскольку автор хотел JS чистяком, то вот:

<a href="#" id="sh">Открыть все</a><hr />
<a href="#" class="no_text">Бла-бла1</a><p class="new_text" style="display:none">1-бла...</p>
<a href="#" class="no_text">Бла-бла2</a><p class="new_text" style="display:none">2-бла...</p>
<a href="#" class="no_text">Бла-бла3</a><p class="new_text" style="display:none">3-бла...</p>

<script type='text/javascript'>
(function() {
  var aArr = document.getElementsByTagName('A');
  for (var i=0; i<aArr.length; i++)  {
    aArr[i].onclick = function() {
        var p = this.nextSibling,
            vis = p.style.display;
        p.style.display = (vis=='none') ? 'block' : 'none';
    }
  }
  sh.onclick = function () {
    var vis;
    if(this.innerHTML=='Открыть все') {
      vis = 'block', this.innerHTML='Закрыть все';
    } else {
      vis = 'none', this.innerHTML='Открыть все';
    }
    var pArr = document.getElementsByTagName('P');
    for (var i=0; i<pArr.length; i++) {
      pArr[i].style.display = vis;
    }
  }
})();
</script>

Nanto 28.09.2011 17:23

ksa, кстати, а что это за конструкция такая?
.new_text.on {
display:block;
}
В смысле «.on» - чьих будет? JS, jQuery, CSS? Просто впервые встречаю... И что это означает навешивается подкласс или это новый класс получается? Или это сугубо жикверивская "примочка"? И поймёт ли её браузер с отключенным js?

Nanto 28.09.2011 17:26

Триви,
Спасибо большое, но прекратите все надо мной издеваться! :lol:
Я размышлял-размышлял, плюнул на всё и решил подключить jQuery, начал по новой перелопачивать более ранние скрипты (чтобы перевести их на jQ), а тут Вы снова выдаёте на чистом js...

yashka525 28.09.2011 20:30

Цитата:

Сообщение от Nanto
а тут Вы снова выдаёте на чистом js

Правильно делает! Native JS rules!! :D

Nanto 28.09.2011 22:36

yashka525,
Из-за 100кБ фреймворка? Или просто из-за понтов? Дык ради крути можно и на ассемблере писать, можно вообще в двоичной системе машинный код фигачить. Native code rules!!

Триви 28.09.2011 22:41

Nanto, не путайте Божий дар с яичницей..
jQ - это фреймворк, и не вместо JS, а в помощь!!!

ksa 29.09.2011 09:30

Цитата:

Сообщение от Nanto
а что это за конструкция такая?
.new_text.on { 
    display:block; 
}

Это цсс конечно.
Селектор предназначен для элемента с двумя классами одновременно

<div class='new_text on'></div>

Nanto 29.09.2011 13:03

ksa,
Спасибо, не знал! :blink:

ksa 29.09.2011 13:14

Цитата:

Сообщение от Nanto
не знал

Тогда ты вообще в самом начале пути... :D

Nanto 29.09.2011 14:21

В общем задача оказалось маленько сложнее, чем казалась в начале...
По клику на каждую ссылку, вернее на картинку с плюсиком - надо показывать скрытый текст и менять картинку с плюсика на минус, и наоборот.
А внизу страницы есть две ссылки - одна показывает все скрытые абзацы (и соответсвенно меняет все плюсы на минусы), другая скрывает...
Ну короче, чего-то навал... Вопрос - можно ли подсократить подобный код:
http://jsfiddle.net/ude9R/4/

ksa 29.09.2011 14:31

Nanto, начинай уже делать тестовый пример... Или начинаем говорить про деньги. :D

Nanto 29.09.2011 14:50

ksa,
Дык выложил же пример выше (и даже рабочий)!..

ksa 29.09.2011 14:56

Nanto, ты про ссылку?

Nanto 29.09.2011 15:17

ksa,
Ну да - кликаешь по цветному квадратику - он меняет цвет (это для примера вместо спрайта) и показывает/скрывает абзац.
У меня в рабочем шаблоне всё работает!
Но сдаётся мне, что я слегка "наговнокодил" - можно ли проще записать подобную штуку (при том же функционале).

ksa 29.09.2011 15:18

Цитата:

Сообщение от Nanto
Ну да

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

Nanto 29.09.2011 15:26

Если неудобно по другим сайтам шарить, могу сюда скопировать:
<!DOCTYPE html>
<html>
 <head>
 <style type="text/css">
.a_plus{
    height:13px;
    width:13px;
    display:inline-block;
    background-color:red;
}
.a_minus{
    height:13px;
    width:13px;
    display:inline-block;
    background:green
}
.a_hidetext{
     display:none;
     padding-left:18px;
}
.a_plus_min div{
    display:inline-block;
    width:11px;
    height:11px;
    background:red;
}
.a_minus_min div{
    display:inline-block;
    width:11px;
    height:11px;
    background:green;
}
 </style>
 <script src="http://code.jquery.com/jquery-latest.js"></script>
 <script type='text/javascript'>
(function() {
        $(document).ready(function (){
            $('div.a_plus-minus').click(function (){
                var display = $(this).nextAll('p.a_hidetext').css('display');
                if (display == 'none') {
                    $(this).nextAll('p.a_hidetext').css({'display' : 'block'});
                    $(this).removeClass('a_plus');
                    $(this).addClass('a_minus');
                } else {
                    $(this).nextAll('p.a_hidetext').css({'display' : 'none'});
                    $(this).removeClass('a_minus');
                    $(this).addClass('a_plus');
                }
            })
        })
        $(document).ready(function (){
            $('a.a_plus_min').click(function (){
                $('p.a_hidetext').css({'display' : 'block'});
                $('div.a_plus-minus').removeClass('a_plus');
                $('div.a_plus-minus').addClass('a_minus');
            })
            $('a.a_minus_min').click(function (){
                $('p.a_hidetext').css({'display' : 'none'});
                $('div.a_plus-minus').removeClass('a_minus');
                $('div.a_plus-minus').addClass('a_plus');
            })
        })
})();
 </script>
 </head>
 <body>
<table>
    <tr class="a_dnd"><td><div class="a_plus-minus a_plus"></div><a href="#">Lorem ipsum</a><p class="a_hidetext">consectetur adipisicing</p></td><td>бла</td><td>бла</td></tr>
    <tr class="a_dnd"><td><div class="a_plus-minus a_plus"></div><a href="#">Lorem ipsum</a><p class="a_hidetext">consectetur adipisicing</p></td><td>бла</td><td>бла</td></tr>
    <tr class="a_dnd"><td><div class="a_plus-minus a_plus"></div><a href="#">Lorem ipsum</a><p class="a_hidetext">consectetur adipisicing</p></td><td>бла</td><td>бла</td></tr>
    <tr class="a_dnd"><td><div class="a_plus-minus a_plus"></div><a href="#">Lorem ipsum</a><p class="a_hidetext">consectetur adipisicing</p></td><td>бла</td><td>бла</td></tr>
    <tr class="a_dnd"><td><div class="a_plus-minus a_plus"></div><a href="#">Lorem ipsum</a><p class="a_hidetext">consectetur adipisicing </p></td><td>бла</td><td>бла</td></tr>
    <tr class="a_dnd_predown">
        <td>
            <a href="#" class="a_plus_min">
                <div></div>
                <span>Открыть</span>
            </a>
                <a href="#" class="a_minus_min">
                <div></div>
                <span>Закрыть</span>
                   </a>
        </td>
            <td></td>
        <td></td>
    </tr>
</table>
 </body>
</html>

Nanto 29.09.2011 15:28

Цитата:

Сообщение от ksa (Сообщение 128706)
я по ссылкам не хожу... Гораздо приятнее смотреть код, выложеный тут...

Угу, как в воду смотрел! :lol:

ksa 29.09.2011 16:12

Nanto, например вместо анализа и смены display - воспользуйся методом
http://jquery-docs.ru/Effects/toggle/

ksa 29.09.2011 16:14

Аналогисная приблуда есть и у class
http://jquery-docs.ru/Attributes/toggleClass/

Nanto 29.09.2011 22:33

ksa,
Спасибо тебе большое (я уж на «Ты» перейду - уже порядком тесно общаемся)! Мелочь вроде - а помогает двигаться в нужном направлении. И на деньгах тебя не так сильно циклит как остальных - "Ах ёптыть, мы яваскрипт целых два года учили! пусть теперь нам за каждую подсказку платят!"
Кстати, также огромное спасибо и Триви - в этом проекте решил использовать jQ, но Ваши примеры мне также ещё пригодятся! Я вообще-то все страницы с моими "хотелками" на жёсткий сохраняю (на всякий случай)!

ksa 30.09.2011 09:47

Цитата:

Сообщение от Nanto
И на деньгах тебя не так сильно циклит как остальных

Тебе просто повезло, потому как я ищу на ком потренироваться в ЖиКвери... :D Вот книжку по нему дочитаю, наловчусь - тогда только за бабосы. :lol:


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