Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Прошу помощи в написании формы записи на приём  (Прочитано 78458 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #60 : 16-02-2014 00:30 » 

Я обращаю твое внимание что запись о времени мы не УДАЛЯЕМ, а изменяем...

И... Я говорю пока о хранилище (с типом хранилища мы пока не определились)
Сейчас нужно определиться с основными сущностями.

Подготовка данных для вывода (это исходные данные - административная функция, сейчас - она статика)
Форма ввода - некий шаблон имеем.
Обработка входных данных - сейчас как раз этим и занимаемся. Т.е. нужно правильно описать действия.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #61 : 16-02-2014 08:12 » 

Sla, И всё же, почему такое упорное желание кидаться программировать, не имея зафиксированных требований и проекта (дизайна)? Чтобы потом всё стереть и переписывать заново? И всё ради того, чтобы человек поскорей какой-нибудь SQL-запрос написал? Он же сказал, что хочет сделать форму и научиться на этом. А не выполнить набор разных упражнений на тему формы.

Kaspiy, о картинке.

На мой взгляд, ты напрасно ФИО вверх вытащил. Дело в том, что заполнение этих текстовых полей - самое трудоёмкое занятие. Т.е. нужно исходить из того, что пользователь зашёл не туда. И поэтому он должен быстро понять это, чтобы уйти и не париться с клавиатурой.

Поэтому сценарий такой:

- Выбор физик/юрик/ИП - это нужно для сокращения вариантов выбора действий, он на раннем этапе. Тут пользователь всяко что-то выберет. Уйти на этом шаге может разве что иностранец Улыбаюсь К этому моменту пользователь напрягся для 0-1 клика.

- Выбор категории - тут пользователь может обнаружить, что нотариус не оказывает интересующего его услугу, и может уйти. К этому моменту пользователь напрягся для 1-3 кликов.

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

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


Далее: интересно, что будет после нажатия кнопки "Записаться"? Если ничего, то это как-то нелогично. Нужно же как-то информировать, что запись благополучно осуществлена.


Затем ещё вот такое соображение. Если пользователь пришёл не по одному, а сразу по нескольким делам, как ему быть? То, что мы обсуждали, предполагает выбор 1 темы для визита в 1 единицу времени. Можно ли выбрать сразу много нотариальных действий? И правильно ли будет впихивать их в одно время? Или в таком случае понадобится интервал времени? Или надо как-то циклически делать: выбрал действие - выбрал время, выбрал следующее действие - выбрал следующее время. Т.е. групповые записи?

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

Если же делать записи группой, где-то после календаря появится дополнительная рубрика "Вы планируете записаться", и там табличка из двух колонок:
- действие
- дата и время
Каждую строчку можно удалить или изменить.

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

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

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

Затем поля ввода текстовой информации нуждаются в хотя бы в простейшем контроле. Это делается при помощи так называемых "валидаторов". Т.е. поле подсвечено цветом или рядом с ним находится иконка, которая показывает, поле примет текущие введённые данные или в них есть какая-то ошибка. Это чистая динамика, на статической компоновке никак не сказывается.

Ты не прокомментировал мой пункт насчёт постепенного открытия нижних частей формы.

Других замечаний к форме у меня нет.
« Последнее редактирование: 16-02-2014 08:15 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #62 : 16-02-2014 10:31 » 

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

Минимальная форма - показана.
Зачем Мы сейчас обсуждаем юзабилити формы?

Перед клиентом должно быть вывешено расписание работы

Где оно? А мы уже определяем о чем клиент будет говорить с нотариусом
Это как запись к врачам-специалистам. Чтоб не терять время - будем искать оптимальный вариант посещения поликлиники.
Так и здесь. Это административные вопросы. Сейчас их не обсуждаем.
Сейчас задача - ФОРМА ЗАПИСИ.
Три дня существует уже заготовка формы, а мы топчемся на месте... потому что кнопочка не того цвета (не по феншую).
 
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #63 : 16-02-2014 12:32 » 

Sla, отчего же не решим? Сначала нужно понять цель, к которой двигаться. Затем разложить её на подцели и поэтапно решать задачу.

Цитата: Sla
Зачем Мы сейчас обсуждаем юзабилити формы?
Потому что из него следует, что вообще пользователь делает, что не делает, что должен, что может, и по каждому пункту принимается решение "будет так". Формируется список фич (features), потом их упорядочиваем по важности и каждую делаем. Все фичи в любом софте идут от требований к пользовательскому интерфейсу (хоть для людей, хоть API):
- должно быть понятно, какие операции над какими объектами может выполнять пользователь при помощи интерфейса;
- должно быть понятно, ради какого внешнего эффекта предпринимается то или иное действие (трассировка требований).
Сложные фичи, за которые не очень понятно, как браться, и какими характеристиками они будут обладать, можно сделать кривым прототипом на коленке, чтобы понять, как это будет работать, а потом переделать нормально, уже имея полное знание, что и как делать. В этой задаче ничего такого сложного нет. Простые делаются сразу. Но в основе должен лежать каркас, который наращивается (инкрементируется), а не переделывается полностью под каждую новую "хотелку" или "ой, мы тут не подумали".

Цитата: Sla
Перед клиентом должно быть вывешено расписание работы

Где оно? А мы уже определяем о чем клиент будет говорить с нотариусом
Задача называется "запись на приём", а не "отображение расписания". Отображение расписания - это вообще форма для нотариуса, который может видеть, какие люди в какое время по каким вопросам к нему придут. А также он же должен сообщать системе, какие часы в будущем он выделяет свободными для записи. И это вообще другая отдельная задача и другая отдельная форма - для внутреннего употребления.

Цитата: Sla
Это как запись к врачам-специалистам.
По-моему, это запись к нотариусу. Поэтому не "как", а с учётом специфики именно этой профессии. Зачем врачи? Ну разумеется много общего, только автор для врачей, как я понимаю, ничего не делал, поэтому ему от такой аналогии ни холодно, ни жарко.

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

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

По поводу часов: мы ещё не видели, как автор справляется с простыми вещами, вроде ввода ФИО. Может не очень справляется - потренируется "на кошках", с JavaScript поиграется, и потом займёмся расписанием.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #64 : 16-02-2014 12:57 » 

Dimka, хорошо,давайте тогда расположим все так.
Я писал:"После нажатия на кнопку "Записаться"  пользователь видит сообщение, в котором говорится, что человек зарегистрировался и еще раз указывается время, число и место, где будет проходить приём.Это же сообщение дублируется в письме, которое получает пользователь на свой e-mail.

Что касается времени...Как я понимаю, одни вопросы требуют больше времени,чем другие. Возможно, надо привязать категории к временному промежутку? Например "Согласия" будут занимать по 15 минут, "Заявления" 30 минут, а остальное по часу.
Да,нужно сделать чтобы пользователь мог записаться по нескольким вопросам. Тогда,наверное, будет удобнее сделать так, как в примере Sla. У Sla есть поле , в котором мы выбираем время и после этого появляется еще одно поле с часами. Можно сделать так же с категориями. Чтобы было поле для категории с выпадающим списком категорий( следовательно, большие панели отпадают) и рядом с ними будет время.
Справа от этих часов должна быть иконка "+", которая будет создавать при нажатии еще одно поле для выбора категории.

Если информация в поле не соответствует требованиям - поле подсвечивается красным.

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

Sla , тогда что мне сейчас следует расписать/прочитать/сделать?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #65 : 16-02-2014 13:00 » 

Все верно, почти.

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

Но принцип один:  болт, гайка, шайба.


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

Почему говорю о расписании -  потому что это условия ТЗ - запись на прием = болтовое соединение.
Опять же Расписание - административная функция - и мы не можем от него отойти.


И нет никаких фич...  Они существуют, но они инкапсулированы.

Вот приблизительная обработка...

Код:
IF (POST) {
  IF (VALIDATE) {
       IF (SAVE){
           OUT="все хорошо"
       } else {
           OUT ="сообщения об ошибке сохранения"
       }
  } else {
    OUT = "начальные условия" + "сообщения об ошибке валидации"
  }
} else {
  OUT = "начальные условия"
}

Что в этом коде не учтено?

Зачем здесь юзабилити?
Опять же... болтовое соединение может находиться в труднодоступном месте. Соответственно форма гайки, или головки болта может быть видоизменена, при имеющемся расчете нагрузок соединения,  это и будет часть юзабилити. Это повлияет на удобство механических работ (закрутить/открутить), но не надежность самого соединения.

Я тоже на данном этапе не программирую, а учитываю технологические нюансы. Ты инженер, и тебе пофик как оно будет внутри Улыбаюсь Я - технолог - мне описывать процесс.


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #66 : 16-02-2014 13:08 » 

Kaspiy, ты на нас не обращай внимания... Впитывай об(ео)их.


Цитата
Sla , тогда что мне сейчас следует расписать/прочитать/сделать?

Составить расписание.
Или еще лучше..
Описать как расписание выглядит.

Напоминает школьный дневник?
Напоминает вузовское расписание?
Напоминает запись к врачу?
Свое видение.

И сразу же... Да... так не хочет Dimka ...  создание заглушек (mock), что позволит быстрее отладить готовую систему
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #67 : 16-02-2014 13:31 » 


Вот приблизительная обработка...

Код:
IF (POST) {
  IF (VALIDATE) {
       IF (SAVE){
           OUT="все хорошо"
       } else {
           OUT ="сообщения об ошибке сохранения"
       }
  } else {
    OUT = "начальные условия" + "сообщения об ошибке валидации"
  }
} else {
  OUT = "начальные условия"
}

Что в этом коде не учтено?

Возможно, здесь не учтено,  что во время регистрации одного пользователя,другой пользователь уже занял выбранное время? Тогда надо будет добавить:
Код:
 
} else {
  OUT = "Простите, но это время только-что было занято другим пользователем"
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #68 : 16-02-2014 13:34 » 

Цитата: Kaspiy
Возможно, надо привязать категории к временному промежутку?
Возможно. Это уж тебе надо выяснить - можно ли так сделать или нельзя. Это на структуру модели влияет.

Итак, множественная запись: один человек по разным делам в разное время (или подряд, если позволяют свободные часы).

Чуть позже напишу про архитектуру.

Цитата: Sla
Почему говорю о расписании -  потому что это условия ТЗ - запись на прием = болтовое соединение.
Опять же Расписание - административная функция - и мы не можем от него отойти.
Ну если к машиностроительным аналогиям обращаться, то я бы сказал, что при изготовлении любого изделия на станке 80% успеха зависит от оснастки Улыбаюсь А то вот ещё Dale подтянется с модульным тестированием Улыбаюсь

Цитата: Sla
Что в этом коде не учтено?
То, что это - не консольная программка на коленке, а многокомпонентный программный комплекс, состоящий как минимум из клиента (браузера), серверной части и СУБД Улыбаюсь Соответственно, главная интрига заключается в том, что в каком месте должно работать и почему там.

Цитата: Sla
И нет никаких фич...  Они существуют, но они инкапсулированы.
И нет никакой динамики как следствие.

Цитата: Kaspiy
Kaspiy, ты на нас не обращай внимания... Впитывай об(ео)их.
Kaspiy, угу. Даже можешь делать одновременно. Мы пока ещё не пересеклись на строчках кода.

Цитата: Sla
И сразу же... Да... так не хочет Dimka ...  создание заглушек (mock), что позволит быстрее отладить готовую систему
Напротив. Я к ним и подхожу.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #69 : 16-02-2014 13:44 » 

Приёмные часы:
09:00-18:00

Блин =(( Я не очень понимаю, как можно реализовать привязку категорий к времени, которое уйдет на решение вопроса в этой категории. Как это вообще визуально будет выглядеть? Грубо говоря, за 1 час нотариус может принять максимум 6 человек, решение вопроса которых занимает 10 минут. Но ведь они могут выбрать вопрос и на 25, и на 30 минут. И каждый раз таблица часов должна вычитать эти минуты из целого часа и выдавать эту информацию в таблицу свободных часов. Надо будет формулу писать? А черт его знает...   Киплю х_Х
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #70 : 16-02-2014 14:31 » 

Kaspiy, визуально это может выглядеть: во-первых, как указание длительности интервала напротив каждого действия; во-вторых, пользователю выдаётся список свободных интервалов от-до. Показываются только те, в которые можно "впихнуть" действие. Также необходимо предусмотреть резервные "технологические перерывы". Потому что всегда могут быть накладки: пришёл человек на 10 минут, а занял 15 - и всё поехало до конца дня. Поэтому каждые, допустим, 2 часа резервируется 15 минут свободного времени, на которое нельзя записаться. Это время либо используется для устранения накладок и возвращения в график, либо, если всё хорошо, для отдыха нотариуса.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #71 : 16-02-2014 15:05 » 


Или можно дать список часов по часам, а после выбора часа будет выпадать еще один список с делением этого часа на минуты.
« Последнее редактирование: 16-02-2014 15:17 от Kaspiy » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #72 : 16-02-2014 15:27 » 

А то вот ещё Dale подтянется с модульным тестированием Улыбаюсь

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

И сразу же... Да... так не хочет Dimka ...  создание заглушек (mock), что позволит быстрее отладить готовую систему

Коли уж решили вступить на эту зыбкую почву в разделе для начинающих, то немного классики в тему.
« Последнее редактирование: 16-02-2014 16:19 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #73 : 16-02-2014 18:13 » 

Цитата: Dale
Помянешь черта - он и появится...
Никто никого чёртом не называл Улыбаюсь


Итак, вводная информация по архитектуре.

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

Подход "тонкий клиент"

Браузер только отображает статический HTML, возможно поля форм, и отправляет заполненные формы на сервер. Абсолютно все действия по изменениям выполняются на сервере.

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

В этом случае страница оформляется по той схеме, которую я описывал на 1-й странице этой темы: model-view-controller.

Преимущества: работает в любом браузере (чего не скажешь о внешнем виде и стилях) без поддержки скриптов, почти на любых параноидальных уровнях безопасности.

Недостатки: гигантский трафик для сложных форм, поскольку на любой "чих" вся форма целиком отправляется на сервер и потом возвращается, порой обширные состояния страниц в hidden-полях и т.п. Этот большой трафик создаёт проблемы как для пользователя - страница "мигает" или вовсе долго перегружается (особенно если беспроводная сеть, телефон со слабым сигналом и т.п., наконец стоимость при помегабайтной оплате - хоть сейчас это уже и уходит в прошлое), так и для сервера крупных сайтов, который может просто "лечь". Ещё один недостаток - отсутствие динамического содержимого (хотя бы действий по таймеру, не считая мерзкого самопроизвольного обновления страницы, несовместимого с формами ввода).

Подход считается устаревшим и плавно сдаёт позиции.

Подход "толстый клиент"

Почти всё приложение реализуется в браузере в виде кода на JavaScript. Отсутствует всякая статическая вёрстка HTML. Сервер используется только как сервис, часто лишь программный интерфейс к базе данных - т.е. лишь обрабатывает запросы данных и принимает целиком готовые к записи в базу данные и больше ничего не делает. Ну дополнительные очевидные функции: рассылка почты, переадресация запросов к другим сервисам и т.п.

В этом случае весь сайт на сервере оформляется в виде единственного файла по умолчанию - очень короткого HTML index.html или default.html вида:
Код: (HTML)
<html>
  <head>
    <script type="text/javascript" src="scripts/mysite.js"></script>
  </head>
</html>
Всё остальное целиком и полностью реализует загружаемый скрипт - сам организует подгрузку требуемых других скриптов и стилей, сам динамически добавляет HTML элементы на страницу, которые подгружают картинки и т.п.

Работа клиента с сервером происходит по технологии AJAX - используется браузерный объект XMLHttpRequest, который умеет посылать запросы на сервер, не перегружая всю страницу целиком.

Преимущества: почти полная свобода  (особенно в HTML5) разных динамических элементов на странице, визуальных эффектов - на уровне настольного (desktop) приложения или апплетов Java, или Flash-приложений. Минимальный трафик, поскольку исполняемый код загружается лишь один раз, а все остальные обмены с сервером - лишь чистые данные, часто уже обработанные, проверенные на корректность и упакованные самим клиентом.

Недостатки: до сих пор встречающаяся браузерная несовместимость DOM-моделей страниц, что вынуждает писать более сложный JavaScript код, учитывающий особенности разных браузеров. Высокая трудность визуального оформления - мешает разделять работу программиста и дизайнера. Трудоёмкость визуальной отладки: для исправления ошибки в оформлении на пиксель порой надо перезапускать всё приложение. Из-за достаточной новизны не очень большое количество готовых framework и библиотек готовых решений для разработки.

Этим подходом активно пользуются в таком направлении, как браузерные игры - особенно после распространения HTML5, который во многих аспектах может потеснить Flash. Является альтернативой для разных Silverlight и JavaFX, но из-за отсутствия богатых библиотек в прикладном смысле пока ещё не может быть полностью заменён без серьёзных трудозатрат. Условно можно назвать Web 3.0.

Сейчас перспективный - к нему всё движется.

Между полюсами

Подавляющее большинство библиотек, платформ для сайтов и порталов, разных framework опираются на статически свёрстанный HTML с активным использованием JavaScript-кода для разных визуальных эффектов. Т.е. до сих пор исходят из того, что страница сайта - это скорее для чтения/отображения информации, нежели для активной работы пользователя. Водоразделом является использование и неиспользование AJAX. Все новые сайты и сайты с интерфейсом для активных действий пользователей (типа соцсетей) уже используют AJAX. Старые сайты, особенно ориентированные на публикацию текстов без возможностей комментирования и т.п. AJAX не используют. Этот форум, будучи старым, для основных функций AJAX не использует, но по мелочи (тот же чат) применяет.

Поэтому в учебных целях, во-первых, AJAX использовать стоит, во-вторых, при решении вопроса об использовании или неиспользовании статической вёрстки нужно ориентироваться на динамику. Где динамики нет - там статическая вёрстка: пишем HTML сами. Где динамика есть - там динамическая вёрстка: пишем JavaScript-код, который формирует HTML. Это можно комбинировать при помощи компонентов. Внутри компонента может быть статическая вёрстка, а загрузкой и удалением компонента может заниматься JavaScript-код. Можно и наоборот: внутри статической страницы разместить компонент с динамическим содержанием (на это напрашиваются календарь, список часов и т.п.)

Kaspiy, уточняющие вопросы:

1) Если эта форма не просто учебная вещь, а будет встраиваться в некий сайт, важно знать, на каком "движке" этот сайт построен, какие библиотеки использует. Поскольку форма по своей архитектуре должна в сайт вписываться и как с ним интегрироваться.

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

- тонкий клиент или промежуточное решение без AJAX (к этому ведёт Sla без всяких обсуждений, стоит туда ходить или нет), здесь не понадобится серьёзного погружения в JavaScript, достаточно владения PHP, т.е. этот путь проще;

- толстый клиент в предельной форме - самый сложный путь, но зато и самый интересный;

- промежуточное решение с AJAX - наиболее адекватное для странички в духе Web 2.0 по балансу простоты решения и возможностям разных динамических эффектов.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #74 : 16-02-2014 18:32 » 

Цитата
(к этому ведёт Sla без всяких обсуждений, стоит туда ходить или нет)
СТОЯТЬ!!!
Нет не веду...
Показанная мною форма не использует аякс.. но наличие некой функции onchange= showTime() - это mock, пусть и статический, но он уже существует!


Цитата
поскольку сами модули не нарисовались еще
Ну... почему же?
VALIDATE
SAVE
Чем не модули?



Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #75 : 16-02-2014 19:17 » 

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

P.S. Быстрее всего будет MODX
« Последнее редактирование: 16-02-2014 21:17 от Kaspiy » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #76 : 16-02-2014 21:22 » 

Ну... почему же?
VALIDATE
SAVE
Чем не модули?

Скорее всего, модули. Нет 100% уверенности, что это модули именно из этой самой программы.

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

Требования к модулям определяются требованиями к программе, а не наоборот - программа "может" то, что умеют заложенные в нее модули. И моки тут могут оказаться скорее данью "культу карго", чем принести реальную пользу (если речь действительно о моках, см. ссылку выше). Будут определены сценарии - другое дело. То же, кстати, относится и к формам - не имея проработанного presenter'а, рановато бы их рисовать. Иначе получится разработка и не "сверху вниз", и даже не "снизу вверх", а скорее "сбоку непонятно куда".

Впрочем, пожалуй, сей предмет лежит за рамками раздела "начинающим". Ибо дальше логично перейдем на "Presenter First", а вопрос был задан все-таки про форму... Опять же, мое сугубое IMHO с точки зрения agile, по-другому просто не умею.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Kaspiy
Участник

ua
Offline Offline

« Ответ #77 : 16-02-2014 21:40 » 

Друзья, так что же мне сейчас писать/делать/предлагать?))
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #78 : 17-02-2014 04:08 » 

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

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

