Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Зацените (https://javascript.ru/forum/project/1542-zacenite.html)

Бухалыч 10.08.2008 11:14

Зацените
 
Интерактивная Таблица Менделеева
Буду рад критике, комментариям, предложениям

Dmitry A. Soshnikov 10.08.2008 13:12

Бухалыч, на вид - очень здорово, красиво и информативно. По поводу кода - часто встречаются конструкции, которые на сегодняшний день лучше не использовать (например, часто видно - document.write(...), обращение к формам по именам (document.myf.blabla) вместо id'шников и через объект forms (document.forms['myf'].elements['blabla']) и т.д.)

Бухалыч 10.08.2008 13:30

Дмитрий, спасибо за развернутый ответ!

ZoNT 10.08.2008 14:04

div id="grshb2" class="groupsh10" style="width: 50px; height: 20px; z-index: 2; font-size: 10pt; font-weight: bold; color: rgb(102, 102, 102);">
</div>

Если есть класс, зачем писать инлайн-стиль???



<center>V</center>
Куча лишних тегов!!! Диву (в классе) ставишь text-align:center; и всё.



var lp = j*50-(-30);
var lpb = j*50-(-22);

что за извращения? + писать уже не модно?


Повторяющиеся массивы значений можно вынести в глобальный контекст и обращаться к ним когда надо...

Kolyaj 10.08.2008 15:54

Dmitry A. Soshnikov, я понимаю, чем вам не угодили document.name.foo, с натяжкой могу понять, чем не угодила коллекция document.forms, но document.write вам что сделал?

Андрей Параничев 10.08.2008 16:01

Бухалыч,
Выглядит отлично. Конечно есть замечания к коду, на в данном конкретном случае их можно опустить. Если вы хотели бы и дальше заниматься JavaScript, то я бы посоветовал вам начать с изучения DOM, потому что, действительно, document.write() - устаревший подход.

Kolyaj 10.08.2008 16:32

Андрей Параничев, что вы понимаете под словом "устаревший"? Вот я понимаю document.all устаревший, т.к. ие его до сих пор поддерживает только из-за обратной совместимости (а Опера - потому что своего мнения не имеет, и за всеми все повторяет). А document.write почему устаревший? Ответьте мне уже наконец кто-нибудь.

ZoNT 10.08.2008 16:42

document.write используется в момент загрузки документа. Если документ загружен и закрыт на запись, то document.write откроет его, ОЧИСТИВ всё содержимое (фактически затерев).

Посредством document.write можно вписать что угодно, но он медленно работает (желательно предварительно всё сохранить в строку и потом использовать document.write один раз с этой строкой).

Таким методом нельзя получить сыылку на DOM элемент, добавляемый в документ.

Если вы используете document.write во фрейм созданный из скрипта, то не факт, что он будет писать инфу туда, куда вы думаете: document.write('<scr'+'ipt src="111.js"></scr'+'ipt>') запишет его в хэд фрейма, не создавая боди. Если этот скрипт (111.js) содержит document.write, то запись продолжится в head, что окажется неверным...

Андрей Параничев 10.08.2008 16:49

Kolyaj,
Многие используют document.write не в том контексте, для которого он сделан, а именно, используют вызовы document.write уже после события load документа, хотя метод document.write был сделан для вывода строк во время рендеринга документа.

Для унификации подходов по добавлению и изменению элементов страницы лучше повсеместно использовать DOM, а не связку document.write() + DOM. Тем более, что использование только DOM в некоторых случаях ускорит выполнение скрипта на странице.

Кроме всего прочего, document.write несовместим с XML, поэтому он не работает в документах, сверстанных по спецификации XHTML. Тем не менее, вопреки тому что я думал, document.write не является не рекомендованным W3C методом. Так что "устаревший" на счет него, наверно, неправильно говорить.

Dmitry A. Soshnikov 10.08.2008 17:15

Цитата:

Сообщение от Kolyaj
с натяжкой могу понять, чем не угодила коллекция document.forms

читайте внимательней - я как раз говорил обратное (наверное, предложение не совсем удачно сформировано). А что за "натяжки" еще (мне, действительно, интересно)?

Цитата:

Сообщение от Kolyaj
но document.write вам что сделал?

почему мне?
http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite
http://www.w3.org/TR/WCAG20-TECHS/SCR21.html (description)
http://www.w3.org/TR/REC-html40/inte....html#h-18.2.3 (последний note)

ну и это - http://www.w3.org/WAI/GL/WCAG20/WD-W...008/#doc-write

Я его не отрицаю, просто не использую.

А теперь вы скажите, чем вам он угодил и что там за "натяжки"?

Цитата:

Сообщение от Андрей Параничев
Тем не менее, вопреки тому что я думал, document.write не является не рекомендованным W3C методом. Так что "устаревший" на счет него, наверно, неправильно говорить

http://www.w3.org/WAI/GL/WCAG20/WD-W...008/#doc-write - deprecated examples

Бухалыч 10.08.2008 17:37

По поводу глобальных/локальных переменных:
Разве функция работает не быстрей, если обращается к локальным переменным?

Kolyaj 10.08.2008 18:58

Dmitry A. Soshnikov, innerHTML тоже не используете?

Цитата:

Сообщение от Dmitry A. Soshnikov
А теперь вы скажите, чем вам он угодил

Я его использую там, где он уместен.

Dmitry A. Soshnikov 10.08.2008 19:49

Kolyaj, я что-то не пойму вашу позицию =)

Цитата:

Сообщение от Kolyaj
innerHTML тоже не используете?

использую; и хоть он не стандартизован W3C, innerHTML имеет меньше минусов (см. ссылки выше), чем document.write

Цитата:

Сообщение от Kolyaj
Я его использую там, где он уместен

объективно, я вижу только одно место - запись скрипта в документ, но это не касается обсуждаемого скрипта, поэтому ваша позиция весьма странная. Так что - давайте, - ради интереса - поменяемся местами - вы аргументированно доказывайте (естественно, с ссылками на официальные источники), а я послушаю про все "прелести" document.write (а также, все-таки, - что там за "натяжки", - ответ на которые вы игнорировали =).

ZoNT 10.08.2008 20:00

Цитата:

Сообщение от Бухалыч (Сообщение 4397)
По поводу глобальных/локальных переменных:
Разве функция работает не быстрей, если обращается к локальным переменным?

Быстрее, в некоторых случаях.

В данном же случае приходится в функции каждый раз создавать огромный массив. Соответсвенно создать используемые данные всегда лучше 1 раз...

Не стоит также забывать, что джаваскрипт - интерпретируемый язык... Так что чем больше строк - тем медленнее работает...

Dmitry A. Soshnikov 10.08.2008 20:06

ZoNT,

Цитата:

Сообщение от ZoNT
Быстрее, в некоторых случаях.

Во всех случаях.

P.S.: а вот к вопросу о памяти (если функция выступает в качестве конструктора) - лучше, ествественно, хранить однотипные сущности в одном месте (как правило - в прототипе конструктора).

ZoNT 10.08.2008 20:08

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 4405)
ZoNT,


