Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Важные моменты в программировании на JavaScript, Неординарные ситуации 
:(
    Опции темы
Aliance
Дата 6.6.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Думаю, необходимо создать такую тему, где бы описывалось, что нужно знать и помнить человеку, программирующему на JavaScript.

Итак, прежде всего это контейнер, в котором все чудо и происходит.
Лучше всего писать полностью, так:
Код

<script type="text/javascript" language="JavaScript">
<!--

/* тут непосредственно сценарий */

// -->
</script>


Аттрибут type указывает на то, что это сценарий JavaScript (как MIME-тип)
Необязательный аттрибут language сообщает веб-браузеру, на каком языке написан сценарий. Это нужно для тех случаев, когда браузеры, не понимающие указанный язык, пропускают этот контейнер.
Значения:
  • JavaScript
  • VBScript
Спецификация HTML4 отвергает этот аттрибут, и отдает предпочтение аттрибуту type

Далее, часто возникает ситуация, когда необходимо динамически добавить тег <script>. Обычно дилетанты делают это так:
Код

document.write('<script>');
document.write('/* js */');
document.write('</script>');

Но это не есть корректно, т.к. интерпритатор JS, встречая закрывающий тег <script> - прекращает работу сценария, остальное выводится как код HTML. Соответственно правельно будет так:
Код

document.write('<script>');
document.write('/* js */');
document.write('<\/script>');
// или
document.write('<script>');
document.write('/* js */');
document.write('</sc'+'ript>');


Далее, стоит комментаровать свои сценарии и делать удобочиваемыми:
Код

function qwerty() { alert('jjjjj'); var a = b; var c = d; }

можно и нужно записать так:
Код

function qwerty() {
   alert('test');
   var a;
   id (a) {
      alert('aaa');
      if (true) {
         alert('true');
      }
  }
}


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

Еще одна интересная история случается, когда в качестве, скажем, индефикатора функции использовать глобальный метод или в качестве имени переменно - зарезервированное слово = то возникает ошибка времени исполнения. У меня такое случалось с таким кодом:
Код

function do() {
   alert('test');
}

Т.к. do - глобальный метод. Писалось о необходимости в наличии while (do/while - цикл)

Итак, постим сюда свои наблюдения и находки, изощрености и прочее. smile
PM MAIL WWW ICQ Skype   Вверх
Opik
Дата 6.6.2005, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Не помню, когда именно возникает. Вроде при несовпадении типов, например:
Код

<script>
   function plus()
   {
       el = document.getElementById("c");
       all = c.value + 1;  
       alert(all);
   }
</script>
<input type="text" id="c" value="10" /> <input type="button" value="+1" onclick="plus()" />

решение:
Код

<script>
   function plus()
   {
       el = document.getElementById("c");
      // parseInt - приводим к типу Число. и работаем с ним.
       all = parseInt(c.value) + 1;  
       alert(all);
   }
</script>
<input type="text" id="c" value="10" /> <input type="button" value="+1" onclick="plus()" />

PM MAIL Skype   Вверх
Aliance
Дата 6.6.2005, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата(Opr @ 7.6.2005, 00:42)
      el = document.getElementById("c");
      all = c.value + 1;

может так:
Код

var el = document.getElementById("c");
var all = el.value + 1; 

Но естественно, что результат будет не таким как ожидалось. Описал тут:
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=432827
PM MAIL WWW ICQ Skype   Вверх
Opik
Дата 6.6.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Aliance
да, я знаю. а чем плохо, что переменные становятся глобальными?
а разница toNumber или parseInt, второе как то мне больше нравится.
PM MAIL Skype   Вверх
Aliance
Дата 6.6.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата(Opr @ 7.6.2005, 00:54)
а разница toNumber или parseInt

она есть, я приводил примеры. Сам с таким столкнуля =)

Цитата(Opr @ 7.6.2005, 00:54)
а чем плохо, что переменные становятся глобальными

Это не плохо. Скорее обычные меры предосторожности. Ведь глобальную переменную создавать нужно только специально. Иначе можно забыть про это и навредить себе 8))
PM MAIL WWW ICQ Skype   Вверх
Opik
Дата 6.6.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Aliance
ок, учту. (про глобальные переменные.).
Однако parseInt - аналог intval в PHP. Она поступает полностью аналогично. Я выбрал её не случайно.
PM MAIL Skype   Вверх
Sardar
Дата 7.6.2005, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Цитата(Opik @ 6.6.2005, 22:54)
а чем плохо, что переменные становятся глобальными?

Если функция вызовет сама себя рекурсивно или где в других функцих используються те же имена(часто итератор i) то появляються трудно находимые глюки smile

