Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Цепочка фильтров по содержимому (https://javascript.ru/forum/jquery/30115-cepochka-filtrov-po-soderzhimomu.html)

glukonator 24.07.2012 18:33

Цепочка фильтров по содержимому
 
Приветствую!
В общем дело обстоит так:
Занят пользовательским скриптом. Есть элементы вида
<tr class="alliance" style="display: table-row">
	<td align="left" valign="center" height="100">
		<div class="ofblock2">
		  <b>
			Отправлено: 
			<a href="...">Отправитель</a>
		  </b>
		   (12-07-22 14:31:35)
		  <br>
		  <b>Тема:</b>
		   Общее сообщение
		  <br>
		  <b>Содержание:</b>
		  <br>
		   текст сообщения
		</div>
	</td>
	<td>
	...
	</td>
</tr>

и
<tr class="alliance" style="display: table-row">
  <td align="left" valign="center" height="100">
    <div class="ofblock2">
      <b>
        Отправлено: 
        <a href="...">Отправитель</a>
      </b>
       (12-07-24 14:49:07)
      <br>
      <b>Тема:</b>
      <b>Общее сообщение</b>
       Куплю
      <br>
      <b>Содержание:</b>
      <br>
       текст сообщения
    </div>
  </td>
  <td align="center" valign="center">
    ...
  </td>
</tr>


Их различие в наличии тега <b> для "Общее сообщение". Мне надо найти как раз это самое общее сообщение с тегом. Делаю я это так:
$('tr',$(table)).each(function(indx){
        ...
		}else if($(this).is('*:has(b):contains(Общее сообщение)')){
			$(this).addClass('alliance');
		...
	});


Только по непонятным мне причинам поиск срабатывает и на общее сообщение вне тега <b>. Объясните почему так и как будет правильно?

Nightmare 24.07.2012 18:50

$('tr b').filter(function() { return $(this).text() == 'your_message'  }).addClass('alliance');


Если я правиьно понял вопрос.

Deff 24.07.2012 19:22

$('table tr').each(function(indx){

        //...
	if($(this).find("b:contains('Общее сообщение')").length){
			$(this).addClass('alliance');
        }
		//...
	});

glukonator 24.07.2012 19:24

Спасибо, навели на мысль:
}else if($('b:contains(Общее сообщение)',$(this)).length != 0){ 
	$(this).addClass('alliance');


Так работает =)
Но хотелось бы понять почему не работал первоначальный вариант? Где там косяк?

UPD: хо-хо =) не было ответа Deff, когда свой катал) Однако почти похоже.

UPD2: возник немного офтоповый вопрос.. вот есть два варианта:
if($(this).is('*:contains(System)')){ 
	$(this).addClass('system');

	
	
if($('*:contains(System)'),$(this).length){ 
	$(this).addClass('system');


Что будет работать быстрей? Я конечно сомневаюсь что там разница будет существенная, но мне так.. для общего развития) И если можно с объяснением возникновения разницы (для понимания) :)


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