Во всех случаях.

Код не видел - а уже утверждаешь...

Или ты хочешь, чтобы я тебе пример привёл с цифрами, а потом отнекиваться будешь???

Dmitry A. Soshnikov 10.08.2008 20:16

Цитата:

Сообщение от ZoNT
Код не видел - а уже утверждаешь...

почитай про scope-chain и как (в какой последовательности) производится поиск пропертей в нем (конкретный код тут не при чем)

Цитата:

Сообщение от ZoNT
Или ты хочешь, чтобы я тебе пример привёл с цифрами, а потом отнекиваться будешь???

ага, с удовольствием посмотрю, всегда интересно узнать что-то новое (только не "отнекиваться", а "принять правильную точку зрения, если она будет таковой" - но еще раз повторю - сначала стоит почитать 10.1.3 и 10.1.4)

ZoNT 10.08.2008 20:34

<html>
<body>
<script type="text/javascript">
// local var
function F1(){
	var a = [];
	for (var i=0;i<1000;i++) a.push(i);
	
	var str = [];
	for (var i=0;i<1000;i+=10) str.push(a[i]);
}

var start = new Date();
for (var i=0;i<1000;i++) F1();
var res1 = (new Date())-start;
//**********************************


// Global var
var arr = [];
for (var i=0;i<1000;i++) arr.push(i);

function F2(){
	var str = [];
	for (var i=0;i<1000;i+=10) str.push(arr[i]);
}