Для разработки толстого клиента понадобится браузер с развитой системой отладки JavaScript-кода. Таким свойством обладают Chrome, IE 10 и выше. FireFox не смотрел, там вроде какой-то отдельный модуль.

P.S. Я сегодня буду на разных "выздных" мероприятиях, поэтому скорее всего напишу лишь вечером.
« Последнее редактирование: 17-02-2014 04:13 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #79 : 17-02-2014 09:07 » 

Вот еще одна вводная - будет движок...
Здесь что-то обстоятельное писать, связное - не... увольте.

Если modx - то милости прошу на сайт производителя, и читать, читать, читать, до посинения.
И начинать думать не кодом, а сниппетами и чанками.

Если что-то другое, то опять же. У каждого движка свои плагины, модули, конструкторы форм и прочее...

Поэтому...
Нужно остановиться на форме, развивайте с dimka представление, понадобится javascript - свистите.
Захотите что-то  оттестировать - предоставлю площадку.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #80 : 17-02-2014 12:00 » 

Ну так сниппеты и чанки - это и есть код, только в основном коде страницы он будет "компактнее", правда?))
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #81 : 17-02-2014 12:46 » 

Ну так сниппеты и чанки - это и есть код, только в основном коде страницы он будет "компактнее", правда?))
м.... сильно сомневаюсь
чанк, и сниппет это по сути php код. Надо только это понять. С modx сталкивался очень давно, поэтому... там ведь и версии разные evo и revo. Хоть и похожи, но.... А то что весь код, и шаблоны хранятся в базе... так что... пока занимайтесь отладкой самой формы - представлением.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #82 : 17-02-2014 15:52 » 

