Jump to content
  • 0

Вариант навигации.


Dimitry Wolotko
 Share

Question

Сейчас сижу с больной головой (болею), думаю над навигацией в админке тех сайтов, что я сейчас делаю (несколько сайтов, админка одна).

Поделился со знакомцем мыслями - он мне сразу кинул (http://www.artlebedev.ru/tools/technogrette/js/tabsheets/) - идея пришлась по вкусу, но код JS раздут - ужас просто, написал свой, посмотрите, мб я что - то из функционала пропустил?

PS - мо? чудо с помощью php вполне можно и динамическим сделать.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Untitled</title>
<style>
.mon2 {color:black;}
.mon2 {color:red;}
</style>
</head>

<body>


<script type="text/javascript" language="JavaScript">
function so2( objName1, objName2, objName3 )
{
oObj1 = document.getElementById( objName1 );
oObj2 = document.getElementById( objName2 );
oObj3 = document.getElementById( objName3 );
oObj1c = document.getElementById( objName1 + "c" );
oObj2c = document.getElementById( objName2 + "c" );
oObj3c = document.getElementById( objName3 + "c" );
oObj1.style.display = "block";
oObj1c.className = "mon3";
oObj2.style.display = "none";
oObj2c.className = "mon2";
oObj3.style.display = "none";
oObj3c.className = "mon2";
}
</script>

<div>
<span class="mon3" id="date2c" onclick='so2( "date2", "date3", "date4" );'>Вкладка 1 |</span>
<span class="mon2" id="date3c" onclick='so2( "date3", "date4", "date2" );'>Вкладка 2 |</span>
<span class="mon2" id="date4c" onclick='so2( "date4", "date2", "date3" );'>Вкладка 3 |</span>
</div>
<div style="display: block;" id="date2">
Содержимое вкладки номер один:

<table border="1">
<tr>
<td>table data</td>
<td>table data</td>

<td>table data</td>
</tr>
<tr>
<td>table data</td>
<td>table data</td>
<td>table data</td>
</tr>
</table>
</div>
<div style="display: none;" id="date3">
Содержимое вкладки номер два:

Аниме убивает ваш мозг!

</div>
<div style="display: none;" id="date4">
Содержимое вкладки номер три:

<h1>труляля</h1>
<h2>труляля</h2>
<h3>труляля</h3>
<h4>труляля</h4>
<h5>труляля</h5>
<h6>труляля</h6>
</div>

</body>
</html>

Link to comment
Share on other sites

  • Answers 154
  • Created
  • Last Reply

Top Posters For This Question

Recommended Posts

  • 0
1. Что с var, что без var, функции попадают в global scope chain.

Я вам прив?л пример, уже один только этот пример говорит вам о некоторой разнице поведения. Не заметили? Заметили. Никакой документации по этому поводу вы не увидите. IE обнаруживает ваши неизвестно почему без-var-ные идентификаторы и, чтобы избежать ошибок, созда?т для них специальный временный объект, после присвоения клад?т их по сути неизвестно куда, то же самое касается нод, в итоге мы имеем в целом вроде правильную картину, но есть давние необъяснимые баги, связанные со странным поведением глобального объекта в IE, который двоится/троится и сам себе не тождественен, со странным поведением, когда собранные идентификаторы нод в определ?нных обстоятельствах защищают себя от изменений, а в других обстоятельствах не защищают, и проч. странности, о которых упоминать не стану. И даже с теоретической (ненавистной вами) точки зрения объявление переменной и псевдообъявление переменной - это совершенно разные вещи, второе уже 100 лет, как осуждается, и считается, извините за повтор, "bad practice", кстати, не "bad theory", что было бы неприятно глазу практика... и даже упомянуто в в официальных доках. В общем, много пишуший js-программист должен давно забыть о псевдообъявлениях, как о глупой, ненужной и баго-опасной идее, странно, что я должен как попка повторять очевидные вещи. Это к вопросу о внимании к мелочам.

2. Туда же попадают идентификаторы нод в IE.

Написал выше, начните экпериментировать с IE и он покажет вам свою неземную "любовь" к global object.

3. Ни один нормальный, адекватный, в здравом рассудке кодер не будет называть идентификатор ноды именем getElementByClassName, matchClassName и т.д. и т.п.

Это истинная правда, но НАЗЫВАЮТ и ошибка эта ВСТРЕЧАЕТСЯ. Ваш код обнаруживает то, что псевдообъявление - это ваш собственный стиль (или прости господи конвенция у вас такая?), я всего лишь показываю вам и посетителям форума минусы этого стиля, а не говорю, что вы что-то там ошибочно назвали, ваш скрипт работает, это никогда не отрицалось. Поймите вы, наконец, что критика и обсуждение не имеет целью затоптать конкретный скрипт, а его автора выставить дураком, я-то как раз картинку вижу цельную, из многих деталей, а вы, наоборот, опускаете и отрицаете, словно общаетесь не в форуме, а в своей корпоративной тусовке, где все вс? про скрипт и внутренние конвенции знают и не парятся...

Мало того, при нормальном подходе к разработке именование идентификаторов, имен функций и прочего должно строиться по разным правилам. Это обязательное требование к разработке.

Это необязательно в общем смысле, javascript создавался и для непрофессиональной (не за бабло) разработки, для энтузиастов, WEB-гиков и прочей нечисти, у них нет тормозов и ограничительной документации. Имейте их в уме, предлагая свои решения на публичном форуме, куда ходят абсолютно все, включая слепоглухонемых копипастеров.

Скажите, баг IE проявится при таком подходе? Никогда!

Никогда не говори никогда! :)