start = new Date();
for (var i=0;i<1000;i++) F2();
var res2 = (new Date())-start;
//**********************************


alert([res1,res2]);

</script>
</body>
</html>

Dmitry A. Soshnikov 10.08.2008 20:46

ZoNT, ты утверждаешь яро что-то, пытаясь аргументировать практически, - это смело, я ценю, но, дружище, давай так - если приводишь практические примеры, то, пожалуйста, без мухлежа =) Твой опыт (если все по-честному относительно локальных/глобальных переменных) должен быть таким:

<html>
<body>
<script type="text/javascript">
// local var
function F1(){
    var a = [];
    for (var i=0;i<1000;i++) a.push(i);

    var str = [];
    for (var i=0;i<1000;i+=10) str.push(a[i]);
}

var start = new Date();
for (var i=0;i<1000;i++) F1();
var res1 = (new Date())-start;
//**********************************


// Global var
var arr = [];
var str = [];

function F2(){
    for (var i=0;i<1000;i++) arr.push(i);
    for (var i=0;i<1000;i+=10) str.push(arr[i]);
}

var start = new Date();
for (var i=0;i<1000;i++) F2();
var res2 = (new Date())-start;
//**********************************


alert([res1,res2]);

</script>
</body>
</html>


И тогда результаты соответсвуют теории. А вообще, повторю снова, сначала теория - 10.1.4 Scope Chain and Identifier Resolution

Kolyaj 10.08.2008 21:09

Цитата:

Сообщение от Dmitry A. Soshnikov
использую; и хоть он не стандартизован W3C, innerHTML имеет меньше минусов (см. ссылки выше), чем document.write

По ссылкам выше innerHTML стоит в одном ряду с document.write, поэтому, если вы приводите их в пример, то вы бы не должны использовать ни то ни другое. И какие минусы есть у document.write, которых нет у innerHTML?

Цитата:

Сообщение от Dmitry A. Soshnikov
я вижу только одно место - запись скрипта в документ, но это не касается обсуждаемого скрипта, поэтому ваша позиция весьма странная.

Запись скрипта в документ как раз удобнее производить методами DOM. Мои слова к данному скрипту вообще не относятся, впрочем как и ваши
Цитата:

Сообщение от Dmitry A. Soshnikov
часто встречаются конструкции, которые на сегодняшний день лучше не использовать

Именно в отрицании этой категоричности и состоит моя позиция. Для каждой задачи оптимален свой инструмент. Данный скрипт я щас вообще не обсуждаю.
Самый яркий пример использования document.write -- вывод текста на страницу только при условии включенного JS.

Цитата:

Сообщение от Dmitry A. Soshnikov
а также, все-таки, - что там за "натяжки", - ответ на которые вы игнорировали

Прочитайте пост повнимательнее.

ZoNT 10.08.2008 21:34

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 4409)
ZoNT, ты утверждаешь яро что-то, пытаясь аргументировать практически, - это смело, я ценю, но, дружище, давай так - если приводишь практические примеры, то, пожалуйста, без мухлежа =)

Ну вот ты и начал оправдываться... А говорил-то, говорил...

Читай выше - я отвечал на конкретный код - это раз.
Твоё утверждение "Во всех случаях", как видишь, неверно - это два.
Ну и три - я не уважаю людей, которые не могут признать что они ошиблись...

ZoNT 10.08.2008 21:37

Цитата:

Сообщение от Kolyaj (Сообщение 4410)
И какие минусы есть у document.write, которых нет у innerHTML?

Я писал выше: при загруженном документе document.write его затрёт. соответственно таким образом добавить содержимое не удастся... А спомощью innerHTML - удасться...

Dmitry A. Soshnikov 10.08.2008 21:38

Kolyaj,

Цитата:

Сообщение от Kolyaj
то вы бы не должны использовать ни то ни другое. И какие минусы есть у document.write, которых нет у innerHTML?

почему не должен? я написал - "я его (document.write) не отрицаю, я его просто не использую". Но "должен - не должен" - это уж излишне. По поводу минусов - найдете в тех же ссылках выше.

Цитата:

Сообщение от Kolyaj
Запись скрипта в документ как раз удобнее производить методами DOM