Ну так сниппеты и чанки - это и есть код, только в основном коде страницы он будет "компактнее", правда?))
м.... сильно сомневаюсь
чанк, и сниппет это по сути php код. Надо только это понять. С modx сталкивался очень давно, поэтому... там ведь и версии разные evo и revo. Хоть и похожи, но.... А то что весь код, и шаблоны хранятся в базе... так что... пока занимайтесь отладкой самой формы - представлением.


Ну я же об этом и говорю. Сниппеты можно создавать непосредственно в панели управления MODX. Помещаем в сниппет php код , а в общем коде вставляем этот сниппет,типа: "[!HEAD!]
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #83 : 18-02-2014 09:02 » 

А что молчим?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #84 : 18-02-2014 09:49 » 

Ну если мы проходим мимо движков... И в учебных целях это даже неплохо. Потому что любой движок и библиотека скрывают от разработчика некоторые вещи, которые считаются "само собой разумеющимися". Начинающий их попросту не знает, поэтому рассматривает библиотеку как шаманство: сделай как в мануале, получишь эффект такой-то. В итоге это может приводить к ряду глупостей из-за попыток нестандартного использования, которые знающему даже в голову бы не пришли. С другой стороны, всякая библиотека имеет хоть в чём-нибудь да ограниченное применение, и выходить за рамки порой приходится.

