Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2016, 05:35   #1
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию Показать только те строки таблицы, ячейки которых не пустые

Здравствуйте
Есть таблица, в первом столбце есть текст с наименованием, во второй столбец динамически добавляется/удаляется текст. Изначально строки таблицы скрыты.
Нужно - показывать только те строки, в которых есть содержимое ячеек второго столбца. И не показывать строки, если ячейки второго столбцы пустые.
Код, который я привел, с поставленной задачей справляется во всех браузерах (которые у меня есть), кроме Мозиллы (49.0.1). . В Мозилле задержка, примерно около секунды, перед показом таблицы
Можно как то оптимизировать код?
(Этот пример не нужно проверять на быстродействие в браузере, реально в таблице более тысячи строк)
Код HTML:
<style type="text/css">
  .hid {display:none;}
</style>
<input type="button" value="Вставить текст" id="send">
<table class="hid" id="tab_decode" border="1" cellspacing="0" cellpadding="0">
  <tr class="hid">
    <td>наименование 1</td>
    <td id="d1" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 2</td>
    <td id="d2" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 3</td>
    <td id="d3" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 4</td>
    <td id="d4" class="decode"></td>
  </tr>
</table>
Код:
<script type="text/javascript">
$('#send').click(function(){
	$('#d1, #d3, #d4').text('текст');

	// показать только те строки, в которых ячейки .decode не пустые
	// В Мозилле задержка, примерно около секунды,  перед показом таблицы!!
	$('.hid, #tab_decode').hide().filter(function(){
		return $('.decode',this).text()
	}).show();
});
</script>
sashgera вне форума Ответить с цитированием
Старый 11.10.2016, 06:49   #2
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Раз у вас много строк и вылезает производительность, то советую переписать на нативном JS.
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 11.10.2016, 07:16   #3
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

Fenex, но проблема с производительностью почему-то только в Мозилле, в других браузерах все нормально, включая IE
sashgera вне форума Ответить с цитированием
Старый 11.10.2016, 07:17   #4
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Возможно у вас получается неоптимальная выборка элементов, которая гоняется много раз в циклах.

Уберите у самой таблицы класс class="hid"(она и так не будет показываться при скрытых ячейках) и попробуйте этот код:
Код:
<script type="text/javascript">
$('#send').click(function(){
	$('#d1, #d3, #d4').text('текст');

	$('td.decode:not(td:empty)').parent().toggleClass('hid');
});
</script>
Поставьте .removeClass('hid') тк .toggleClass('hid') будет переключать туда-сюда при клике на кнопку

Вообще при работе со строками таблиц их лучше обрамлять в <tbody></tbody> и скрывать/открывать их - работает значительно быстрее, особенно если у вас группы строк.

Последний раз редактировалось predefined; 11.10.2016 в 07:27.
predefined вне форума Ответить с цитированием
Старый 11.10.2016, 17:34   #5
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

predefined, вот новый пример с двумя кнопками для вставки текста
Строки, в которых ячейки .decode пустые, должны быть всегда скрыты
По клику первой кнопки - текст вставляется в 1 и 4 строку, 2 и 3 строки будут скрыты
По клику второй кнопки – весь текст из ячеек .decode удаляется и вставляется новый текст во 2 и 3 строки, но здесь возникает проблема – 1 и 4 строки не скрываются.
Вот пример
Код HTML:
<style type="text/css">
  .hid {display:none;}
</style>
<input type="button" value="Вставить текст в 1 и 4 строки" id="texl">
<input type="button" value="Вставить текст в 2 и 3 строки" id="tex2">
<table id="tab_decode" border="1" cellspacing="0" cellpadding="0">
  <tr class="hid">
    <td>наименование 1</td>
    <td id="d1" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 2</td>
    <td id="d2" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 3</td>
    <td id="d3" class="decode"></td>
  </tr>
  <tr class="hid">
    <td>наименование 4</td>
    <td id="d4" class="decode"></td>
  </tr>
</table>
Код:
<script type="text/javascript">
$('#texl').click(function(){
	del();
	$('#d1, #d4').text('текст в 1 и 4 стр');
	send();
});	
$('#tex2').click(function(){
	del();
	$('#d2, #d3').text('текст в 2 и 3 стр');
	send();
});	
function del(){
	$('.decode').empty(); // удаление содержимого ячеек .decode		
};
function send(){
	// показать только те строки, в которых ячейки .decode не пустые
	$('td.decode:not(td:empty)').parent().removeClass('hid');
};
</script>
sashgera вне форума Ответить с цитированием
Старый 11.10.2016, 19:56   #6
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

predefined, немного изменив скрытие/показ таблицы, все стало OK
Раньше было – при загрузке страницы сама таблица (table) и строки (tr) были скрыты (наверное поэтому таблица открывалась с задержкой).
Теперь сделал так - при загрузке страницы скрыта только таблица.
код в примере обновил
sashgera вне форума Ответить с цитированием
Старый 12.10.2016, 06:12   #7
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от sashgera Посмотреть сообщение
По клику второй кнопки – весь текст из ячеек .decode удаляется и вставляется новый текст во 2 и 3 строки, но здесь возникает проблема – 1 и 4 строки не скрываются.
Конечно, им же класс hid никто назад не восстанавливает. Из условия задачи это было не очевидно и я упустил.
Если всё работает - отлично. Если будет тормозить - вот самый быстрый вариант прохода по ячейкам таблицы:
Код:
function send(){
	// показать только те строки, в которых ячейки .decode не пустые
	$('.decode').each( function(i, dom_elem) {	// По всем <td class='decode'>
	  var elem = $(dom_elem);					// DOM-элемент -> объект jQuery
	  if (elem.text() =='')  elem.parent().addClass('hid');
	  else elem.parent().removeClass('hid');
	  });
};
А если у ваших <tr class="hid"> не будет других классов кроме hid, то можно внутри цикла на нативном яваскрипте сделать проверку. Теоретически, должно ускорить работу с таблицей:
Код:
function send(){
	// показать только те строки, в которых ячейки .decode не пустые
	$('.decode').each( function(i, dom_elem) {	// По всем <td class='decode'>
	  dom_elem.parentElement.className = dom_elem.innerHTML ==''  ?'hid' :'';
	  });
};

Последний раз редактировалось predefined; 12.10.2016 в 06:35.
predefined вне форума Ответить с цитированием
Старый 12.10.2016, 06:36   #8
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

predefined, большое спасибо!
sashgera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напечатать только те строки из файла, в которых есть буква s. IHML Помощь студентам 0 14.03.2016 01:05
DBGridEh: показать только нужные строки new player Компоненты Delphi 10 07.10.2010 22:40
Как скопировать данные из таблицы, включающей пустые строки yursanch Microsoft Office Excel 5 22.09.2010 16:07
после добавления таблицы в конце файла появляются пустые строки OLEG'arh Microsoft Office Word 4 17.09.2010 16:11
подсчитать кол-во строк в которых содержаться пустые ячейки mars56 Microsoft Office Excel 4 24.02.2010 11:17