А я и не отмечал, что удобней, а что нет (не переверайте суть). Я лишь привел один из "плюсов" document.write'a, пытаясь оправдать вашу позицию.

Цитата:

Сообщение от Kolyaj
Самый яркий пример

ну давайте теперь "потускнее" примеры (штучек 5) =) в ваших проектах, например, - каков процент в коде занимает document.write?

P.S.: я надеюсь, хотя бы, основная позиция у вас верная - найти истину, а не пытататься отстоять то, что может не так и важно =)

Dmitry A. Soshnikov 10.08.2008 21:46

ZoNT,

Цитата:

Сообщение от ZoNT
Ну вот ты и начал оправдываться

Демагогия. Я хотел тебя подбодрить, т.к. ты привел абсолютно некорректный пример (при этом я предоставил исправленный, который явно показывает, что ты не прав). Ты это не оценил =)

Цитата:

Сообщение от ZoNT
Читай выше - я отвечал на конкретный код - это раз.

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

Цитата:

Сообщение от ZoNT
Твоё утверждение "Во всех случаях", как видишь, неверно - это два.

Где? =) В моем подкорректированном (верно подкорректированном!) примере все верно - обращение к локальным переменным - быстрее, нежели к глобальным из локального скопа (в данном случае - из функции) =) Если ты имеешь в виду, обращение к глобальной переменной из глобального скопа - то это частный случай локальной переменной - объект window сам является variable object'ом (10.1.3) для глобальных переменных (и этот частный случай не касается обсуждаемого вопроса).

Цитата:

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

В смысле? Себя? =)

Давай так:

- что не понятно в 10.1.4? Я расскажу, если надо (на этом сайте в статье про замыкания тоже говорилось про scope chain - можно сначала ее прочесть).
- что не понятно в твоем подкорректированом примере? У тебя какие-то странные результаты? Может, второе число меньше первого? =)

ZoNT 10.08.2008 21:55

Ну вот, отмаза одна за другой... Ну как так можно... Знал я одного такого на другом форуме, так его ник стал именем нарицательным...

Dmitry A. Soshnikov 10.08.2008 21:58

ZoNT, говори по существу, хватит демагогировать Ты ж толком не можешь привести подтверждение своих слов и уж тем более не можешь опровергнуть мои; как следствие - переход на личности, явный признак, что человек не разбирается в том, о чем ведет беседу. А переход на личности - это уже нарушение правил (не нужно =).

Андрей Параничев 10.08.2008 21:58

ZoNT,
Вы в свою пользу никаких аргументов не привели, кроме одного, очевидно неверного в контексте задачи примера.

ZoNT 10.08.2008 22:01

Ну уж если ты считаешь, что случай с инициализацией переменной (массива) в глобальном контексте - это уже не случай, то млжешь считать что ВСЕГДА быстрее.

К сожалению, я программист, поэтому не могу отрицать очевидного...

Kolyaj 10.08.2008 22:01

Цитата:

Сообщение от ZoNT
при загруженном документе document.write его затрёт.

Это не недостаток, а особенность.

Цитата:

Сообщение от Dmitry A. Soshnikov
я написал - "я его (document.write) не отрицаю, я его просто не использую".

Ненене, сначала было
Цитата:

Сообщение от Dmitry A. Soshnikov
часто встречаются конструкции, которые на сегодняшний день лучше не использовать (например, часто видно - document.write(...)

А уже потом оказалось, что это лично вы его не используете.

Цитата:

Сообщение от Dmitry A. Soshnikov
ну давайте теперь "потускнее" примеры (штучек 5) =) в ваших проектах, например, - каков процент в коде занимает document.write?

Вы знаете, я ни разу не использовал Math.PI. А вы? Подустарела константа-то.

ZoNT 10.08.2008 22:02

"неправильный пример" - я долго смеялся...

ZoNT 10.08.2008 22:04

Kolyaj, товарисч Dmitry A. Soshnikov сегодня что-то не то съел наверное...
Не спорь с ним! Он ВСЕГДА прав...

Dmitry A. Soshnikov 10.08.2008 22:15

Цитата:

Сообщение от Kolyaj
Ненене, сначала было

