Zeroglif
User-
Posts
46 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Store
Everything posted by Zeroglif
-
Вс?-таки вы афишируете сво? решение на публичном форуме, нужно предполагать и копипаст, и слабый анализ, а вы могли бы запросто обойтись без вычленения IE таким способом. Запросто. Не подавая другим плохой пример. IE6 тоже старь?. IE7 в смысле BOM/DOM/Javascript почти такое же старь?. Много чего нового не держит, но нельзя же из принципа отказывать их пользователям в рабочем скрипте. А в обсуждаемом контексте поддержка потребовала бы от вас всего 2-х строчек. Кстати, если говорить не о старье, а о потенциальном свежаке, то как насч?т занятого вами идентификатора getElementsByClassName, который в перспективе забивать не хотелось бы... Не проще ли взять другой ограничитель, как это делает подавляющее большинство. Нет? Думаю, вы просто не держали этого в уме. Скорость циклов разнится от браузера к браузеру. Если уж это так важно, то while был бы достаточен, do предполагает разовое действие вне условий, что совершенно тут не к месту пришлось. Я не прав? Поясните, конечно. Тоже поясните, не заметил. Дописав класс, мы ж не удаляем прежний. Ищется как всегда, анализируя className, ничего необычного. В рамках этого конкретного мира табов это константа, другое дело, что сам мир не инкапсулирован, все тяготы и лишения несут на своих плечах ноды. Смайлик погрустнел бы, зная вы сколько раз мне пришлось ответить по поводу этого бага. Правила именования тут вообще-то не при ч?м. Я вам говорил о конкретном баге IE (частично и Оперы тоже) плюс о том, что в среде js-программистов есть некие красные флажки, бессмысленное "неявное заведение переменных" - один из них. Бажность характеризуется наличием багов, нетривиальность малой распростран?нностью методов. Разве вы не можете вызвать нужную функцию переключения таба? Ни них же уже висят обработчики. Вот их и вызывайте. И я про это. Реальной проверки чего-либо нет, но есть для галочки, чтоб не пугались... Скрипт привязан к точке, а не к событию, модификация HTML может смещать точку, нужно за эти следить и проч. отвлеч?нные предметы. "Плохость" в том, что это слабо сочетается с такими важными словами, как "компонента", "отделение от содержания", "корректное взаимодействие обработчиков", "современный код" и т.д.. В общем смысле у inline-обработчиков масса малоизвестных неприятных особенностей, но они вполне себе работоспособны. Javascript вообще язык всепрощающий, можно писать допотопно, архаично, с запутанной логикой и прийти к нужному результату. В этом смысле опираться только на результат, как на критерий правильности не совсем верно, тем более на узком js-форуме, где нужно спорить идеями, логикой и качеством знаний. Двух достаточно. p.s. в принципе согласен про уровень абстракции, только на мой взгляд вы слишком расслабляете табы, им незачем так расслабляться, их роль и взаимодействие должны быть заранее определены и в какой-то степени зафиксированы...
-
Прокомментирую-ка я некоторые грабли в вашем скрипте: для отсечения IE используется банальный navigator.userAgent.indexOf("MSIE"), то есть любители по-spoof-ить свои юзерагенты заранее идут лесом; метод getElementsByTagName('*') предполагает, что IE ниже шестой версии отдыхает; метасимвол b в регулярном предполагает, что имена классов с дефисами внутри прид?тся выбирать более внимательно; do-while предполагает, что при начальном индексе (i), равном нулю, мы можем уплыть в светлую даль вечного loop-a, и почему именно do, и почему снизу; ноды засоряются ненужными данными, которые легко можно держать снаружи (там прилинкован зачем-то свой же родитель, имя собственного же класса, да болтающийся текст activeTab и т.д.); все функции заведены неявно (не объявлены или без var), что чревато конфликтами в IE (возможное совпадение им?н в глобальном констексте) и вообще это не комильфо, в принципе; очень сомнительна необходимость в нетривиальных и бажных dispatchEvent/fireEvent для такой примитивной задачи, как клик по табу; повсюду натыканы try-catch, но реальная проверка чего-либо вообще не производится;один кусок скрипта во внешнем файле, другой в html, первоначальная инициализация не по загрузке, а по месту скрипта в потоке, обработчики заведены архаично в тегах... и т.д. и т.п., общую логику даже не беру в расч?т... Если стояла задача написать качественный/reuse-ный/командный/кроссбраузерный/масштабируемый код, то вряд ли. А если ещ? и предположить, что это код коммерческий, то тут пахнет выговором от босса, как минимум...
-
Кавычек не хватает, возвращаясь к начальному примеру, первый раз при наведении вы переда?те в функцию строку 'p', а дальше setTimeout запускает код, где уже не строка, а переменная p, значением которой является объект (или вообще несуществующая переменная, зависит от браузера, не суть важно), нужно просто написать так: setTimeout("tt('"+a+"')",100);
-
В IE третьим опциональным аргументом ид?т название языка: iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage]) http://msdn2.microsoft.com/en-us/library/ms536753.aspx
-
Нет такой книги в природе. Но есть, к примеру, неплохая песочница про ООП во Flash: http://oflesh.by.ru/index.htm И есть множество статей/обзоров, по которым, в принципе, можно разобраться в предмете: http://forum.vingrad.ru/index.php?showtopi...dpost&p=1215304
-
? убирает "жадность" квантификаторов иначе если в примере скриптовых блоков несколько, то они сольются в один (от первого тега первого блока до последнего тега последнего, регулярное жадно вс? захватит)... ;-)
-
nim, По поводу времени исполнения скрипта - если нужно что-то сделать по мере загрузки, то на это есть onload или же на крайний случай можно разместить скрипт где-то ниже элементов, с которыми предстоит работать скрипту. По поводу this - нужно вам просто поизучать это дело, в 2-х словах не объяснишь, в этом скрипте значением this является ссылка на окно (объект window), которому вы созда?те зачем-то свойство innerHTML, и смысла это не имеет вовсе. По поводу строительства таблицы через innerHTML - не лучшее решение, например, в IE таким образом таблицы не строят, надо по-другому.
-
Tokolist уже вс? что нужно написал, вешайте обработчик на сам документ и ловите, допустим, тот же клик на любом элементе.
-
var x; function f(){ x = this.id; } document.getElementById('foo').onclick = f;
-
function setAtributes(e) { alert("Hello!"); e.preventDefault ? e.preventDefault() : e.returnValue = false; }
-
Или как написал AKS поменять truе на false, или просто начать проверять с метода IE. function getA() { var t = document.getElementById("menu").getElementsByTagName('a'), l = t.length; while (l--) { //t[l].addEventListener ? t[l].addEventListener("click", setAtributes, false) : t[l].attachEvent("onclick", setAtributes); t[l].attachEvent ? t[l].attachEvent("onclick", setAtributes) : t[l].addEventListener("click", setAtributes, true); } }