Чтобы бороться с безграмотностью недостаточно говорить с умным видом разные слова.

Согласен, нужно говорить умные слова. Вид не важен.

Нужно аргументированно доказывать свою точку зрения

Стараюсь, как могу, имеющий глаза... да увидит.

используя ссылки, примеры кода, указания на нормальные источники

Использовал неистово, не смог только вот найти источники в виде девелоперов Мозиллы.

а не бред псевдо-гуру

Вс? незнакомое кажется бредом.

Именно поэтому я всегда требовал от вас закрепления своих слов примерами.

Закреплял, гвоздями, соткой. Стена трухлявая, проваливаются.

Но вы это успешно игнорировали в некоторых случаях.

В каких некоторых? Игнорирую я исключительно попытки со мной обращаться в стиле "а ну-ка-ну-ка покажи, свой супер-пупер код". Как говорится, "кому хочу - тому даю" (Л.Слиска). Вот вам свежий пример - вчера в ньюсах c.l.j обсуждались библиотеки и туда неосмотрительно забр?л товарищ John Resig (jQuery), знаете такого, который пытался на критику реагировать примерно также, как и вы: "Where's your ultra-popular library that is 100% future proof?" или уже так: "Where's your ultra-documented, totally-awesome, perfect-in-every-way JavaScript library?". Вот он тоже считает, что если он написал и раскачал популярную либу, то чтоб с ним спорить ему надо кинуть аналогичную ответку в виде популярной либы. Смешной человек, первый раз в жизни заш?л в гости к профи и фанатам языка и был моментально отстрелян в голову не самыми сильными представителями сообщества в количестве 2-х человек. Хотя по сравнению с вами ему можно дать скидку - он действительно написал много и на людях, но вы-то с какого рожна с меня код тянете, я же с вас не тяну, пишите что угодно и как хотите... :mad:

Будем равняться на драфт? Да, и применения input type=submit в качестве переключалки таба считаю полным извращением.

Ну, при ч?м здесь драфт. Я пытаюсь вам объяснить, что программировать/синтезировать событие нужно тогда, когда нельзя обойтись более простым и над?жным решением. На мой взгляд, вы просто не видите этого решения.

А я вижу, что вы так и не поняли, почему парентов надо сканировать на наличие нужного свойства. Все больше и больше убеждаюсь, что мне совершенно неинтересна будет ваша реализация табулятора.

Конечно не понял, почтому что из того, что я вижу в вашем коде вам совершенно не нужно сканировать родителей. И объяснения про вложенные теги - это полная ерунда, потому что вы работает с this, а не с таргетом. Позднее вы попытались объяснить свою оплошность уже с помощью неких внешних нод, мол, я могу ссылку вложить (ага, проканало бы, если бы постом раньше не писали обратное), а для этого надо скрипт менять, так что это объяснение вы в голове заранее не держали, а просто ошиблись, не понимая разницы между объектом, на котором запустилось событие и объектом, на котором запустился обработчик. Что касается моей реализации табулятора, то она вам никак не может быть интересна по той причине, что в этой ветке соревнуются скрипты двух других джентельменов, а требовать поучаствовать в соревновании судью/критика/наблюдателя я бы постеснялся.... :)

Удачи.

Link to comment
Share on other sites

  • 0
"bad practice", кстати, не "bad theory", что было бы неприятно глазу практика... и даже упомянуто в в официальных доках.

Охохо. Очень может быть, что всякие "табу" в виде "bad practice" появляются в следстствие чего-либо. Нужно четко знать причину, по которой это появляется. Для меня например удивительно, какого лешего писать про то, что глобальные переменные в JS - плохо, если все что написано не внутри функции будет все равно глобальной переменной, вне зависимости от наличия var. Значит дело касается больше внутренностей фукнций, в которых можно определять глобальную переменную. Это ближе к правде. Потом вдобавок помог баг IE. Но он является багом, а не стандартным поведением. Мало того, что в IE наблюдается та же картина, что и в FF, любые переменные в теле script попадают в global scope chain. Итак, видим, что bad practice rule подкреплено багом IE, вероятность возникновения которого при нормальный условиях программирования ничножно мала. Разобравшись с данным табу можно смело сделать выводы, что не все, про что так громко кричат, опасно на самом деле. Если запугивать программеров всякими ограничениями - они перестают нормально мыслить. Нужно пояснять, что такой баг есть, как с ним бороться, и все.

