Pull to refresh

Comments 62

о оформлении - Можно
Аллюзийно-поли.....
разбить на несколько строчек? а то залезает в соседний блок (Safari 3.0.4 Win)...
а еще можно воспользоваться сторонней библиотекой (mootools например), которая умеет делать toggleClass [http://docs.mootools.net/Native/Element.js#Element.toggleClass], что позволит переписать последний пример так:

//теперь эта одна функция вместо тех двух
function toggle(nodeId) {
   if (node = $(nodeId)) {
      node.toggleClass('hidden');
   }
}


и к тому же вешать события методом прописывания onclick не кошерно ИМХО. можно воспользоваться тем же инструментом и довесить события через .addEvent() - более прозрачное разделение логики от представления
Да, почти во всех библиотеках подобный метод есть для работы с классами. Но тут в общем подход. И если бы я сделал через addEvent это бы отвлекло от сути.
я больше вел к тому, что надо приучать людей к использованию более высокоуровневые библиотеки, чем использовать низкоуровневый JS. Во-первых это дает больше кроссбраузерности, во-вторых больше возможностей (и собвстенно простоты действий), ну и к чему писать сайты на ассемблере под CGI, если есть PHP и иже с ним? :)

А касательно самой подачи материала — решение вопроса с граблями отображения для многих начинающих будет полезным :) спасибо
Дело в том что я как раз приучивать к библиотеке то и не хочу. Моя задача показать грабли, и подход. А дальше уж каждый сам для себя решит как это реализовывать.
а что вам помешало вместо
node.style.display = 'block';
писать
node.style.display = '';
?
неочивидность данного решения. но согласен - пример вмеру исскуственный.
В вашем примере неправильно использовать
node.style.display = 'block';,
т.к. span, по умолчанию, inline-элемент.
Поэтому решение, которое предложил lahmatiy, вполне очевидно.
возможно, спорить не буду.
но я хотел показать способ как вообще не думать о таких вещах.
Очень часто бывает что инлайновым элементам присваивается свойство display:block;
поэтому это очевидное решение уже не будет решением :)
Если оно выставляется при помощи глобальных таблиц, то это решение никуда не денется. Причин, по которым инлайн-элементам нужно выставлять 'display:block' через element.style.display или через атрибут style я с ходу придумать не могу. Если подскажете, буду признателен.
el.currentStyle[styleName] ие
document.defaultView.getComputedStyle(el, null)[styleName] неие
вместо null строку псевдокласса можно поставить, судя по спецификации
если я суть вопроса понял
Надо писать node.style.display = 'inline';
а если вместо span будет p ?
Если элемент инлайновый:
http://www.w3.org/TR/2003/WD-xhtml2-2003…
ставим inline

Если блочный, ставим конечно block:
http://www.w3.org/TR/2003/WD-xhtml2-2003…

Соответственное если хочешь добиться блокового поведения от инлайнового элемента, ставишь блок и т. п.
поправлюсь "Соответственно"
В вашей реализации придётся где-то хранить для каждого элемента нужное значение свойства display. Тут же на помощь приходят глобальные таблицы стилей.
Причем здесь реализация? CSS надо хранить в .css, а не в JavaScript'e.
Я про то что не надо писать ...style.display = ''; рассчитывая что браузер все правильно поймет.
А почему браузер должен понять меня неправильно, если я напишу element.style.display=''; ?
В спецификации это как-то описано?
Если нет, то каким образом будет определятся display для элемента будет решать проектировщик каждого конкретного браузера.
ну насколько я заметил obj.style - это эквивалент параметру style у соответсвуюещего тега.

т.е. если мы ставим obj.style.display='none' - то тем самым перекрываем то что задано к примеру в таблице стилей. а когда obj.style.display='' - это фактически удаляет display из style и решение приимается уже по тому что задано в css файле или для узла по умолчанию
Если смотреть в Firebug'e, то да, но в полне возможно, что в IE это происходит как-то по-другому.

И опять же, если это ни где не описано, то разработчик браузера может сделать как хочет.
Если хочется сделать более менее надежный сайт, то руководствоваться аргументами типа "насколько я заметил" не стоит.
насколько вы могли заметить из поста, всячески стараюсь этим не руководствоваться аргументами типа "насколько я заметил"

просто у вас тут такой активный спор разыгрался, что и я решил вставить свои 5 копеек
как я уже писал выше, свойство будет определяться из глобальных таблиц стилей.
Теперь остается только назначить этот класс нужному узлу, и он исчезнет с экрана. Убрав этот класс, он без проблем вернется в строй.

атрибут class может иметь несколько классов, они перечесляются через пробел, таким образом можно использовать код


function hide(nodeId){
...
node.className += ' hidden';
...}

function show(nodeId){
...
node.className=node.className.replace(' hidden', '');
(надо проверить- может сработает node.className -= ' hidden')
...}
С каких пор операция вычитания работает для строк? :) В случае использования данной операции ваши операнды приведутся к числами, а результатом операции будет NaN.
если вы говорите о "node.className -= ' hidden'", то я и сам поставил под сомнение данный код, а остальное прекрасно работает
А если там класс hidden2?
если hidden первый класс тоже жопа (не тримит className только ие)
А зачем две отдельных функции? Я использую универсальную
function toggle(obj) {
var el = document.getElementById(obj);
if (el.style.display != 'none') {
el.style.display = 'none';
}
else {
el.style.display = '';
}
}
для наглядности примера я выбрал реализацию самую простую для понимания. что может быть проще скрыть/показать.
поставте в стиле display:block для вашего obj
затем сделайте alert(document.getElementById(obj).style.display;) и вы увидите что там вовсе не block

таким образом значение по умолчанию должно быть none. может кто-то знает как получить актуальное значение ?
проще:

function toggle(obj) {
var el=document.getElementById(obj);
el.style.display = (el.style.display=='none') ? 'block' : 'none';
}
простота исчесляется вовсе не количеством строк
а вообще в данном случае как реализовано включение выключени не принципиально. важно то что внутри.
а если значение передаётся через class, а не style ?

если уж на то пошло, то тогда offsetWidth.
UFO just landed and posted this here
Видимо ты рассчитываешь, что пользуются только IE?
UFO just landed and posted this here
блин. Передом мной сейчас встала проблема: как получить свойство описанное на в style тэга а через class?
Тут удобство даже не в избежании подобных камней. А скорее в правильном подходе. Каждый элемент на странице может быть в нескольких состояниях (показан, не показан, сфокусирован, в режиме редактирования). Более того, состояние родительских элементов может влиять на его детей. Все эти взаимосвязи легко ложатся на язык css и поддерживаются всеми браузерами. И чем каждый раз в яваскрипте определять, какая у нас новая конфигурация и что изменилось по сравнению с текущей, проще прописать нужные правила в css и оперировать в терминах классов.
UFO just landed and posted this here
вопрос перекладывания задач с программиста на верстальщика и наоборот можно вынести в отдельную тему имхо :)
тут скорее про разделение логики и представления, чем про то как спихнуть работу кому-то другому :)
То есть когда пишешь node.style.display = 'block'; отделяется логика от представления?
как раз нет
а вот когда пишешь
node.className = 'hidden';
вот тогда отделяется.
Ну если это делать так:
Middle = "</head><body><img src='" + url;
End = "' onClick='window.close()' alt='Кликните на изображении чтобы закрыть окно' class='zoom' /></body></html>";
(http://www.ibl.su/scripts/common/ewin.js)

Могу лишь пожелать дальнейших успехов в освоении JavaScript'a и CSS :-)
польстило что вы просмотриваете работы нашей студии. а какое отношение это имеет к теме поста?
Если посмотреть на мой предыдущий коммент и кусок яваскрипта с сайта вашей студии, можно понять какой уровень "программирования" в целом.
делать выводы вам никто не запрещает
Тривиальная задача - при наведении мыши изменить картинку - если просто переписывать каждый раз ее src, то она (картинка) будет подгружатся каждый раз, в то время как если менять ее className - этого не происходит в большенстве браузеров. Так что это скорее не помощь, а необходимость.
Если менять className, то src не меняется. Да, есть над чем подумать.
1. достаточно очевидная, на мой взгляд, очень правильная идея

2. домашнее задание :)

> Остается, правда, еще одна проблема — не учитывается случай,
> при котором узел уже имеет какой-либо класс. Попробуйте решить
> эту проблему самостоятельно.

node.className += ' hidden'; // назначили класс

node.className = node.className.replace(' hidden', ''); // убрали класс

3. проблему с display, что показывать inline или block, или еще что то, можно решить, например, воспользовавшись свойством visibility, а чтобы места пустое место не показывалось добавить position: absolute;, а потом менять на relative, но можно так же нарваться на нечаянное изменение уже заданного другого position
А как аккуратно расставлены скобочки! Жду 18 параграфов текста, в которых расписано использование сокращенной конструкции условно оператора. И еще 18 параграфов с описанием понятия «составной оператор».
UFO just landed and posted this here
я тоже, но мы к этому всячески стремимся
Функции нужно изменить так :

function hide(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.visibility = 'hidden ';
}
}

function show(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.visibility = 'visible';
}
}

и все заработает!
у visibility другие свойства. так просто нельзя поменять display на visibility
Sign up to leave a comment.

Articles