Помимо обьявления локальных переменных в функциях (var peremennaja), не стоит забывать что JS это обьектно - (*) язык (звёздочку понимайте как хотите лишь бы вам думать не мешало smile ). Если пишем что то, то создавайте сущности описывающие процесс или обьект. Например меню(контейнер), в меню опции и т.д. а не просто массивы. Ваш код станет более прост и читабельней, ведь:
Код
menuSet.show("submenu3"); //читаеться проще чем 
show_menu(menuset["submenu3"], true);

Естественно код становиться короче и проще, ведь код в каждом обьекте будет описывать всё необходимое для работы только с этим "типом" обьекта.

Полезно не пользоваться старыми способами адресаций типа: document.all или просто document.что_либо. Во первых это ведёт к не переносимому на новые платформы коду. Во вторых коллекции содержат элементы не только по идентификатору, но и по имени, в результате получаем коллизии имён/ИД. Нет стандартного действия в такой ситуации, браузер может выдать список всех элементов с таким именем/ИД или просто первый встречный элемент.
Вывод: задаём уникальные идентификаторы(а это не всегда нужно smile ) необходимым элементам, выбираем сие по document.getElementById

На счёт идентификаторов третий совет: елси вы генерите скриптом кучу кода(допустим меню), то не задавайте вашим субэлементам идентификаторы типа ("префикс_"+счёчик). Гораздо проще положить все элементы в дополнительный контейнер(например div) и работать с элементами через W3C DOM. Другими словами задайте правильную логичную структуру тому что вы генерите и это сыграет вам на руку.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Dave
Дата 28.7.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 17.6.2004

Репутация: нет
Всего: 1



Цитата(Sardar @ 7.6.2005, 01:34)
Цитата(Opik @ 6.6.2005, )
а чем плохо, что переменные становятся глобальными?

Если функция вызовет сама себя рекурсивно или где в других функцих используються те же имена(часто итератор i) то появляються трудно находимые глюки smile

то есть в ф-ии когда пишем var variable_name
то переменная локальная а если без var то глобальная, я правильно понял ?
а как поступить с итератором i в ф-ии чтобы он был локальным? написать предварительно var i =0; ?


...кажется нашел, в ф-ии в цикле можно так написать
Код

 for(var i=0; i<arguments.length; i++) ...


Это сообщение отредактировал(а) Dave - 28.7.2005, 12:33
PM MAIL   Вверх
Гость_12345
Дата 7.12.2005, 15:14 (ссылка)    |    (голосов: 2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Приёмы в написании кодов JS.
Для сокращения длинных записей и улучшения читаемости:
Код

1. d=document;

2. Ev='if(!e)e=event;';
   d.onclick=function(e){eval(Ev); ... ( обращаться к event через e) } 
    //--для кроссбраузерного доступа к событию в обработчике события
   <... onClick=func(event) ...>

3. function func(e){ ... ( обращаться к event через e) } 
    //--для вызываемой функции по событию

4. <... onClick=return!1 ...> -- вместо <... onClick="return false" ...>
   //вообще, <... onClick=любой_текст_JS_без пробелов_не требует_кавычек ...>
   //например, <... onClick=a=b=12345;alert('click\x20on\x20tag')>

5. d.ID=function(I){return this.getElementById(I);}
    //--чтобы вызывать не document.getElementById('...'), а
   d.ID('...')

6. А=[1,2,3];        //а не A=new Array(1,2,3);
   A=[];        //а не A=new Array();
   Im=[new Image(),new Image()];    //а не Im=new Array();for(i=0;i<2;i++)Im[i]=new Image();

  Вверх
Гость_12345
Дата 7.12.2005, 15:15 (ссылка)    |    (голосов: 2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код
7. if((Src=FF?e.target:e.srcElement).id.charAt(0)!="x") ... ;
    //--объявлять переменные по ходу использования, а не заранее,как в 
    Src=FF?e.target:e.srcElement;
    if(n.id.charAt(0)!="x") ... ;

8. if(self.win1 && win1.document && win1.document.formInWin1) ...;
    //--пользоваться невычислением выражений после && , если первый аргумент false

9. alert([12,23,aaa,xxx]);    //чтобы не писать +" "+ вместо запятой.

10. v='visible';hid='hidden';
    (...).style.visibility=v;    (...).style.visibility=hid;

11. setTimeout(func,500);    //запуск функции с задержкой без аргументов

12. (function func(){alert(999);})()    //запуск функции в контексте объявления

  Вверх
Sardar
Дата 7.12.2005, 17:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Цитата
Для сокращения длинных записей и улучшения читаемости:

Не согласен, d менее читаемо чем document, наработано опытом smile

2) а зачем eval то?

4) одна из самых плохих привычек - опускание кавычек. Такой код не читаем стандартными парсерами, это кстати одна из причин создания XHTML. Совет вем: не опускайте кавычки и не сокращайте логичное и ясное false до !1