Начнём с языка JavaScript. Далее небольшая обзорная справка. Если в ней встречаются незнакомые слова - можно их пропускать.

Сам язык возник где-то в середине 90-х как упрощённая версия языка Java - отсюда название. Но к Java при этом никакого отношения не имеет - это языки, разные по своей идеологии. Java - язык ООП (объектно-ориентированного программирования) со статической типизацией переменных, классами, отсутствием указателей, сборщиком мусора и лежащей в основе виртуальной машиной среды исполнения. JavaScript - язык тоже ООП, с похожим на Java синтаксисом, но с динамической типизацией и без всяких классов, тоже без указателей и сборщиком мусора, но без виртуальной машины - поначалу чистый интерпретатор (т.е. каждую строчку кода разбирает как текст и выполняет отдельно), но сейчас, разумеется, JIT-компилируемый.

Язык JavaScript имеет несколько вариаций. Так Microsoft создала собственный вариант языка JScript с некоторыми мелкими отличиями, связанными с взаимодействием с COM-объектами. Этот язык помимо браузера доступен также в качестве средства написания сценариев автоматизации административных задач в среде WSH (Windows Script Host) - ныне плавно сдающей позиции новому средству PowerShell, этот же язык доступен в качестве серверного языка программирования веб-приложений по технологии ASP (Active Script Page) - считается полностью устаревшей. Версии языка JScript.NET и технология веб-разработки ASP.NET имеют мало общего с JScript и ASP. Например, язык JScript.NET является компилируемым, поддерживает статическую типизацию, классы и т.д. ASP.NET идеологически отличается от ASP всей архитектурой движка, обеспечивающего работу веб-приложений, методами проектирования и т.д. Под собственно JavaScript понимается язык, встроенный в браузеры - так повелось ещё с браузера Netscape Navigator, первым реализовавший скрипты на веб-страницах. В то же время есть вариант языка под названием ECMAScript, который не привязан ни к браузеру, ни к операционной системе, не имеющий средств ввода-вывода. Это вариант JavaScript в самом чистом и рафинированном виде. На него существует международный стандарт. И, соответственно, все частные компании, делающие собственную реализацию языка, так или иначе на этот стандарт ориентируются.

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

