Перемещение строк таблицы в 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"); (просто для примера) - всё работает, селект "переезжает" куда надо. А вот чтобы вся строчка - нет. |
приведи код полноценной странички (http://javascript.ru/paste), чтобы можно было скопировать и посмотреть, в чем проблема
|
Всё, я разобрался. Дело было в том, что в строчке стояло
<script></script>. Убрал - заработало. Конечно, хотелось бы обойти это, но... |
[telepat mode]
'<script><'+'/script>'[/telepat mode] |
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> |
barcelona, не угадал. Можешь выложить страницу полностью, чтобы можно было самому попробовать? (сюда)
|
x-yuri, я загрузил "Код 49919144", адрес "http://javascript.ru/paste/49919144".
В начале подключается jquery. Этот код рабочий. А вот здесь - "http://javascript.ru/paste/4991962c" нерабочий. Разница - только в наличии тегов "script" во втором столбце каждой строчки. Версия Firefox - 3.0.3 |
barcelona,
в чем великий смысл делать ссылки не кликабельными? Вас прет выделение-копирование-новая_вкладка-вставка-ентер? |
Kolyaj, я новичок на форуме. Исправляюсь:
http://javascript.ru/paste/49919144 - рабочий код. http://javascript.ru/paste/4991962c - нерабочий. |
все-таки я был прав, у тебя в скрипте были обнаружены незакрытые тэги (</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): Цитата:
p.s. советую пользоваться каким-нибудь валидатором. Например, к firefox есть плагин HtmlValidator, Опера позаволяет отправлять текущую страницу на валидации или http://validator.w3.org/. Ты бы сам тогда смог решить свою проблему ;-) p.p.s. обычно приемлемо не использовать document.write (т.е. вносить изменения по onload), думаю |
Профессор, я глубоко признателен Вам за помощь. Вы не могли бы объяснить мне ещё одну деталь? Код, генерирующий список:
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-ы. Вы написали Цитата:
|
давай без профессора и на ты лучше ;-) это звание не я себе присвоил
а ты бы перевел хоть тот кусок, который я процитировал. Там все описано |
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); } |
barcelona, и еще... не используй экранирование, если оно не нужно... это называется синдром зубочистки ("<select name=\"" -> '<select name="')
|
x-yuri, спасибо.
Теперешний код валидацию прошёл, а вот работать что-то не хочет.. Если выбирать все элементы из списка, на каком-либо, да Firefox затирает код... У меня уже спортивный интерес появился, вроде и через PHP можно сделать, а всё равно хочу понять в чём дело, почему javascript+firefox так не хотят ладить. |
barcelona, можешь для начала прочитать http://webew.ru/articles/598.webew
проблема в insertAfter. Это можно выяснить с помощью ff + firebug + console.log (выводит из скрипта информацию на вкладку консоль). Она не выполняется даже один раз, если выбрать "Неосновной". Я еще, скорее всего, попробую разобраться p.s. у массивов есть такой метод - push, он позволяет избежать всяких проверок на undefined ;-) |
x-yuri, спасибо, что пытаешься помочь.
|
в общем, по-крайней мере разобрался, в каком месте он ff "подвисает". Теперь твоя очередь ;-)
p.s. скорее всего это баг, но полезно знать, что именно происходит "за сценой" (во время выполнения insertAfter) |
Часовой пояс GMT +3, время: 09:00. |