Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Заливка столбцов жабаскриптом
 
 автор: SHAman   (31.07.2006 в 16:52)   письмо автору
 
 

Задача:
есть таблица. При наведении на ячейку должны выделяться цветом ее столбец и строка. Как?
Понимаю, что ленивый, но мне нужно быстро..... оч прошу помочь.

   
 
 автор: 12345   (31.07.2006 в 17:53)   письмо автору
 
   для: SHAman   (31.07.2006 в 16:52)
 

Так копировать - тоже ж работа.

   
 
 автор: SHAman   (01.08.2006 в 12:28)   письмо автору
 
   для: 12345   (31.07.2006 в 17:53)
 

О! Тема!!! Спасибо большое. Мог бы и сам, просто срочно...

   
 
 автор: SHAman   (02.08.2006 в 13:58)   письмо автору
 
   для: 12345   (31.07.2006 в 17:53)
 

Извините пожалуйста за назойливость...
Дело в том, что посмотрев повнимательней на скрипт, ссылку на который вы мне дали, я понял, что это совсем не то, что мне нужно.

Алгоритм должен быть таким:
1) наступает событие "onmouseover" или "onmouseout" для ячейки таблицы.
2) функция-обработчик хватает id элемента, для которого случилось событие
3) из id вызвавшего элемента при помощи регулярного выражения (по-другому не знаю как проще) вычленяются номер строки и номер столбца.
4) Запускается цикл, в котором все элементы, у которых id содержит номер столбца, взятый из элемента-вызывателя, меняют свойство bgColor на другой цвет.
5) Запускается аналогичный цикл для столбцов.

Собственно вопросы:
1) Как схватить id элемента-вызывателя
2) Какое это регулярное выражение, если id выглядят следующим образом: "rX_cY", где X и Y - номера соответственно, строки и столбца.

Люди, я понимаю, что в конец обнаглел, но сам я не могу это ослить. Ява-скрипт - это явно не мое....

   
 
 автор: 12345   (02.08.2006 в 14:46)   письмо автору
 
   для: SHAman   (02.08.2006 в 13:58)
 

Наверное, проблема в том, что число строк переменное? В остальном не вижу причины устраивать цикл. А потому лениво его делать :)
Цикла по строкам можно избежать, если менять класс у выбранной строки (TD). Я делал поначалу так, но текущее решение короче.

   
 
 автор: SHAman   (02.08.2006 в 14:55)   письмо автору
 
   для: 12345   (02.08.2006 в 14:46)
 

проблема в том, что количество строк, как, впрочем, и столбцов ОГРОМНОЕ! Сам текст таблицы я делал скриптом. Посему, каждая ячейка имеет свой id, например, такой: id="r0_c5".

>Цикла по строкам можно избежать, если менять класс у
>выбранной строки (TD).

Вероятно, имелось ввиду TR?

Уточню немного задачу. Просто было бы сделать так, как предложено в скрипте по ссылке, если бы табличка была размером ну, пускай 5х10. А она у меня: 15строк на 25 столбцов! Если для каждого создавать по два дополнительных класса, как делаете вы у себя, то CSS распухнет больно. В данном случае, нужно делать так, или почти так, как я описывал. Вопрос для меня состоит в том, что я тугой в этом месте и не понимаю КАК это написать. Знаю что, знаю, что сама функция будет строчек 15, но написать их я не могу пока.

Повторю вопросы:
- как можно узнать id элемента, который вызвал функцию?
- как выглядит регулярное выражение для извлечения из этого id номеров строки и столбца?

Очень надеюсь на вашу помощь.

   
 
 автор: 12345   (02.08.2006 в 16:59)   письмо автору
 
   для: SHAman   (02.08.2006 в 14:55)
 

Если число строк огромное, то тем более надо избегать скриптов цикла по строкам - представляешь, сколько бы он работал? Или нужна оптимизация - окрашивать только в пределах видимости.
Да, TR.
event.parentNode.className=...; - окраска строки, тогда классы описать только по столбцам.
15 - не такое уж огромное, я представил, что 10000. И 25 столбцов при 8-10 символах в CSS на столбец - разве это много?

Ответы: 1) event.srcElement.id / event.target.id ;
2) thisId.replace(/-.+/,"") - номер строки; /[^_]+_/,"" - номер столбца.

   
 
 автор: SHAman   (02.08.2006 в 17:52)   письмо автору
 
   для: 12345   (02.08.2006 в 16:59)
 

Спасибо большое. Уже почти все работает. То есть, выделяет строку. Замечательно. Для выделения столбца текущего, нужно всетки перебирать цикл. А от сюда...
Вопросы с регулярными выражениями. Символы, внутри них - это только наполнение? Потому что если нет, то оно вообще отказывается работать. Если не наполнение, то чет оно тоже не работает. Повторюсь, формат id такой: r14_c12. Нельзя ли конкретизировать регэксп? Спасибо заранее.

ЗЫ. Всетаки хорошо, что есть форум, на котором отвечают даже на такие дибильные вопросы, да еще быстро и без фраз типа "Ну уморил! Ну и ламер!%)" Респект всем, кто помогает учащимся!

   
 
 автор: SHAman   (02.08.2006 в 18:13)   письмо автору
 
   для: 12345   (02.08.2006 в 16:59)
 


curid=event.srcElement.id;
row=curid.replace(/r/,"");
row=parseInt(row);
cell=curid.replace(/r\d_c/,"");
cell=parseInt(cell);

Так я получил номер ячейки и строки. Теперь цикл... Строка выделяется переключаемыми стилями. Посмотрим дальше...

   
 
 автор: 12345   (02.08.2006 в 18:33)   письмо автору
 
   для: SHAman   (02.08.2006 в 18:13)
 

Да но это для IE - event.srcElement . Чтобы и для FF, см., как я в примере делал.

<script>alert("r14_c12".match(/\d+/g))</script> - так сразу массив "строка-столбец".


Ид-ы, всё же, идеологически неверно. Привыкай к классовому мышлению. Достаточно знать, какого класса ячейка, так тут же новый цвет ей приклеиваешь.

Если бы дело не касалось Оперы, можно было бы применить динамические стили. Назначаешь стиль столбцу нужного класса. А циклы - это всё мелкобуржуазно...

   
 
 автор: SHAman   (02.08.2006 в 19:09)   письмо автору
 
   для: 12345   (02.08.2006 в 18:33)
 

Да. Скрипт заработал, но только под IE. Под FF не идет. Видел как у тебя в скрипте. Ща попробую у себя так сделать....

Щас такой расклад: событие вызывает функцию, с аргументом - именем класса. Этот класс присваивается всем ячейкам, которые нужны.

Ща попробую отладить.

Кстати, под FF все летает, а под IE подтормаживает... неужто из-за цикла? Не может быть! Всего 14 итераций! Или из-за GetElemenById?

На тему кроссбраузерности:
Строка:
t=d.all?event.srcElement:ev.target;

Как взять ev? В скрипте фраза:
d.onmouseout=d.onmouseover=function(ev)

мне не очень ясна. В принципе, мне нужно получить значение этого самого ev. Как это попроще?

   
 
 автор: 12345   (02.08.2006 в 23:56)   письмо автору
 
   для: SHAman   (02.08.2006 в 19:09)
 

ev - это параметр функции=обработчика, который действителен в FF и равен объекту Event . Так что он уже есть, получать не нужно.

Если у тебя в атрибуте тега - onmouseover=... , то надо писать иначе:

<td onmouseout=ff(event, др.параметры)   onmouseover=onmouseout=ff(event, др.параметры) >
...
ff=function(ev){...t=d.all?ev.srcElement:ev.target; ...}
Как видишь, намного больше писать. Хотя, можно

<td onmouseout=ff(event,this, др.параметры)   onmouseover=onmouseout=ff(event, this, др.параметры) >
...
ff=function(ev,t, др.){...t уже имеем. он не всегда target, но всё равно то, что нужно...}


d.onmouseout=d.onmouseover=function(ev) - это присваивание функции 2 обработчикам прерываний

   
 
 автор: SHAman   (03.08.2006 в 14:25)   письмо автору
 
   для: 12345   (02.08.2006 в 23:56)
 

Большое спасибо за поддержку. Написал. Правда, подтормаживает, но ничего. Полный код выглядит так:


<style>
    .selected    {background-color:silver;}
    .notselected    {background-color:wite;}
</style>

<script language="javascript">
function select_all(id,needclass)    {
  cell=id.replace(/r\d+_c/,"");
  cell=parseInt(cell);
    for (var i=1;i<15;i++)    {
    var obj=document.getElementById("r"+i+"_c"+cell);
    obj.className=needclass;
    }
}

function chClass(needclass)    {
   this.className=needclass;
}
</script>


Еще раз большое спасибо. Этот форум - просто счастье для чайников типа меня!

   
 
 автор: 12345   (03.08.2006 в 14:43)   письмо автору
 
   для: SHAman   (03.08.2006 в 14:25)
 

Это только скрипт, а в каждой ячейке нужно
<td id=r10_c12 onmouseover=select_all(this,"selected") onmouseout=select_all(this,"notselected")>
По 30 обращений к объекту документа на каждое движение - конечно, много, поэтому притормаживает.

   
 
 автор: SHAman   (03.08.2006 в 14:54)   письмо автору
 
   для: 12345   (03.08.2006 в 14:43)
 

А если сделать массив всех обрабатываемых элементов при загрузке страницы, а потом гонять цикл только по ним?

При этом будет стационарным столбец, а строка будет шевелиться.

Будет меньше тормозить?

ЗЫ. Кста, в Oper'e и в FF идет гораздо быстрее! В FF вообще летает!

   
 
 автор: 12345   (03.08.2006 в 19:15)   письмо автору
 
   для: SHAman   (03.08.2006 в 14:54)
 

Dc' равно, ощутимое время занимает обращение к объекту документа (к тому же, с визуальным эффектом).

Поэтому с классом лучше - обращается за 1 раз. Устройте для IE динамические стили, так, чтобы Опера с ними не работала. Как с ними работать - здесь:

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования