Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Сложные селекторы (https://javascript.ru/forum/jquery/6568-slozhnye-selektory.html)

AlMironoff 06.12.2009 04:16

Сложные селекторы
 
Такая вот конструкция:

<div class="parent">
       <div class="child-lev-1">
      		<a href="#"><div class="child-lev-2"></div></a>
       </div>
       <div class="child-lev-1-1">
                <a href="#">Link</a>
       </div>
</div>


Такой код:

$(".parent div").hover(function() {
      $(как здесь определить "child-lev-2"?).addClass("hvr");


Т.е. - как выбрать именно этот (.child-lev-2), очень нужный элемент?
P.S. - таких конструкций на странице очень много, с id не получается...

Tim 06.12.2009 07:11

xPath вам в руки http://www.rsdn.ru/article/inet/jQuery.xml#E4ZAE

хотя возможно я поторопился, должно проще делаться, просто я jQuery мало общаюсь. Но всё равно ссылку посмотрите там много полезных примеров.

colonel 06.12.2009 08:13

Вот так должно работать:
$('div[class="child-lev-2"]').addClass("hvr")

с id - тоже самое:
$('div[id="child-lev-2"]').addClass("hvr")

AlMironoff 06.12.2009 11:34

[quote=colonel;37277]Вот так должно работать:
$('div[class="child-lev-2"]').addClass("hvr")

Не работает. вернее работает, но неправильно - выбирает ВСЕ элементы class="child-lev-2" на странице. а нужен только один, который находится в том-же "parent"-элементе... поэтому же я и написал сначала
$(".parent div").hover(function() {
- чтобы функция реагировала только на элементы, вложенные в парент.

AlMironoff 06.12.2009 11:44

Цитата:

Сообщение от Tim (Сообщение 37276)
xPath вам в руки http://www.rsdn.ru/article/inet/jQuery.xml#E4ZAE

хотя возможно я поторопился, должно проще делаться, просто я jQuery мало общаюсь. Но всё равно ссылку посмотрите там много полезных примеров.

Примеров много, спасибо, только вот все не то...

$(".parent div").hover(function() {
	$(this).addClass("hvr");	}

работает, но недостаточно правильно. не отрабатывает добавление класса к "child-lev-2", если срабатывает на "child-lev-1-1".

micscr 06.12.2009 12:06

Пробуй так:
$(".parent div").hover(
    function() 
    {
        $(".child-lev-2", this).addClass("hvr") 
    }
);


P.S. У меня работает - может и то что ты хочешь.

Urfin 06.12.2009 14:37

$(".parent div").hover(
function() {
     $(this).find(".child-lev-2").addClass("hvr");
},
function(){
    $(this).find(".child-lev-2").removeClass("hvr");
}
);

AlMironoff 07.12.2009 13:16

Micscr, Urfin - огромное спасибо, все Ваши предложенные варианты - работают. Именно то, что надо.

rozmath 20.05.2013 13:45

Помогите побраться к елементу через jQuery
 
Привет всем!
Есть система переписки на php + mySql + jQuery
Проблема вот в чем:
Нужно реализовать клик мышки на комментарии.
Комментарии находятся в такой иерархии:

<div class="form_field_center" id="message_list">
	<div id="newComment"></div>
	<div id="comment_list">
          //Сообщение читаются из базы и вставляются сюда
        </div>
</div>


Сообщения читаются из базы в файле .рhp и возвращаются благодаря функции на AJAX
foreach($comments as $c)
	echo '<div>'.$c->markup_read().'</div>';


$('#comment_list').append(html);


В свою очередь, существует класс сообщений с методом markup_read, что возвращает HTML разметку сообщение с соответствующими классами.
public function markup_read(){
		$this->data['date_time'] = strtotime($this->data['date_time']);
		
		return '<div class="comment" id='.$this->data['id'].'>
						<div class="avatar"></div>
						<div class="delete" id='.$this->data['id'].'></div>
						<div class="edit" 	id='.$this->data['id'].'></div>
						<div class="author">'.$this->data['author'].' ᐅ '.$this->data['recipient'].'</div>
						<div class="date" title="Added at '.date('H:i \o\n d M Y',$this->data['date_time']).'">'.date('d/m/Y H:i:s',$this->data['date_time']).'</div>
						<p>'.$this->data['message'].'</p>
						<div>'.$this->data['id'].'</div>
						</div>';
	}


Нужно реализовать обработку клиак по разметке сообщение - тоесть по классу comment, delete, edit ...
Как добраться до класса comment? Помогите, пожалуйста. Спасибо.

animhotep 20.05.2013 13:54

Цитата:

Сообщение от rozmath
Как добраться до класса comment?

$('.comment')

colonel 20.05.2013 13:56

Цитата:

Сообщение от rozmath (Сообщение 251622)
Привет всем!
Есть система переписки на php + mySql + jQuery
Проблема вот в чем:
Нужно реализовать клик мышки на комментарии.
Комментарии находятся в такой иерархии:

<div class="form_field_center" id="message_list">
	<div id="newComment"></div>
	<div id="comment_list">
          //Сообщение читаются из базы и вставляются сюда
        </div>
</div>


Сообщения читаются из базы в файле .рhp и возвращаются благодаря функции на AJAX
foreach($comments as $c)
	echo '<div>'.$c->markup_read().'</div>';


$('#comment_list').append(html);


В свою очередь, существует класс сообщений с методом markup_read, что возвращает HTML разметку сообщение с соответствующими классами.
public function markup_read(){
		$this->data['date_time'] = strtotime($this->data['date_time']);
		
		return '<div class="comment" id='.$this->data['id'].'>
						<div class="avatar"></div>
						<div class="delete" id='.$this->data['id'].'></div>
						<div class="edit" 	id='.$this->data['id'].'></div>
						<div class="author">'.$this->data['author'].' ᐅ '.$this->data['recipient'].'</div>
						<div class="date" title="Added at '.date('H:i \o\n d M Y',$this->data['date_time']).'">'.date('d/m/Y H:i:s',$this->data['date_time']).'</div>
						<p>'.$this->data['message'].'</p>
						<div>'.$this->data['id'].'</div>
						</div>';
	}


Нужно реализовать обработку клиак по разметке сообщение - тоесть по классу comment, delete, edit ...
Как добраться до класса comment? Помогите, пожалуйста. Спасибо.


Если правильно понял, то можно так:
$('#comment_list')
   .on('click', '.comment', fucntion(){})
   .on('click', '.delete', fucntion(){})
   .on('click', '.edit', fucntion(){});

rozmath 20.05.2013 14:05

Сначала так и было, пока новидомлення генерировались на странице. Но теперь они генерируются в файле script.js и отправляются после $('#comment_list').append (html)
Если открыть источник страницы, сообщений div нет.
Код:

<div class="form_field_center" id="message_list">
        <div id="newComment"></div>
        <div id="comment_list"></div>
</div>


colonel 20.05.2013 14:11

Цитата:

Сообщение от rozmath (Сообщение 251634)
Сначала так и было, пока новидомлення генерировались на странице. Но теперь они генерируются в файле script.js и отправляются после $('#comment_list').append (html)
Если открыть источник страницы, сообщений div нет.
Код:

<div class="form_field_center" id="message_list">
        <div id="newComment"></div>
        <div id="comment_list"></div>
</div>



Можно попробовать тогда так:
$('#comment_list')
   .append(html)
   .find('.comment').on('click', fucntion(){}).end()
   .find('.delete').on('click', fucntion(){}).end()
   .find('.edit').on('click', fucntion(){});


либо так:
var commentList = function(){return $('#comment_list');};
commentList
   .append(html)
   .find('.comment').on('click', fucntion(){}).end()
   .find('.delete').on('click', fucntion(){}).end()
   .find('.edit').on('click', fucntion(){});


Соотв. код этот ставить после загрузки Вашего "script.js".

На самом деле способов множество может быть ...

rozmath 20.05.2013 14:29

Опять не работает. Перепробовал все ваши варианты а также вводил свои правки - ни один не заработал.
Возможно нужно грузить сообщения не в файле script.js?

colonel 20.05.2013 14:38

Цитата:

Сообщение от rozmath (Сообщение 251651)
Опять не работает. Перепробовал все ваши варианты а также вводил свои правки - ни один не заработал.
Возможно нужно грузить сообщения не в файле script.js?

Хм ... Ну, нужно просто тогда смотреть в консоли - что приходит вообще ... Ну и пробовать результаты ... И, в зависимости от этого двигаться дальше ...

Как-то так:
console.group('Test #comment_list');
   console.log($('#comment_list'));
   console.log(html);
$('#comment_list').append(html);
   console.log($('#comment_list'));
   console.log($('#comment_list').find('.comment'));
   console.log($('#comment_list').find('.delete'));
   console.log($('#comment_list').find('.edit'));
console.groupEnd();


Ну и соотв. заменяя $('#comment_list') на те варианты, которые приводил выше.

rozmath 20.05.2013 14:45

Если использовать строку при нажатии на comment_list
var htmlStr = $('#comment_list').html();

получим всю историю переписки строкой.
Но как получить ID сообщения на который наведен курсор и щелчке на нем?

colonel 20.05.2013 14:56

Цитата:

Сообщение от rozmath (Сообщение 251657)
Если использовать строку при нажатии на comment_list
var htmlStr = $('#comment_list').html();

получим всю историю переписки строкой.
Но как получить ID сообщения на который наведен курсор и щелчке на нем?

Легко:
var htmlStr  = $('#comment_list').html();
var commentList = $(htmlStr);
commentList
   .find('.comment').on('click', fucntion(){var t = $(this); var id = t.prop('id');}).end()
   .find('.delete').on('click', fucntion(){var t = $(this); var id = t.prop('id');}).end()
   .find('.edit').on('click', fucntion(){var t = $(this); var id = t.prop('id');});

rozmath 20.05.2013 15:33

var commentList = $(htmlStr);

при клике на comment_list возвращает массив типа [object Object]

rozmath 20.05.2013 15:53

Вот как выглядят два сообщения при проверке элементов:

Вот html строка етих сообщений:

Однако при просмотре источника страницы наблюдаю следующее:

rozmath 20.05.2013 15:58

Консоль выдала:
</div> has no method 'find'


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