>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >JavaScript onclick http://forum.mozilla-russia.org/viewtopic.php?id=30628 |
Beregost > 02-02-2009 20:22:55 |
Вопрос собственно очень короткий и простой - почему некорректно работает событие onclick? В написанном мной сайте создаётся ощущение будто вашему браузеру требуется предварительная активация, потому что при первом щелчке по импровизированной кнопке в виде текста в дескрипторах span событию уделяется ровно ноль внимания. Далее события отрабатывается корректно. Если на страничке присутствует несколько кнопок, то каждую приходится активировать таким вот убогим способом. Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <script language="JavaScript"> function click_test() { element=document.getElementById("test"); alert("Здравствуй Мир!!!"); } </script> </head> <body> <p id="test" name="test" onclick="click_test()">+</p><span id="test2" name="test2"></span> </body> </html> В этом варианте всё работает на 5+. Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <script language="JavaScript"> function click_test() { element=document.getElementById("test"); element2=document.getElementById("test2"); if(element.innerText=="+") { element.innerText="-"; element2.innerText="Текст"; } else { element.innerText="+"; element2.innerText=""; } } </script> </head> <body> <p id="test" name="test" onclick="click_test()">+</p><span id="test2" name="test2"></span> </body> </html> в таком виде в вашем браузере страничка вообще мертва. В других, названных мной выше браузерах, всё работает как надо. Вопрос простой: чего я делаю неправильно? |
Lynn > 02-02-2009 20:43:39 |
Ну, вообще-то onclick работает правильно. |
Beregost > 02-02-2009 20:51:16 |
Какой аналог вы можете посоветовать? Я уже пробовал менять классы в листах стилей, но тогда начинают артачиться все остальные браузеры или это более правильный путь и стоит дальше упирать на него? |
Lynn > 02-02-2009 20:58:11 |
Я бы сделал с помощью классов. Вообще, почитайте какой-нибудь учебник, а то написанный код явно выдаёт, что вы не очень понимаете что и для чего пишите. Я не верю, что в span появляется слово «Текст», если код действительно такой, как приведён выше. |
Beregost > 02-02-2009 21:04:09 |
оно (слово) действительно появляется и в таком варианте и если обращаться к элементу напрямую (что я обычно и делал, пока не поставил себе firebug, который порекомендовал использовать функцию get). |
Lynn > 02-02-2009 22:19:54 |
Beregost |
stoneflash > 03-02-2009 06:36:17 |
Сказали же, innerText - не поддерживается. Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <script language="JavaScript"> function click_test() { element=document.getElementById("test"); element2=document.getElementById("test2"); if(element.innerHTML=="+") { element.innerHTML="-"; element2.innerHTML="Текст"; } else { element.innerHTML="+"; element2.innerHTML=""; } } </script> </head> <body> <p id="test" name="test" onclick="click_test()">+</p><span id="test2" name="test2"></span> </body> </html> А вообще - да, лучше сделать через классы. Или просто element.style.display='none' На таком примере ещё и можно так сделать, но если у Вас несколько таких блоков, то всё их содержимое хранить в Javascript - не есть гуд. |
Beregost > 03-02-2009 08:43:10 |
У меня таких блоков всего два. В вашем браузере приведённый пример не работает (это конешно же так, ведь иначе я бы и не спрашивал), но работает в других, которые я перечислил выше. Но самое смешное - тот сайт, который я спроектировал работает со свойствами innerText и innerHTML в FF, но только после "активации", процесс которой я описал выше - чем это может быть вызвано? |
stoneflash > 03-02-2009 10:16:48 |
Вариант с display:none Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <script language="JavaScript"> function click_test() { element=document.getElementById("test"); element2=document.getElementById("test2"); if(element2.style.display=='none') { element.innerHTML="-"; element2.style.display=""; } else { element.innerHTML="+"; element2.style.display="none"; } } </script> </head> <body> <p id="test" name="test" onclick="click_test()">+</p> <span id="test2" name="test2" style="display:none">Тут какой-то текст</span> </body> </html> Вариант с классами: Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <style type="text/css"> .visibleClass {display:;} .hiddenClass {display:none} </style> <script language="JavaScript"> function click_test() { element=document.getElementById("test"); element2=document.getElementById("test2"); if(element2.className=='hiddenClass') { element.innerHTML="-"; element2.className="visibleClass"; } else { element.innerHTML="+"; element2.className="hiddenClass"; } } </script> </head> <body> <p id="test" name="test" onclick="click_test()">+</p> <span id="test2" name="test2" class='hiddenClass'>Тут какой-то текст</span> </body> </html> На счёт идентификатора открытого элемента - то есть нужно, чтобы запоминался текущий открытый элемент? |
Beregost > 03-02-2009 13:36:18 |
stoneflash
мне нужно создать неограниченное число открывающихся и закрывающихся блоков и при этом не допустить увеличения текста скрипта. Кстати в одной из книжек я прочитал, что Мазила, на основе которой сделан FF поддерживает свойство innerHTML. |
stoneflash > 03-02-2009 14:26:46 |
Выделить код Код:<html> <head> <title>Тестируем событие onclick</title> <script language="JavaScript"> function showHide(id,textWhenHidden,textWhenVisible) { element=document.getElementById("link"+id); element2=document.getElementById("text"+id); if(element2.style.display=='none') { element.innerHTML=textWhenVisible; element2.style.display=""; } else { element.innerHTML=textWhenHidden; element2.style.display="none"; } } </script> </head> <body> <p id="link1" onclick="showHide(1,'Показать блок 1','Скрыть блок 1')">Показать блок 1</p> <span id="text1" style="display:none">Тут какой-то текст 1</span> <p id="link2" onclick="showHide(2,'Показать блок 2','Скрыть блок 2')">Показать блок 2</p> <span id="text2" style="display:none">Тут какой-то текст 2</span> <p id="link3" onclick="showHide(3,'Показать блок 3','Скрыть блок 3')">Показать блок 3</p> <span id="text3" style="display:none">Тут какой-то текст 3</span> <p id="link4" onclick="showHide(4,'Показать блок 4','Скрыть блок 3')">Показать блок 4</p> <span id="text4" style="display:none">Тут какой-то текст 4</span> </body> </html> Ну как-нибудь так тогда сделать. В функцию передаём номер управляемого блока, текст ссылки, когда блок скрыт и текст, когда блок отображается. |
Beregost > 03-02-2009 14:44:46 |
Второй вариант не работает, зато прекрасно сработал первый. Значения style.class не определяются, как собственно не определяется значение атрибута class. Вообще class похоже является служебным словом в JavaScript. |
Lynn > 03-02-2009 15:04:02 |
Beregost Прочитайте уже учебник |
Beregost > 03-02-2009 15:38:06 |
Обязательно, когда у меня будет время. Уже начал. Обычно время у меня есть по дороге с работы домой и наоборот. Так что пока мне приходится всё получать урывками и результат этого вы уже видели (плачевный). |
Beregost > 03-02-2009 16:17:25 |
Ещё один интересующий меня вопрос: как избавиться от белых рамочек, которые возникают вокруг ссылок в вашем браузере? |
stoneflash > 03-02-2009 17:41:23 |
Добавьте для ссылок стиль Точно не помню, но, вроде, так. |
aroma > 05-02-2009 13:44:18 |
Отличный код. |
stoneflash > 05-02-2009 15:24:12 |
aroma |
piontr > 05-02-2009 20:01:24 |
stoneflash пишет
Представляется, что решением указанной проблемы является активное использование CSS. Именно в этом направлении развиваются все браузеры. Вместо div и span используются block и inline. А обработка кликов в этом случае сводится к модификации свойств видимости. |
aroma > 05-02-2009 22:05:27 |
Текст то я поменяю, а вот яву не зашарю. |
stoneflash > 06-02-2009 06:22:28 |
Что-то не понял. Первое - теги, второе - свойства. А к чему применять block и inline?
Вот это я тоже не понял. |
piontr > 06-02-2009 11:44:01 |
stoneflash пишет
В решении этих вопросов надо исходить из позиции стандартов W3. XML Events показывает, что все реакции на события при их обработке должны проходить от корня дерева - документа к целевому узлу, для которого, собственно, и предназначен клик. Т.е. на один клик мыши откликнутся все узлы, которые "видны из под данного" в указанном порядке. Майкрософт пошел своим путем (по непроверенным данным в восьмой версии ИЕ будет поддерживаться стандартная модель). В IE событие просачивается от целевого узла (который лежит на поверхности) к корню документа. Когда отображается только один уровень объектов, реагирующих на клик - эта разница незаметна, однако при многослойных структурах - возникает проблема. Какие есть решения для многослойных структур? |
stoneflash > 06-02-2009 11:54:03 |
Вы про перехват\просачивание события? event.stopPropagation(); event.cancelBubble = true; ... Да и вообще для решения задачи скрытия\раскрытия блоков, какая была описана выше, не стоит думать сильно о DOM, узлах и прочем. |
piontr > 06-02-2009 15:42:49 |
stoneflash пишет
Согласен, что управление каскадированием можно решить чисто средствами JS, но использование DOM, DOM Events и CSS (display Property и visibility Property) резко сокращает объем кода. |
stoneflash > 06-02-2009 16:30:00 |
Можно посмотреть, как вы бы реализовали первый код из сообщения? |
aroma > 07-02-2009 00:10:14 |
Мужики, может кто-нибудь написать код на основе этого скрипта.... |
Beregost > 07-02-2009 14:24:34 |
Я и так использую в разметке и при решении задачи раскрывающегося меню листы стилей с двумя классами - hide и show. stoneflash пишет
спасибо, помогло. Вообще почитав про FF я очень им заинтересовался, ведь он придерживается нормативов, а это значит что следует стремится к тому, чтобы именно в FF всё работало хорошо (тогда я освою именно нормативы и стандарты, что гораздо важнее пропроитарных игрищ). Инструменты, которыми я могу дополнить данный браузер очень помогают мне в процессе разработки и это тоже несомненный плюс. Кстати, решил вопрос с количеством функций - решение оказалось тривиальным, даже удивляюсь как не дошёл до этого сразу. Просто использую теперь одну функцию с переменными, где переменной является id элемента. В итоге у меня одна короткая функция, которая работает правильно где угодно. |
piontr > 09-02-2009 10:52:31 |
Вопрос оказался актуальным и пришлось сесть за написание кода, хотя этим мне ******************************* .ind { cursor:pointer; .op {display:inline; .cl {display:none; |
stoneflash > 09-02-2009 11:11:56 |
piontr |
piontr > 09-02-2009 12:06:29 |
stoneflash пишет
Это практически Ваша задача с использованием функции |
stoneflash > 09-02-2009 15:49:34 |
Хм. Что за ситуация такая?
Можно просто заменить название тега на любой другой inline.
А кто сказал ссылка открытия\скрытия блоков должна быть в одном контейнере с самим блоком? В вашем примере получается жёсткая привязка. Как только выносим блок из основного меню - код перестаёт работать, так как уже у блоков не один родитель. зы. |