Ключевыми элементами языка являются:

1) Простые значения (строки - String, числа - Number, дата - Date, ошибка - Error, логическое значение true/false - истина/ложь, объект - Object, массив - Array, функция - Function, и некоторые вспомогательные: null - особое значение отсутствия значения, undefined - неопределённое состояние переменной). Аналогично PHP в JavaScript предполагается автоматическое выведение типов, т.е. строки могут преобразовываться в числа, числа в строки без явного указания со стороны программиста. Чтобы явно преобразовать значение одного типа в другой, достаточно название типа использовать как функцию, например:
Код: (Javascript)
Number("5") == 5.0
здесь строчка будет явно преобразована в число. Разумеется, не всякое значение может быть преобразовано во всякое. Поэтому тип чисел более широк, чем в других языках:

- во-первых, это всегда вещественное число двойной точности, целых чисел как таковых нет - это вещественные числа без дробной части;

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

- в-третьих, есть специальное числовое значение Infinity - бесконечность, причём она имеет знак; её можно получить делением на ноль, извлечением логарифма из нуля, тангенса пи/2 и т.п.

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

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

2) Операции (арифметические, логические, сравнения и т.п.) над значениями почти такие же, как в PHP, только с некоторыми отличиями.

В отличие от PHP в JavaScript нет отдельного оператора конкатенации строк - используется "+", и, соответственно, либо очень важно понимать, что именно складывается: числа или строки, либо вместо оператора сложения использовать соответствующий метод concat для конкатенации строк.

В отличие от PHP в JavaScript нет функций вроде count, sin и т.д. Вместо всех таких функций используются методы соответствующих объектов (об этом ниже).

3) Переменные в JavaScript не требуют никаких префиксов - не надо писать "$". Переменные тоже не обязательно объявлять, но лучше это делать. Например:
Код: (Javascript)
if(x == 3) /* и что-то дальше */
Вызовет ошибку - переменная x не существует, но из неё уже пробуют извлекать значение для сравнения. Однако
Код: (Javascript)
x = 3;
if(x == 3) /* и что-то дальше */
пройдёт (хотя быть может какие-то варианты языка это не примут), потому что здесь происходит автоматическое создание переменной с уже определённым значением. Более правильно, разумеется, писать:
Код: (Javascript)
var x = 3;
if(x == 3) /* и что-то дальше */
где служебное слово var как означает декларацию переменной. Нужно отметить, что выражение:
Код: (Javascript)
var x;
if(x == 3) /* и что-то дальше */
тоже сработает (хотя тоже некоторые варианты языка могут не принять). Просто объявленная переменная не имеет никакого значения, и её состояние undefined, но сама переменная есть - с ней можно работать.

По поводу undefined могут быть варианты:
- либо само служебное слово undefined рассматривается как вариант значения, сходный с null: его можно присваивать, с ним можно сравнивать;
- либо в отличие от null это не значение, а состояние переменной: его нельзя присвоить, с ним нельзя сравнивать, но его можно получить как тип значения переменной.

4) Любая функция в языка JavaScript рассматривается как значение особого рода, имеющее тип Function. Функция в коде описывается с помощью службеного слова function. Функция как значение означает следующее:
Код: (Javascript)
function helloWorld() {
  return "Hello world";
}
и
Код: (Javascript)
var helloWorld = function() {
  return "Hello world";
}
означают абсолютно одно и то же. Первый способ просто короче и более распространён. Но в итоге название (идентификатор) helloWorld есть переменная, хранящая внутри себя функцию как значение. Но эта переменная, как и всякая другая, может быть переписана другим значением.
Код: (Javascript)
function x() {}
x = 3;
Сам текст функций, передача параметров, возврат результата через return - ну здесь всё как PHP.

5) Управляющие конструкции кода типовые, как во всех языках с подобным синтаксисом:
Код: (Javascript)
if(/*условие*/) { /* действие для true */ }

if(/*условие*/) { /* действие для true */ } else { /* действие для false */ }

while(/*условие*/) { /* тело цикла */ }

do { /* тело цикла */ } while(/*условие*/);

for(/*инициализация счётчика*/; /*условие*/; /*операция над счётчиком*/) {
  /* тело цикла */
}

switch(/* выражение */) {
case /* вариант */:
  /* действие для варианта */
  break;
case /* вариант */:
  /* действие для варианта */
  break;
default:
  /* действие во всех остальных случаях */
}
Также поддерживается условный оператор:
Код: (Javascript)
/* условие */ ? /* значение для true */ : /* значение для false */
Есть и конструкция обработки ошибок:
Код: (Javascript)
try {
  /* Если тут программа "упала" */
} catch(error) {
  /* Она продолжит выполняться с этого места */
}

Стоит отметить, что разделитель операторов ";" (как и в PHP) является необязательным в конце строк кода. Обычно его пишут после каждого выражения, не являющегося фигурной скобкой управляющей конструкции или объявления функции. Комментарии, как уже было видно выше, тоже имеются, и двух типов:
Код: (Javascript)
/* комментарий внутри строки */
/* или
комментарий
на
несколько
строк */

// комментарий до конца строки

6) Наиважнейшим элементом языка является тип Object - объект. Он собой представляет ассоциативный массив (или карту - map), состоящий из множества пар ключ-значение.

Создать объект можно с помощью специальной конструкции:
Код: (Javascript)
var myobj1 = {}; /* пустой объект */
var myobj2 = {name: "Вася", family: "Пупкин", 3: 4, "Строчка": "Число", "id": function() {}};
Как в качестве ключей, так и в качестве значений может выступать абсолютно любое значение. В качестве ключей также могут выступать идентификаторы (т.е. выдуманные программистом названия, такие же, как названия переменных), но они внутри объекта рассматриваются как строчки.

Работа с содержимым объекта может происходить как с массивом или картой при помощи оператора "[]".
Код: (Javascript)
myobj2[3] += 1; // будет 5, потому что там хранилось число 4
var fi = myobj2["name"] + " " + myobj2["family"]; // в переменной fi будет строчка "Вася Пупкин".
здесь видно, что, например, идентификатор name внутри объекта является строчкой-ключом "name".

Работа с содержимым объекта может происходить как со структурой данных при помощи оператора ".". Но в этом случае можно использовать только идентификаторы или строчки, которые содержат идентификаторы
Код: (Javascript)
// myobj2.3 - так нельзя, только myobj[3]
// myobj."id" - так тоже нельзя
var f = myobj2.id; // так можно
var fi = myobj2.name + " " + myobj2.family; // аналогично предыдущему примеру