Это необязательно в общем смысле, javascript создавался и для непрофессиональной (не за бабло) разработки, для энтузиастов, WEB-гиков и прочей нечисти, у них нет тормозов и ограничительной документации. Имейте их в уме, предлагая свои решения на публичном форуме, куда ходят абсолютно все, включая слепоглухонемых копипастеров.

Чем больше людей набьют свои собственные шишки, тем больше будет качественного кода. Проще научить человека пониманию ошибки реализации того или иного браузера, проще научить, что надо делать, чтобы ошибки не возникало, чем запрещать ему думать даже в эту сторону, так как кто-то там сказал, что это нельзя, что это непрофессионально.

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

Вы боитесь негативного отношения к себе? Зря, любые обсуждения на форумах рождают многогранное отношение к происходящему. Я прошу супер-пупер код, чтобы понять ход мыслей человека. Или подтверждение своих же слов. Мало того, на реальных примерах куда проще узнавать что-то новое для себя.

Облекая слова в код - проще вести конструктивную беседу.

По поводу библиотек - я всегда к ним отношусь со скептицизмом. К авторам библиотек отношусь с уважением. Народ что-то сделал, это уже достойно почитания.

На мой взгляд, вы просто не видите этого решения.

А вы не спрашивали себя, а хочу ли я видеть данное решение? Ваше предложение для данного скрипта может и будет проще. Но в целом - неприемлемо. Все очень просто. Любой ноде любой другой скрипт может полностью удалить onclick event у ноды, заменив его на event listener. Что тогда? Поймите, если всегда думать рамками только данной задачи и только в рамках данной реализации, то мы так и не дождемся качественных программеров на рынке.

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

О, вы телепат? Не надо думать за меня. Вы думаете я ошибся в данном куске кода? Нет, я вам тогда сразу и написал, что нода, которую могут переносить и таргет эвента могут быть разными. Потому что у меня уже были преценденты с моим кодом, когда идет усложнение HTML, а JS код как раз не работает именно по этой причине - нода с данными может сильно отличаться от ноды, с которым ведется работа. У меня в библиотеке даже специальная функция есть - getParentNodeWithProperty. Чтобы не мусорить, я просто перенес часть функционала непосредственно в код.

Link to comment
Share on other sites

  • 0
Для меня например удивительно, какого лешего писать про то, что глобальные переменные в JS - плохо, если все что написано не внутри функции будет все равно глобальной переменной, вне зависимости от наличия var.

Во-первых, уже написано конкретно, хотя, видимо, не очень понятно:

IE обнаруживает ваши неизвестно почему без-var-ные идентификаторы и, чтобы избежать ошибок, созда?т для них специальный временный объект, после присвоения клад?т их по сути неизвестно куда...

, т.е. процедуры создания глобальной переменной и св-ва window - это не одно и то же.

Во-вторых, можно начать знакомство с различиями хотя бы отсюда - Anonymous function increases speed, а там далее заглянуть по ссылке Avoid using global variables (не совсем в тему, но не помешает), да и вообще целиком можно прочесть статью Efficient JavaScript (хуже не станет).

Значит дело касается больше внутренностей фукнций, в которых можно определять глобальную переменную.

Не нужно этого делать - это же, как курс начальных классов (в любой самой простецкой книжке по js написано).

Любой ноде любой другой скрипт может полностью удалить onclick event у ноды, заменив его на event listener. Что тогда?

Что тогда? А что, если этот "любой другой скрипт может полностью удалить" (или заменить) options у этой самой ноды? Вот тогда что станет с "правильным" скриптом?

Link to comment
Share on other sites

  • 0
, т.е. процедуры создания глобальной переменной и св-ва window - это не одно и то же.

И что? В одном браузере он один, в другом - другой, а результат у всех один и тот же - переменные попадут в global scope chain. Меня меньше всего волнуют внутренние механизмы, которые происходят в недрах браузеров, хотя недавно я не без удовольствия покопался в исходниках seamonkey. Главное - результат.

Не нужно этого делать - это же, как курс начальных классов (в любой самой простецкой книжке по js написано).

Любая книжка по JS носит отпечаток знаний и умений автора. Вместе с этим туда же попадают непонятные и необоснованные табу. В любом языке программирования считаются глобальные переменные плохим тоном. А в JS помимо воли программиста все объекты, которые были инициализированы в теле тега script автоматом получают парентом объект window. Вопрос, насколько актуально данное табу в рамках специфики модели JS?

Что тогда? А что, если этот "любой другой скрипт может полностью удалить" (или заменить) options у этой самой ноды? Вот тогда что станет с "правильным" скриптом?

Указанный пример немного синтетический. А мой пример - вполне реальный.Я понимаю желание доказать мою некомпетентность, но не стоит это делать столь откровенным образом. Я же предупреждал, что не реагирую на неадекватщину.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy