Comments 62
о оформлении - Можно
Аллюзийно-поли.....
разбить на несколько строчек? а то залезает в соседний блок (Safari 3.0.4 Win)...0
а еще можно воспользоваться сторонней библиотекой (mootools например), которая умеет делать toggleClass [http://docs.mootools.net/Native/Element.js#Element.toggleClass], что позволит переписать последний пример так:
//теперь эта одна функция вместо тех двух
function toggle(nodeId) {
if (node = $(nodeId)) {
node.toggleClass('hidden');
}
}
и к тому же вешать события методом прописывания onclick не кошерно ИМХО. можно воспользоваться тем же инструментом и довесить события через .addEvent() - более прозрачное разделение логики от представления
//теперь эта одна функция вместо тех двух
function toggle(nodeId) {
if (node = $(nodeId)) {
node.toggleClass('hidden');
}
}
и к тому же вешать события методом прописывания onclick не кошерно ИМХО. можно воспользоваться тем же инструментом и довесить события через .addEvent() - более прозрачное разделение логики от представления
-3
Да, почти во всех библиотеках подобный метод есть для работы с классами. Но тут в общем подход. И если бы я сделал через addEvent это бы отвлекло от сути.
0
я больше вел к тому, что надо приучать людей к использованию более высокоуровневые библиотеки, чем использовать низкоуровневый JS. Во-первых это дает больше кроссбраузерности, во-вторых больше возможностей (и собвстенно простоты действий), ну и к чему писать сайты на ассемблере под CGI, если есть PHP и иже с ним? :)
А касательно самой подачи материала — решение вопроса с граблями отображения для многих начинающих будет полезным :) спасибо
А касательно самой подачи материала — решение вопроса с граблями отображения для многих начинающих будет полезным :) спасибо
-4
а что вам помешало вместо
node.style.display = 'block';
писать
node.style.display = '';
?
node.style.display = 'block';
писать
node.style.display = '';
?
+5
неочивидность данного решения. но согласен - пример вмеру исскуственный.
0
В вашем примере неправильно использовать
т.к. span, по умолчанию, inline-элемент.
Поэтому решение, которое предложил lahmatiy, вполне очевидно.
node.style.display = 'block';
,т.к. span, по умолчанию, inline-элемент.
Поэтому решение, которое предложил lahmatiy, вполне очевидно.
0
возможно, спорить не буду.
но я хотел показать способ как вообще не думать о таких вещах.
но я хотел показать способ как вообще не думать о таких вещах.
+2
Очень часто бывает что инлайновым элементам присваивается свойство display:block;
поэтому это очевидное решение уже не будет решением :)
поэтому это очевидное решение уже не будет решением :)
0
Надо писать node.style.display = 'inline';
0
а если вместо
span
будет p
?0
Если элемент инлайновый:
http://www.w3.org/TR/2003/WD-xhtml2-2003…
ставим inline
Если блочный, ставим конечно block:
http://www.w3.org/TR/2003/WD-xhtml2-2003…
Соответственное если хочешь добиться блокового поведения от инлайнового элемента, ставишь блок и т. п.
http://www.w3.org/TR/2003/WD-xhtml2-2003…
ставим inline
Если блочный, ставим конечно block:
http://www.w3.org/TR/2003/WD-xhtml2-2003…
Соответственное если хочешь добиться блокового поведения от инлайнового элемента, ставишь блок и т. п.
0
поправлюсь "Соответственно"
0
Причем здесь реализация? CSS надо хранить в .css, а не в JavaScript'e.
Я про то что не надо писать ...style.display = ''; рассчитывая что браузер все правильно поймет.
Я про то что не надо писать ...style.display = ''; рассчитывая что браузер все правильно поймет.
-2
А почему браузер должен понять меня неправильно, если я напишу
element.style.display='';
?+2
В спецификации это как-то описано?
Если нет, то каким образом будет определятся display для элемента будет решать проектировщик каждого конкретного браузера.
Если нет, то каким образом будет определятся display для элемента будет решать проектировщик каждого конкретного браузера.
0
ну насколько я заметил obj.style - это эквивалент параметру style у соответсвуюещего тега.
т.е. если мы ставим obj.style.display='none' - то тем самым перекрываем то что задано к примеру в таблице стилей. а когда obj.style.display='' - это фактически удаляет display из style и решение приимается уже по тому что задано в css файле или для узла по умолчанию
т.е. если мы ставим obj.style.display='none' - то тем самым перекрываем то что задано к примеру в таблице стилей. а когда obj.style.display='' - это фактически удаляет display из style и решение приимается уже по тому что задано в css файле или для узла по умолчанию
0
Если смотреть в Firebug'e, то да, но в полне возможно, что в IE это происходит как-то по-другому.
И опять же, если это ни где не описано, то разработчик браузера может сделать как хочет.
Если хочется сделать более менее надежный сайт, то руководствоваться аргументами типа "насколько я заметил" не стоит.
И опять же, если это ни где не описано, то разработчик браузера может сделать как хочет.
Если хочется сделать более менее надежный сайт, то руководствоваться аргументами типа "насколько я заметил" не стоит.
0
как я уже писал выше, свойство будет определяться из глобальных таблиц стилей.
0
Теперь остается только назначить этот класс нужному узлу, и он исчезнет с экрана. Убрав этот класс, он без проблем вернется в строй.
атрибут class может иметь несколько классов, они перечесляются через пробел, таким образом можно использовать код
function hide(nodeId){
...
node.className += ' hidden';
...}
function show(nodeId){
...
node.className=node.className.replace(' hidden', '');
(надо проверить- может сработает node.className -= ' hidden')
...}
-1
С каких пор операция вычитания работает для строк? :) В случае использования данной операции ваши операнды приведутся к числами, а результатом операции будет NaN.
0
А если там класс hidden2?
0
А зачем две отдельных функции? Я использую универсальную
function toggle(obj) {
var el = document.getElementById(obj);
if (el.style.display != 'none') {
el.style.display = 'none';
}
else {
el.style.display = '';
}
}
function toggle(obj) {
var el = document.getElementById(obj);
if (el.style.display != 'none') {
el.style.display = 'none';
}
else {
el.style.display = '';
}
}
+1
для наглядности примера я выбрал реализацию самую простую для понимания. что может быть проще скрыть/показать.
+1
проще:
function toggle(obj) {
var el=document.getElementById(obj);
el.style.display = (el.style.display=='none') ? 'block' : 'none';
}
function toggle(obj) {
var el=document.getElementById(obj);
el.style.display = (el.style.display=='none') ? 'block' : 'none';
}
0
а если значение передаётся через class, а не style ?
если уж на то пошло, то тогда offsetWidth.
если уж на то пошло, то тогда offsetWidth.
0
Тут удобство даже не в избежании подобных камней. А скорее в правильном подходе. Каждый элемент на странице может быть в нескольких состояниях (показан, не показан, сфокусирован, в режиме редактирования). Более того, состояние родительских элементов может влиять на его детей. Все эти взаимосвязи легко ложатся на язык css и поддерживаются всеми браузерами. И чем каждый раз в яваскрипте определять, какая у нас новая конфигурация и что изменилось по сравнению с текущей, проще прописать нужные правила в css и оперировать в терминах классов.
+4
UFO just landed and posted this here
вопрос перекладывания задач с программиста на верстальщика и наоборот можно вынести в отдельную тему имхо :)
0
тут скорее про разделение логики и представления, чем про то как спихнуть работу кому-то другому :)
+2
То есть когда пишешь node.style.display = 'block'; отделяется логика от представления?
-2
как раз нет
а вот когда пишешь
node.className = 'hidden';
вот тогда отделяется.
а вот когда пишешь
node.className = 'hidden';
вот тогда отделяется.
0
Ну если это делать так:
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 :-)
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 :-)
-2
Тривиальная задача - при наведении мыши изменить картинку - если просто переписывать каждый раз ее src, то она (картинка) будет подгружатся каждый раз, в то время как если менять ее className - этого не происходит в большенстве браузеров. Так что это скорее не помощь, а необходимость.
+1
1. достаточно очевидная, на мой взгляд, очень правильная идея
2. домашнее задание :)
> Остается, правда, еще одна проблема — не учитывается случай,
> при котором узел уже имеет какой-либо класс. Попробуйте решить
> эту проблему самостоятельно.
node.className += ' hidden'; // назначили класс
node.className = node.className.replace(' hidden', ''); // убрали класс
3. проблему с display, что показывать inline или block, или еще что то, можно решить, например, воспользовавшись свойством visibility, а чтобы места пустое место не показывалось добавить position: absolute;, а потом менять на relative, но можно так же нарваться на нечаянное изменение уже заданного другого position
2. домашнее задание :)
> Остается, правда, еще одна проблема — не учитывается случай,
> при котором узел уже имеет какой-либо класс. Попробуйте решить
> эту проблему самостоятельно.
node.className += ' hidden'; // назначили класс
node.className = node.className.replace(' hidden', ''); // убрали класс
3. проблему с display, что показывать inline или block, или еще что то, можно решить, например, воспользовавшись свойством visibility, а чтобы места пустое место не показывалось добавить position: absolute;, а потом менять на relative, но можно так же нарваться на нечаянное изменение уже заданного другого position
0
А как аккуратно расставлены скобочки! Жду 18 параграфов текста, в которых расписано использование сокращенной конструкции условно оператора. И еще 18 параграфов с описанием понятия «составной оператор».
0
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';
}
}
и все заработает!
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';
}
}
и все заработает!
0
очень хорошо
0
Sign up to leave a comment.
CSS в помощь JavaScript программисту