Если внутрь объекта записана функция (как в примере id), она называется методом этого объекта:
Код: (Javascript)
myobj2.id(); // вызвали метод
Не функции внутри объекта, к которым можно обратиться через точку, называются полями или свойствами.

В уже существующий объект можно добавлять новые пары ключ-значение обоими способами доступа:
Код: (Javascript)
var myobj = {};
myobj["x"] = 3;
myobj.name = "Вася";
При помощи оператора delete можно удалять уже существующие пары ключ-значение:
Код: (Javascript)
delete myobj.name;
delete myobj["x"];

При помощи оператора with можно сокращать запись при работе со многими вложенными объектами:
Код: (Javascript)
var n;
n = myobj.name;
with(myobj) {
  n = name; // то же самое, что myobj.name
}
Но этот способ чреват разной путаницей и неопределённостями, когда совпадают названия ключей объекта и локальных переменных. Им следует пользоваться аккуратно, а то и вовсе не пользоваться.

Есть специальная разновидность цикла for для перебора всех ключей в объекте:
Код: (Javascript)
for(var key in obj) {
  var value = obj[key];
  /* Дальше можно использовать переменные key и value для обработки текущей пары */
}

7) Массив Array в JavaScript является обычным объектом, но с особенностью. Хранимые в нём элементы, добавляемые новые элементы в качестве ключа автоматически получают числовой индекс: 0, 1, ... У массива (как и у строчки, кстати) есть свойство length, которое говорит о размере массива (длине строчки). Т.е.:
Код: (Javascript)
var a = new Array(1, 4, 9); // создали массив из 3-х чисел
a.push(16); // добавили в конец массива одно число:
var l = a.length; // переменная l будет хранить число 4 - количество элементов в массиве.
var x = a[0]; // переменная x получит значение 0-го элемента массива - число 1.
a.pop(); // убрали из массива самый последний элемент
l = a.length; // l стала 3.
Однако, на самом деле length возвращает число, равное последнему индексу в массиве + 1. Это значит, что массив может содержать "дырки".
Код: (Javascript)
var a = new Array(1, 4, 9); // создали массив из 3-х чисел
delete a[1]; // удалили среднее число, теперь a[1] == undefined
var l = a.length; // l всё равно 3.
Даже если "дырка" тянется до конца массива, автоматического "сжатия" массива не происходит. Изменить количество элементов в массиве можно только при помощи методов самого массива:
- уже упомянутые выше методы push и pop добавляют и удаляют элемент в конце массива (с помощью этих методов с массивом можно работать как со стеком);
- методы unshift и shift добавляют и удаляют элемент в начале массива - все индексы при этом сдвигаются (с помощью push и shift с массивом можно работать как с очередью);
- ну и другие методы.

8 ) Вообще, все справочники по языку JavaScript построены от объектов и их методов. Т.е. строчка, число, массив, дата, ошибка как объекты имеет свои методы и свойства, причём этих методов много - тут надо смотреть справочники. Особо следует упомянуть объект Math, внутри которого собраны все математические функции (степени, логарифмы, тригонометрия и т.д.), а также константы (то же число пи и т.п.).

Это была вводная по языку, дальше будет вводная по объектам внутри браузера, и что с ними можно делать.
« Последнее редактирование: 18-02-2014 10:03 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #85 : 18-02-2014 14:16 » 

А что молчим?
Заданий никаких не поступало. Черпаю пока информацию)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #86 : 18-02-2014 17:55 » 

Теперь, описав, что такое объект, и что в JavaScript мы работаем только с объектами того или иного типа, нужно описать главные объекты браузера, с которыми работает клиентский код страницы. Эти объекты "отображаются" внутрь языка именно для того, чтобы ими можно было манипулировать в программе. Это называется "программной объектной моделью".

Любой объект программной модели, содержит внутри себя:
- свойства - какие-то вложенные объекты, доступные по тем или иным названиям;
- методы - функции для выполнения тех или иных действий над объектом или просто собранные в одном месте на "общую тему";
- события - они есть не у всех объектов, но механизм обработки событий является одним из важнейших элементов программирования страницы.

Про свойства и методы я уже говорил выше - повторяться не будут. Скажу о событиях.

В простейшем случае событие есть поле внутри объекта, к которому обращается сам объект в тех случаях, когда по ходу своей работы фиксирует наступление события. События обычно начинаются с префикса "on...". Например, "onload" - событие "load" (загрузка). Т.е. когда объект выполняет (завершает) загрузку, он обращается к своему собственному полю "onload" и смотрит, что там в этом поле есть. Если там есть функция, он её вызывает, если там ничего нет, или нет функции, ничего не делает.

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

Простой способ назначения обработчика события - просто присвоить функцию соответствующему полю:
Код: (Javascript)
window.onload = function() {
  alert("Hello world");
}
или, если функция написана отдельно:
Код: (Javascript)
function loadHandler() {
  alert("Hello world");
}

window.onload = loadHandler;

При статической вёрстке HTML обработчики событий обычно указываются в соответствующих элементах вёрстки:
Код: (HTML)
<body onload="loadHandler()">
Но здесь в строчке идёт не просто название функции, а её вызов. Т.е. вся строчка выполняется как кусочек программы.

Способ удалить ранее назначенный обработчик тоже предельно прост:
Код: (Javascript)
window.onload = null;

В тех случаях, когда на одно событие нужно "повесить" много разных обработчиков, вышеописанный простой способ недостаточен - каждый новый обработчик затрёт (и отменит) ранее назначенный. В этом случае либо надо либо писать собственный диспетчер событий (для собственных объектов), либо использовать стандартные методы addEventListener для добавления и removeEventListener для удаления обработчиков (работает лишь в стандартных объектах браузера, причём в IE соответствующие функции называются attachEvent и detachEvent). Однако вряд ли мы будем этим пользоваться, поэтому в эту тему углубляться не буду.

В ряде случаев событие помимо самого факта своего наступления сопровождается дополнительной информацией. Например, события о движении мыши или нажатии кнопок клавиатуры пользователем сопровождаются информацией о том, какие новые координаты у мыши, какие кнопки нажал пользователь. Если много однотипных объектов вызывают одну и ту же функцию-обработчик, хорошо бы различать, в каком конкретно объекте случилось событие. Для этих целей у обработчиков стандартных объектов может быть специальный параметр - объект event, в котором содержится вся дополнительная информация. Т.е. если эту дополнительную информацию хочется получать и обрабатывать, обработчик должен выглядеть как функция с параметром:
Код: (Javascript)
function myHandler(event) {
}
Если по стандарту объект event передаётся как параметр обработчика, то в IE он является полем объекта window (см. ниже). Но мы пока во все эти тонкости различий браузеров углубляться не будем.

Теперь о самих объектах программной модели.

1) Любая страница показывается в окне (вкладке). Окно представлено объектом window, доступным в любом месте программы.

В окне нас интересуют в первую очередь события onload и onunload. Первое происходит после загрузки страницы, а второе перед выгрузкой страницы. Если с событием unload более-менее понятно: бывает, что перед сменой страницы или закрытием окна хочет что-то сделать, например, зафиксировать, что пользователь ушёл - тогда на это событие добавляется обработчик. То событие load требует некоторого пояснения. Если мы просто напишем минимально корректный HTML версии 4 (в котором можно пропускать элементы html, head, body), у нас либо сразу начнётся HTML-вёрстка, либо в начале будет идти секция скриптов.
Код: (HTML)
<SCRIPT type="text/javascript">
<!--
 var x = 3;
-->
</SCRIPT>
Нужно понимать, что любой скрипт начинается выполняться немедленно после своей загрузки. Т.е. программа уже начнёт работать, хотя быть может ещё не все части HTML загрузились с сервера. В этом случае объекты программной модели будут ещё не готовы к работе. Поэтому важно, чтобы основной рабочий код начинал работу после полной загрузки страницы. Это как раз и обеспечивает событие load у объекта окна:
Код: (HTML)
<SCRIPT type="text/javascript">
<!--
 window.onload = function() {
   alert("Загрузились");
 }

 window.onunload = function() {
   alert("Выгружаемся");
 }
-->
</SCRIPT>
Функция alert выдаёт на экран простое окошко с сообщением и приостанавливает работу программы.

Здесь запомним, что всегда будем начинать работу программы внутри обработчика window.onload.

Ещё в окне нас будут интересовать функции работы с таймерами: setTimeout, setInterval, clearInterval, clearTimeout. Они позволяют создать таймер для вызова функции-обработчик через какой-то промежуток времени - отложенный во времени вызов. Timeout срабатывает - вызывает обработчик - один раз, interval повторяет вызов обработчика периодически через равные промежутки времени. Функции set включают таймер и возвращают его код, функции clear отключают таймер по коду. Например:
Код: (HTML)
<script type="text/javascript">
  var timer = null;

  window.onload = function() {
    // Отсюда программа начинает свою полезную работу. И мы хотим вызвать функцию tick через 5 секунд.
    timer = window.setTimeout(tick, 5000); // 5000 - это миллисекунды
    // В общей для всех функций - глобальной - переменной timer запоминаем номер используемого таймера.
  }

  function tick() {
    // Если время истекло, а страницу ещё не закрыли, выполняем какое-нибудь действие.
    alert("Tick");
    // И сбрасываем номер уже нерабочего таймера.
    timer = null;
  }


  window.onunload = function() {
    // При закрытии страницы, если таймер ещё не сработал, мы отменяем его работу.
    if(timer != null) {
      window.clearTimeout(timer);
    }
  }
</script>

2) Другим важнейшим объектом является document - он есть программная модель объектов, полностью описывающих весь HTML страницы. Он также доступен в любом месте программы.

HTML, как это обычно видно по самому его тексту, состоит из вложенных друг в друга элементов. Каждый элемент ограничивается открывающим и закрывающим тэгом:
Код: (HTML)
<html></html>
Хотя в HTML 4 разрешается в некоторых случаях пропускать некоторые тэги - для простоты. Вместе элементы образуют структуру данных, называемую дерево. В дереве каждый промежуточный элемент - называется узел - имеет обязательно:
- 1 узел "предка" (parent), в состав которого включён;
- 1 или несколько узлов "потомков" (child), которых содержит внутри себя.
Узел, не имеющий предка, называется корнем. Узел, не имеющий потомков, называется листом.

Так вот, объект document внутри себя содержит (из нам интересного):
- корень всего дерева элементов страницы;
- множество методов создания новых элементов;
- методы поиска элементов.

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

Метод document.getElementsByTagName позволяет получить все элементы документа с одинаковым тэгом (например, все div). Но поскольку таких элементов много, этим методом интересно пользоваться разве что для доступа к главной секции документа - body.
Код: (Javascript)
var body = document.getElementsByTagName("body")[0];
Эта секция есть всегда, даже если её тэги не описаны в самом документе. И именно в ней содержатся все элементы вёрстки страницы. 0 в примере означает следующее: поскольку метод возвращает все элементы - это получается массив. Разумеется, body есть только один, поэтому мы сразу смело из этого массива берём самый первый элемент: он там заведомо один, и он там заведомо есть.

Аналогичным образом мы можем получить элемент head, чтобы работать со скриптами, стилями, заголовком и метаописаниями страницы, которые помещаются именно в него.

Второй метод поиска document.getElementById - позволяет находить элемент по идентификатору этого элемента. Идентификатор, это например так:
Код: (HTML)
<div id="MyDiv"></div>
Тогда в JavaScript мы можем получить объект-элемент, соответствующий этому div, так:
Код: (Javascript)
var myDiv = document.getElementById("MyDiv");
Это важнейший метод поиска в тех случаях, когда статическая вёрстка HTML сочетается с кодом на JavaScript. Важно, что каждый id должен обязательно быть уникальным во всём документе.

Ещё один метод поиска - по имени:
Код: (HTML)
<div name="MyDiv"></div>
Тогда в JavaScript мы можем получить объект-элемент, соответствующий этому div, так:
Код: (Javascript)
var myDiv = document.getElementsByName("MyDiv")[0];
В отличие от идентификатора, одинаковое имя можно (а для радиокнопок - нужно) задавать для нескольких элементов. И соответствующий метод getElementsByName находит все элементы с одинаковым именем.

Есть и другие методы поиска, например, getElementsByClassName - по классу стилей. Мы туда углубляться не будем.

Во вторую очередь нас интересуют методы создания новых узлов дерева. Вообще узлы (node) в документе бывают разных видов:
- элементы (element) - описываются тэгами;
- атрибуты (attribute) элементов (например, как тот же id выше) - описываются в открывающем тэге;
- просто куски текста (textNode) - содержатся внутри какого-нибудь элемента;
- комментарии и всякие служебные узлы - не будем в них углубляться.
Важно отметить, что текстовые узлы, атрибуты, комментарии и служебные узлы являются листьями - т.е. внутри них других узлов быть не может.

Чтобы создать элемент, нужно вызвать метод документа:
Код: (Javascript)
var myDiv = document.createElement("div");
Обязательно нужно указать имя тэга для элемента - здесь это div. Но таким образом создаётся всё: ссылки a, поля ввода input, строчные элементы span, таблицы table и т.д.

