| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Добавление правил в таблицу стилей в FF |
| Автор: Ciber SLasH 17.4.2014, 17:01 | ||||
| Приветствую всех! Давно написал ф. для добавления правила в таблицу стилей и ф. работала. Но с какой-то версии FireFox перестала работать ф. и меню не отрабатывает. Подскажите пожалуйста, где ошибка в коде:
FF ругается в консоль так:
|
| Автор: Aliance 25.4.2014, 14:27 |
| Использовать глобальную переменную menuElem в атрибутах обработчиков событий - не гуд. У меня на jsfiddle выдает как минимум эту ошибку. |
| Автор: Ciber SLasH 27.4.2014, 00:11 | ||
Заменил в обработчиках событий глобальную переменную на document.getElementById("menu") и заработало, но в консоли всё равно ругается на 27 строку:
Хотя раньше и так работало. Видимо в новых версиях FF обработчики событий больше не видят глобальных переменных. |
| Автор: Aliance 28.4.2014, 10:02 |
| Не то, чтобы это не правильно, но лично мне кажется нелогичным. Я бы посоветовал делать так: в обработчики событий вешать функции (при чем лучше делать это именно inline, чтобы было сразу понятно что должно вызываться и когда), а в функции обращаться к единой переменной, которая просчитана один раз в закеширована (это может быть и глобальная, конечно, но лучше в качестве неймспейса завести некий объект и переменную хранить как его свойство). Выложи обновленный код на jsfiddle и посмотрим, что там за ошибка. |
| Автор: Ciber SLasH 28.4.2014, 22:57 |
| Попробовал создать объект, на обработчики навесить функции - вообще перестало работать в FF 28.0 http://jsfiddle.net/YRNF9/2/ |
| Автор: Aliance 29.4.2014, 10:36 | ||
Ну а теперь открываем консоль по ссылке и видим ошибки:
Это потому, что в левом верхнем селекте нужно выбрать было не onload, а no wrap (лучше в body, но для примера все равно). После этого вроде как пример работает нормально, без ошибок. Только я бы посоветовал не извращаться и писать все атрибуты html в нижнем регистре, onClick выглядит ужасно. Но это лишь мое мнение |
| Автор: Ciber SLasH 29.4.2014, 11:13 | ||
Выбрал no wrap, изменил атрибуты в нижний регистр. В текущем состоянии:
|
| Автор: Aliance 29.4.2014, 16:36 |
| Какой браузер-то? В Хроме все окей. Видимо проблема в Лисе? Вообще, 194 строчка - это первая строчка в функции changeStyle. Может быть идет наведение мышкой ДО события onload? Тогда еще объект не успевает заинититься, и такая ошибка может возникнуть. Но это нормально. Не нормально то, что такая ситуация не обрабатывается внутри методов, навешанных на события. А зачем вообще нужна функция changeStyle? Она, честно говоря, похода на огромный костыль. Что мешает просто написать нужные стили сразу и просто менять класс у элемента при взаимодействии с ним? Ну или второй вариант менять стили (elem.style.STYLE = 'VALUE')? И еще, я бы вот таких проверок не делал бы (curNode.nodeName == "LI"), ибо регистрозависимость есть зло. Лучше привести в нижний регистр и сравнивать с li. Кстати, чтобы работало \n - нужно его заключать в двойные кавычки. |
| Автор: Ciber SLasH 29.4.2014, 17:10 |
| Браузер уже писал - FF 28.0 Остальное позже поковыряю... |
| Автор: Ciber SLasH 1.5.2014, 19:06 | ||||
| Внутри методов повесил проверку: typeof(menuObj.menu) == "undefined" Функция действительно костыль. Она и была написана, как костыль для разных браузеров. А по поводу \n ошибаешся - оно работает и в одинарных и в двойных кавычках в JS. Это у PHP в одинарных кавычках строка не вычисляется. А ошибка:
как выяснилось, означает, что insertRule не поддерживает мультистроки. Поэтому пршлось мультистроку css-правил разбивать на части:
Код по http://jsfiddle.net/YRNF9/10/ исправил. |