Было и есть, никуда не делось. В W3C написано - deprecated, а то что я - использую или нет - это не касается вопроса. И я не категоричен - читая чье-то мнение - вы можете его принять или нет, никто не навязывает. Как правило, если это "чье-то мнение" подтверждается какими-то официальными источниками, его можно принимать и не считать навязыванием.

Парни, давайте так - либо по существу, либо - прикрываем тему, без толку болтать смысла нет (особенно, если кто-то и не хочет учиться и разбираться, как работает JavaScript).

ZoNT, если захочешь разобраться в сути (больше, чем на дилетантском уровне) - больше читай спецификацию. Разговор окончен.

ZoNT 10.08.2008 22:23

Вау, меня списали в дилетанты :)

Ну ничего, придётся искать, чего бы ещё почитать про жс, чтобы не быть дилетантом и узнать что-нибудь новое...

Kolyaj 10.08.2008 22:24

Цитата:

Сообщение от Dmitry A. Soshnikov
особенно, если кто-то и не хочет учиться и разбираться, как работает JavaScript

А JavaScript здесь вообще не при чем. Это в объектной модели документа (DOM) XHTML нет document.write и innerHTML. Если я пишу страничку на HTML, то по всем стандартам я могу их использовать.

Dmitry A. Soshnikov 10.08.2008 22:30

Kolyaj,

Цитата:

Сообщение от Kolyaj
А JavaScript здесь вообще не при чем

А фраза и не вам была адресована.

Цитата:

Сообщение от Kolyaj
Если я пишу страничку на HTML, то по всем стандартам я могу их использовать

да пожалуйста, еще раз - кто ж запрещает-то? =) Повторяю - высказывается мнение - принять или нет - решаете вы, но считать сразу за навязывание - не верно. Все, на этом тоже закончим - а то из пустого в порожнее получается.

Kolyaj 10.08.2008 22:37

Слив защитан.

Андрей Параничев 10.08.2008 22:40

ZoNT,
Цитата:

Сообщение от ZoNT
"неправильный пример" - я долго смеялся...

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

Kolyaj,
Вы не правы, и document.write() и innerHTML не рекомендованы W3C, о чем и было написано в начале темы. Вы можете использовать их, если хотите. А не наоборот, можете не использовать их, если хотите.

Dmitry A. Soshnikov 10.08.2008 22:47

Цитата:

Сообщение от Kolyaj
Слив защитан

Какой слив опять? =) Тоже давайте по существу говорите. Еще раз спрашиваю - цель какова? Уже все выяснили относительно document.write. Есть куча недостатков (хоть вы и, (почему-то; почему?) утверждаете, что это особенности - т.е., утверждая, вы сами себе противоречите), относительно innerHTML и DOM-методов. Более того, свойство "особенность" вполне себе может быть "недостатком". Я не вижу смысла разводить пустой разговор. Если он есть (смысл) - скажите - я подключусь. Но просто кидаться словами (про сливы =)) - не нужно.

ZoNT 10.08.2008 23:01

Цитата:

Сообщение от Андрей Параничев (Сообщение 4429)
Во втором тесте в вашем примере вы не использовали глобальные переменные, а использовали 2 локальные в своих областях видимости. Если уж пишите, что быстрее работает с локальными не во всех случаях, то пишите пример с локальными переменными и такой же пример с глобальными.

Поясняю:
1) первый тест: локальная переменная a (инициализируется локально, на то она и локальная).
2) второй тест: глабальная переменная arr (инициализируется глобально - для чего я и предложил топикстартеру перенести массивы из функций в глобальный контекст - см. пост №4).

Утреждение товарисча Dmitry A. Soshnikov`а:
"Во всех случаях."

Как видите - не во всех...

Андрей Параничев 10.08.2008 23:07

ZoNT,
Я и спрашиваю, где во втором тесте глобальная переменная? Точнее действия над глобальной переменной.
// Свойство window arr:
var arr = [];
// Действия над __локальной__ (в данном scope) переменной arr
for (var i=0;i<1000;i++) arr.push(i);
 
function F2(){
    // Локальная переменная str:
    var str = [];
    // Действия с локальной переменной, где
    // вставляется элемент глобальной (в данном scope)
    // переменной arr. Кончено, доступ к arr[] - быстрый.
    for (var i=0;i<1000;i+=10) str.push(arr[i]);
}


Часовой пояс GMT +3, время: 06:05.