Для создания атрибута есть метод:
Код: (Javascript)
var myDivWidth = document.createAttribute("width");
Но поскольку тот же атрибут id специальный встроенный, обработчики событий можно назначать в коде, а та же ширина и т.п. визуальные свойства элемента описываются стилями, в HTML этот метод теперь имеет весьма ограниченную область применения.

Для создания текстового узла служит метод:
Код: (Javascript)
var t = document.createTextNode("Hello world");
Сам текст - это строчка при вызове метода.

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

Во-первых, метод добавления внутрь себя потомка appendChild. Например:
Код: (Javascript)
var body = document.getElementsByTagName("body")[0];
var myDiv = document.createElement("div");
body.appendChild(myDiv);
Здесь мы создали новый div и добавили его в body текущего HTML-документа. Вот только после этого мы можем увидеть этот div на экране (если в нём, конечно, есть какое-то содержимое - тот же textNode, который тоже нужно создать и добавить, но уже внутрь div).

Во-вторых, это средство для перебора всех потомков узла. Внутри узла есть особый объект - коллекция, доступная по свойству childNodes. Она немного похожа на массив. У неё есть свойство length - количество узлов. Но это уже настоящий length. У неё же есть метод item для получения узла по индексу. Т.е. полный перебор всех потомков узла (дочерних узлов) можно сделать в цикле вида:
Код: (Javascript)
for(var i = 0; i < p.childNodes.length; ++i) {
  var c = p.childNodes.item(i);
  /* Тут p - объект родительского узла, c - очередной объект дочернего узла по отношению к родительскому.
    Дальше с ними можно что-то делать. */

}

appendChild добавляет новый узел в конец коллекции childNodes. Это не всегда удобно. Поэтому есть и метод insertBefore, который вставляет новый узел перед каким-то уже имеющимся внутри childNodes.

Ну и наконец, метод удаления узла removeChild у родительского узла - ему требуется передать параметром тот самый дочерний объект-узел, который надо удалить. Например, полная очистка элемента от дочерних узлов:
Код: (Javascript)
while(p.childNodes.length > 0) {
  p.removeChild(p.childNodes.item(0));
}
Здесь всегда удаляем самый первый дочерний узел, пока их совсем не останется.

Разумеется, есть масса других вспомогательных методов, чтобы простые вещи по манипуляции деревом записывать более компактно. Их можно смотреть в справочниках, и они бывают разными в зависимости от браузера. Но конкретно эти методы, во-первых, стандартные, во-вторых, применимы для работы не только с HTML, но и с XML. Я пока более в это углубляться не буду.

Чтобы получить текст из объекта textNode, нужно использовать его свойство nodeValue.
Код: (Javascript)
var tn = document.createTextNode("X");
var t = tn.nodeValue; // теперь t содержит строчку "X".
Т.е. надо понимать, что текст и текстовый узел в HTML - это разные вещи. Текстовый узел как объект содержит внутри себя строчку с текстом. Хотя при статической вёрстке HTML эта разница никак не видна.

Ещё одной важной вещью является стилизация элементов HTML. В программной модели у каждого элемента есть особое свойство style, содержащее в себе объект с описанием стилей текущего элемента. Стили задают внешний вид элемента. С объектом style можно работать как с обычным объектом, и вот тут удобен оператор with, поскольку стили обычно описываются большими группами:
Код: (Javascript)
var myDiv = document.createElement("div");
with(myDiv.style) {
  width = "100px";
  height = "100px";
  backgroundColor = "#ffe0e0";
}
Для элемента div задаются стили: ширина (width) и высота (height) по 100 пикселей и цвет фона светло-красный.

Но вообще стили, таблицы их описаний, классы стилей и т.д. - это отдельная большая тема. Пока она не нужна.
« Последнее редактирование: 18-02-2014 18:15 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #87 : 18-02-2014 18:13 » 

Итак, на основе всего вышеизложенного и для некоторого практического закрепления здесь возникает первое простенькое задание: написать на JavaScript без статической вёрстки HTML следующую страницу:

1) На ней большими буквами должны показываться текущие дата и время.

2) При этом дата и время постоянно бы обновлялись (т.е. часы "шли").

3) Если на часы кликнуть мышкой, они должны перестать "идти", а если кликнуть ещё раз - снова начать идти. Здесь у элемента понадобится событие onclick.

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

Получить эти текущую дату и время можно, создав объект даты:
Код: (Javascript)
var d = new Date();

Ну, соответственно, и вопросы задавать.

Вообще по-хорошему надо бы ещё основные приёмы работы с отладчиком показать. Только непонятно как. Словами это описывать - дело неблагодарное. Ну можно ролики на YouTube посмотреть по ключевым словам javascript, debugging (отладка), breakpoint (точка останова), watch (просмотр содержания переменных)... Ну, например, такой:
http://www.youtube.com/watch?v=k_G2kHiqU60
Всем хорош, кроме того, что на английском. Но хотя визуально посмотреть на основные элементы отладчика, и что с ними делать.


Я же пока подумаю над вводной информацией о создании собственных объектов.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #88 : 19-02-2014 01:03 » 

Ну вот сделал такое, но почему-то не могу сделать остановку по клику. Наверное, пересидел  А черт его знает...
Код:
<html> 
<head>
<script type="text/javascript">
function startTime()
{
var tm= new Date();
var h=tm.getHours();
var m=tm.getMinutes();
var s=tm.getSeconds();
m=checkTime(m);
s=checkTime(s);
document.getElementById('txt').innerHTML=h+":"+m+":"+s;
t=setTimeout('startTime()',500);

}
function checkTime(i)
{
if (i<10)
{
i="0" + i;
}
return i;
}
</script>
<style type="text/css">
}
body{
background:white;
}
div{
font-size:300%;
}
</style>
</head>
<body  onload="startTime()">
<div onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'" OnClick="abortTime" id="txt"></div>

 

</body>
</html>

Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #89 : 19-02-2014 05:56 » new

Kaspiy, ну давай по порядку.

1) Я тут вижу статическую вёрстку body, div, хотя вроде мы за то, чтобы её не делать - т.е. освоить функции динамического управления. Но это пока можно отложить до выяснения. В итоговом варианте кроме кода я соглашусь разве что на таблицу стилей.

2) Стиль с цветом фона применяется к body, а речь шла про div - т.е. только про то место, где показываются часы.

3) Как работает событие onmouseover?

4) И самое главное. Нужны как логика управления таймером, так и логика управления стилем. Ни того, ни другого в коде не видно. А вопрос этот не специфический для JavaScript - он, так сказать, общепрограммистский.

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

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines