Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перемещение строк таблицы в Firefox (https://javascript.ru/forum/jquery/2748-peremeshhenie-strok-tablicy-v-firefox.html)

barcelona 06.02.2009 17:20

Перемещение строк таблицы в Firefox
 
Здравствуйте!
В моей таблице содержаться checkbox-ы, в которых пользователь может ставить галочки и выбирать порядковые номера строчек. Далее при нажатии кнопки происходит сортировка строк таблицы с помощью jQuery. В Opera всё работает, в Firefox - нет. Вся страница исчезает, остаётся один checkbox, и страница "висит".
//Нужно отсортировать строки таблицы согласно seq
//Выбираем все отмеченные checkbox-ы, перемещать будем только эти строки
 var trs = Array();
 var i = 1;
$("input[type='checkbox'][name*='mod_']").each(function() {
   	if ($(this).attr("checked")) {
   	 //Если checkbox с таким индексом отмечен, возможно, придётся изменить порядок
   	 //i - порядковый номер строки в данный момент, (seq-1)
   	 var tr = $("table#modules tr:eq(" + i + ")");
   	 var seq = $("select[name*='seq']:eq(" + (i - 1) + ")").val();
   	if ((i-1) != seq) {
   		trs[seq-1] = tr;
   	}
      }
      i ++;
});

trs.sort();
 for (var seq = 0; seq < trs.length; seq ++) {
	var tr = trs[seq];
       tr.insertBefore($("table#modules tr:eq(" + (seq+1) + ")"));
}

Всё дело в предпоследней строчке. Если я вместо перемещаемого tr ставлю html-код - всё работает. Если выше вместо
var tr = $("table#modules tr:eq(" + i + ")");

я ставлю
var tr = $("table#modules tr:eq(" + i + ") td:eq(1) select");

(просто для примера) - всё работает, селект "переезжает" куда надо. А вот чтобы вся строчка - нет.

x-yuri 08.02.2009 03:57

приведи код полноценной странички (http://javascript.ru/paste), чтобы можно было скопировать и посмотреть, в чем проблема

barcelona 09.02.2009 17:37

Всё, я разобрался. Дело было в том, что в строчке стояло
<script></script>
. Убрал - заработало. Конечно, хотелось бы обойти это, но...

x-yuri 09.02.2009 18:03

[telepat mode]
'<script><'+'/script>'
[/telepat mode]

barcelona 10.02.2009 10:21

x-yuri, скажите пожалуйста поподробнее, в чём фокус? Я вывожу строки таблицы следующим образом:
<tr>
  <td>
	<input style="width:18%" type="checkbox" name="<?php echo "mod_".$mm->getIdModule() ?>" checked value="1" /><?php echo $mm->getName(); ?>
  </td>
  <td><?php echo '<script>drawModuleSeq('.$countM.')</script>'; ?></td>
  <td><?php echo '<script>drawModulePlace('.$mm->place.')</script>'; ?></td>
</tr>

x-yuri 10.02.2009 17:17

barcelona, не угадал. Можешь выложить страницу полностью, чтобы можно было самому попробовать? (сюда)

barcelona 10.02.2009 17:47

x-yuri, я загрузил "Код 49919144", адрес "http://javascript.ru/paste/49919144".
В начале подключается jquery. Этот код рабочий. А вот здесь - "http://javascript.ru/paste/4991962c" нерабочий. Разница - только в наличии тегов "script" во втором столбце каждой строчки. Версия Firefox - 3.0.3

Kolyaj 10.02.2009 18:51

barcelona,
в чем великий смысл делать ссылки не кликабельными? Вас прет выделение-копирование-новая_вкладка-вставка-ентер?

barcelona 11.02.2009 10:39

Kolyaj, я новичок на форуме. Исправляюсь:
http://javascript.ru/paste/49919144 - рабочий код.
http://javascript.ru/paste/4991962c - нерабочий.

x-yuri 12.02.2009 16:29

все-таки я был прав, у тебя в скрипте были обнаружены незакрытые тэги (</option>, </select>)
это быть не должно (http://www.w3.org/TR/html401/interac...ml#edef-SCRIPT -> http://www.w3.org/TR/html401/sgml/dtd.html#Script -> http://www.w3.org/TR/html401/types.html#type-cdata):
Цитата:

Although the STYLE and SCRIPT elements use CDATA for their data model, for these elements, CDATA must be handled differently by user agents. Markup and entities must be treated as raw text and passed to the application as is. The first occurrence of the character sequence "</" (end-tag open delimiter) is treated as terminating the end of the element's content. In valid documents, this would be the end tag for the element
соответственно можно писать '</option>' -> '<'+'/option>' или '<\/option>'

p.s. советую пользоваться каким-нибудь валидатором. Например, к firefox есть плагин HtmlValidator, Опера позаволяет отправлять текущую страницу на валидации или http://validator.w3.org/. Ты бы сам тогда смог решить свою проблему ;-)

p.p.s. обычно приемлемо не использовать document.write (т.е. вносить изменения по onload), думаю

barcelona 12.02.2009 18:35

Профессор, я глубоко признателен Вам за помощь. Вы не могли бы объяснить мне ещё одну деталь? Код, генерирующий список:
function drawModuleSeq(count, index, nameMod) {
            document.write("<select name=\"" + nameMod + "\">"); 
            for (i = 0; i < count; i++) {
              add = "";
              if (i == index) add = " selected=\"selected\"";
              document.write("<option value=\""+(i+1)+"\""+add+">"+(i+1)+"</option>");
            }
            document.write("</select>");
          }

вроде бы закрывает все option-ы и select-ы. Вы написали
Цитата:

соответственно можно писать '</option>' -> '<'+'/option>' или '<\/option>'
А почему? Чем '</option>' отличается от '<'+'/option>?Извините за назойливость.

x-yuri 12.02.2009 19:13

давай без профессора и на ты лучше ;-) это звание не я себе присвоил
а ты бы перевел хоть тот кусок, который я процитировал. Там все описано

Андрей Параничев 12.02.2009 19:18

barcelona,
Зачем столько раз писать в документ?

function drawModuleSeq(count, index, nameMod) {
            var content = "<select name=\"" + nameMod + "\">"; 
            for (i = 0; i < count; i++) {
              add = "";
              if (i == index) add = " selected=\"selected\"";
              content += "<option value=\""+(i+1)+"\""+add+">"+(i+1)+"<"+"/option>";
            }
            content += "<"+"/select>";

            document.write(content);
          }

x-yuri 12.02.2009 19:31

barcelona, и еще... не используй экранирование, если оно не нужно... это называется синдром зубочистки ("<select name=\"" -> '<select name="')

barcelona 13.02.2009 13:08

x-yuri, спасибо.
Теперешний код валидацию прошёл, а вот работать что-то не хочет.. Если выбирать все элементы из списка, на каком-либо, да Firefox затирает код... У меня уже спортивный интерес появился, вроде и через PHP можно сделать, а всё равно хочу понять в чём дело, почему javascript+firefox так не хотят ладить.

x-yuri 13.02.2009 22:46

barcelona, можешь для начала прочитать http://webew.ru/articles/598.webew

проблема в insertAfter. Это можно выяснить с помощью ff + firebug + console.log (выводит из скрипта информацию на вкладку консоль). Она не выполняется даже один раз, если выбрать "Неосновной". Я еще, скорее всего, попробую разобраться

p.s. у массивов есть такой метод - push, он позволяет избежать всяких проверок на undefined ;-)

barcelona 16.02.2009 10:52

x-yuri, спасибо, что пытаешься помочь.

x-yuri 23.02.2009 15:41

в общем, по-крайней мере разобрался, в каком месте он ff "подвисает". Теперь твоя очередь ;-)

p.s. скорее всего это баг, но полезно знать, что именно происходит "за сценой" (во время выполнения insertAfter)


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