5) DOM придумывался как стандартный интерфейс к деревьям документов. Имена методов долзны запоминаться как они есть, т.к. помимо JS есть и другие языки, где W3C DOM актино используеться и имена те же самые. document.getElementById сразу ставит все точки над i, d.ID вводи в заблуждение выигрывая несколько символов в коде... не на том экономишь smile

7) люблю так писать, но большинство народу не любят такую запись, т.к. менее читаема. Согласен с ними, но по прежнему пишу кратко smile

9) можно и так alert([12,23,aaa,xxx].join(' ')); с пробелом, кстати технически этот код не обязательно тeрбует больше ресурсов чем просто со строками, в своём Trilobite Scripting Language (скриптовое окружение для eZ80) выбрал стратегию экономить на памяти, с массивом код по идее должен отрабатывать быстрей. Не знаю как реализованно в JS браузера.

10) и зачем эти пару символов экономить, нужно думать над алгоритмом, писать эффективно. Сэкономленные пара байт не заметны для пользователя, даже если он на самом убогом модеме, за то ты сам будешь долго материться если придёться переделывать такой код года через полтора smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ciber SLasH
Дата 7.12.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Полностью согласен с Sardar.

2Гость_12345:
Твой код иногда сложновато разобрать, приходится повторно смотреть, что же это за d.<что-то>. Конечно я согласен с: "Если писать только для себя скрипты и разработать определённые правила (типа: d - это document; d.ID - это document.getElementById), то конечно можно писать как можно меньший код, опуская точки с запятой, придумывать ещё какие-то сокращения, бороться за байты в документе... Но если твой код прийдётся смотреть другим людям, то у них явно возникнут проблемы с пониманием твоего кода."
PM   Вверх
Гость_12345
Дата 13.12.2005, 17:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Sardar: я перечислил выработанные для себя правила, например, знаю, что в своём коде не буду занимать имена d, v, hid, d.ID и некоторые другие под другие переменные. Некоторая надстройка над языком, принятая 1 раз и помогающая не отвлекаться на длинные имена и длинные выражения с длинными именами. У других - другие условности. Когда читаешь чужой код и есть желание разобраться, приходится учитывать.

2) а зачем eval то?
Чтобы 1 раз написать вверху кодов, а потом знать, что в каждом обработчике приводится объект event к имени "е". Обработчиков много, и тогда несущественные формальности мешают читать суть.

alert([12,23,aaa,xxx].join(' ')); не хочу ради краткости, при отладке.

5) DOM придумывался... document.getElementById), ...
Другие языки будут с этими проблемами разбираться сами, а здесь она решается так.

> нужно думать над алгоритмом, писать эффективно
согласен, а эти приёмы мне помогают читать алгоритм в коде.

4) одна из самых плохих привычек - опускание кавычек. Такой код не читаем стандартными парсерами...
пока не использую парсеры и не планирую использовать их, не собираюсь утруждать себя следованию стандартам, написанным не для живого HTML. Так же, как var имя_переменной=...; в функциях. Когда задача перерастёт установленные рамки, это будет заметно по задаче, тогда и переучимся. Пока этого нет, не надо засотрять текст несущественным. Сравните: мы произносим слова так, чтобы это было понятно собеседнику, а не так, как написали бы то же самое в книге, чтобы удовлетворить всем. На этом пути начал Перл, но он же и рухнул под массой условностей - $i="$j$k";print$i; Ничего - взяли лучшее и пошли дальше.

Ciber SLasH У меня тоже возникают проблемы, когда экран засорён длинными выражениями с малым содержанием, какого размера экран бы ни был.
  Вверх
Sardar
Дата 14.12.2005, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Гость_12345 - явно минималист smile
Интересно что сам таким был, пока не столкнулся с коллективной разработкой. Не под каким либо давлением, а "по собственному разумению" врдруг приходишь к тому что писать нужно ясно и не забывать о коментариях, которые порой больше чем сам код smile

В любом случае я не советую другим пользоваться твоми приёмами, больше проблем.

Цитата
Чтобы 1 раз написать вверху кодов, а потом знать, что в каждом обработчике приводится объект event к имени "е". Обработчиков много, и тогда несущественные формальности мешают читать суть.

Код что в eval можно сразу вписать в функцию, всё равно меняться не будет, лишняя потеря в производительности.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Гость_12345
Дата 14.12.2005, 13:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











> Код что в eval можно сразу вписать в функцию
Когда речь о производительности, а не о наглядности, то другое дело. И d.ID придётся развернуть.

О комментариях не забываю, до коллективной работы не доходил. : )
  Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.