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

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

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

WWW
« Ответ #90 : 19-02-2014 07:44 » 

Очень аккуратно нужно относиться к регистру ключевых слов и функций.

Существует ли OnClick метод?
Записан

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

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

WWW
« Ответ #91 : 19-02-2014 07:46 » 

Dimka,
Ну... не знаю...
смешивать "верстку" и js - хм...

Естественно управление свойствами происходит в скрипте и тесно связано с элементами. Но отображение...
Записан

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

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

« Ответ #92 : 19-02-2014 09:04 » 

Sla, так в этом и суть. Формировать куски HTML на сервере, чтобы гонять этот трафик туда-сюда... А, собственно, зачем? Если всё можно скриптом построить. Благо сами движки JavaScript в браузерах стали достаточно мощными и быстродействующими. Да и отлаживать удобнее, когда код уровня presentation в одном месте.

Это дело скорее учебное - чтоб руку набить. Понадобится для календаря, таблицы с часами. Разумеется, неизменные части страницы проще статически верстать.
Записан

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

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

WWW
« Ответ #93 : 19-02-2014 10:47 » 

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

Записан

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

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

« Ответ #94 : 19-02-2014 11:03 » 

Sla, так один раз - при загрузке, вместе со статическим HTML. И потом оно в кэше браузера лежать будет. Я под "гонять" имею в виду такие вещи, когда для обновления данных внутри div делают запрос, который HTML-содержимое div генерирует на сервере. В этом нет смысла. Лучше с сервера получить XML или JSON и построить view скриптом.
Записан

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

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

WWW
« Ответ #95 : 19-02-2014 11:49 » 

Не имеет значения что получать, html, json или xml
Я, иногда, передаю в, грубо говоря, csv: мне так удобно, издавна повелось, не было поддержки json на шаринг-хостинге.


Записан

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

ua
Offline Offline

« Ответ #96 : 19-02-2014 17:38 » 

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

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

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

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

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

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

Просите, что долго не откликался. В Киеве жара =))
Что касается таймера: мы запускаем время, при этом делаем так,чтобы показывало часы, минуты и секунды. Задаем этому таймеру ИД (у меня txt). Чтобы время показывалось текущее используем
Код:
function checkTime(i)
.
Стили: мы задаем фону белый цвет. <div> у нас в этом случае - часы, следовательно я в <div> поместил функцию onmouseover изадаем размер 300% чтобы сделать часы большими.

Стиль:
Код:
<style type="text/css">
}
body{
background:white;
}
div{
font-size:300%;
}
</style>

Таймер:
Код:
<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>
</head>
<body  onload="startTime()">
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #97 : 19-02-2014 20:09 » 

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

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

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

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

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

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

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

Вот давай и разберём, как же сделать собственный объект таймера.

Создание объекта обычно занимает несколько строчек: нужно создать пустой объект, назначить ему разные свойства и методы, и только после этого объект будет готов. Т.е. создание объекта - это алгоритм. Такой алгоритм принято записывать внутри функции. Функция, предназначенная специально для создания объекта называется конструктором.

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

Код: (Javascript)
        // Конструктор объекта Таймер
        function Timer() {
                var timer = new Object(); // создали пустой объект
                // Назначаем свойства
                timer.id = null; // сюда будем записывать номер таймера, полученный от window.setInterval
                timer.period = NaN; // здесь должен быть период срабатывания таймера
                // Назначаем события
                timer.ontick = null; // событие tick - срабатывание таймера
                // Назначаем методы
                timer.start = function() { // запуск таймера
                        if(timer.id != null) {
                                // Если свойство id не null, значит таймер уже запущен.
                                // Прервём работу программы с ошибкой.
                                throw new Error("Timer has already started.");
                        } else if(!(Number(timer.period) > 0)) {
                                // Если свойство period не число или число меньше или равно 0,
                                // таймер работать не сможет. Тоже прервём работу программы с ошибкой.
                                throw new Error("Timer's period is invalid.");
                        } else if(!(timer.ontick instanceof Function)) {
                                // Если событие tick не назначено, то и таймер запускать нет смысла.
                                // Просто ничего не делам - выходим из функции.
                                return;
                        } else {
                                // Наконец, если все проверки прошли, запускаем таймер.
                                // Назначаем свойство id.
                                timer.id = window.setInterval(timer.ontick, timer.period);
                        }
                }
                timer.stop = function() { // остановка таймера
                        if(timer.id == null) {
                                // Если свойство id равно null, значит таймер ещё не запущен.
                                // Прервём работу программы с ошибкой.
                                throw new Error("Timer hasn't yet started.");
                        } else {
                                // Если прошли все проверки, останавливаем таймер.
                                window.clearInterval(timer.id);
                                // Очищаем свойство id.
                                timer.id = null;
                        }
                }
                return timer;
        }

Пользоваться таким объектом можно следующим образом:
Код: (Javascript)
var timer = Timer();
timer.period = 5000;
timer.ontick = function() {
  alert("Tick");
}

timer.start();

Вдумчивый программист спросит: а как так получается, что внутри функции start в таймере видна переменная timer, которая вовсе не является собственной переменной функции start?

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

Например, у нас есть, с одной стороны, событие одного объекта x.onevent, с другой стороны метод другого объекта y.f. Как их связать таким образом, чтобы на событие откликался метод объекта? Решением является как раз замыкание:
Код: (Javascript)
function delegateEventToF(x, y) {
  x.onevent = function() {
    y.f();
  }
}

delegateEventToF(x, y);
Здесь вызывается 1 раз внешняя функция delegateEventToF, которая назначает обработчик событию. Параметры x, y которой оказываются в замыкании и сохраняются для обработчика события. Поэтому внутри обработчика можно видеть переменную y с объектом, у которого и вызвать соответствующий метод. Обработчик будет срабатывать столько раз, сколько произойдёт событие, а переменная y всякий раз будет всё та же - с тем же объектом.

Этим обстоятельством можно активно пользоваться, комбинируя замыкание и объект в их конструкторе.

В примере выше с объектом таймера мы храним свойства id и period внутри объекта, потому что они нужны для работы методов start и stop. Если хорошо подумать, свойство id внутри объекта в общем-то и не нужно. А вдруг его по ошибке "снаружи" кто-то поменяет? Его хорошо бы убрать из объекта, но для методов оно нужно. Как раз при помощи замыкания мы его можем сделать переменной внутри конструктора, но оно останется видимым для методов объекта. "Упрятывание" некоторых вспомогательных полей и функций внутри объекта называется инкапсуляцией. В общем-то, чем больше спрятано, тем меньше возможностей при работе с объектом совершить ошибку или неправильно понять, как этим объектом пользоваться. Т.е. в идеале в объекте должны оставаться только методы и события, и только самые нужные. Весь вспомогательный код должен быть инкапсулирован внутри объекта - в замыкании.

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

Ещё можно заметить, что любой конструктор, получается, должен иметь строчки вида:
Код: (Javascript)
var obj = new Object();
// настройка объекта
return obj;
Для этого в языке JavaScript предусмотрена специальное правило вызова конструктора - оператор new. Он сразу автоматически создаёт пустой объект, который становится доступен внутри конструктора при помощи служебного слова this. И даже return делать не надо.

В соответствии со всем вышесказанным окончательно наш объект таймера будет описываться следующим образом:
Код: (Javascript)
        function Timer() {
       
                // Свойства инкапсулированы и находятся в замыкании.
                // Договоримся все переменные замыкания начинать с подчёркивания,
                // чтобы сразу их видеть.
                var _id = null;
                var _period = NaN;
               
                // Назначаем события
                this.ontick = null;
       
                // Назначаем методы
               
                this.start = function() {
                        if(_id != null) {
                                throw new Error("Timer has already started.");
                        } else if(!(Number(_period) > 0)) {
                                throw new Error("Timer's period is invalid.");
                        } else if(!(this.ontick instanceof Function)) {
                                return;
                        } else {
                                _id = window.setInterval(this.ontick, _period);
                        }
                }
               
                this.stop = function() {
                        if(_id == null) {
                                throw new Error("Timer hasn't yet started.");
                        } else {
                                window.clearInterval(_id);
                                _id = null;
                        }
                }
               
                this.setPeriod = function(milliseconds) {
                        if(!(Number(milliseconds) > 0)) {
                                throw new Error("Argument 'milliseconds' is invalid.");
                        } else {
                                _period = milliseconds;
                                if(_id != null) {
                                        // После смены периода, если таймер работает,
                                        // автоматически перезапускаем с новым периодом.
                                        this.stop();
                                        this.start();
                                }
                        }
                }

        }
Ну и использование объекта таймера:
Код: (Javascript)
var timer = new Timer();
timer.setPeriod(5000);
timer.ontick = function() {
  alert("Tick");
}

timer.start();

Отсюда несложно догадаться, что стандартные функции Array, Number, Function, Date, Error, String, Object и т.д. попросту являются функциями-конструкторами. Чтобы создать соответствующие объекты, их достаточно вызвать вместе с оператором new.

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

Любой объект хранит внутри себя информацию о том, при помощи какой функции-конструктора он был создан. У любого объекта есть свойство constructor, которое как раз содержит функцию-конструктор этого объекта. Ещё есть специальное выражение instanceof, которое позволяет проверить, создавался ли тот или иной объект с помощью того или иного конструктора. Например, в таймере есть строчка:
Код: (Javascript)
this.ontick instanceof Function
здесь проверяется, является записанное в событие значение объектом, созданным конструктором функции (т.е. является ли этот объект функцией). Выражение даёт логический ответ true - да или false - нет и обычно используется в условиях.

Ещё есть оператор typeof, который позволяет узнать, какой встроенный простой тип имеет объект: число, строчка, объект (созданный любым определённым программистом конструктором или Object), дата, ошибка, массив и т.д. - включая даже undefined. При этом null имеет тип object. Этот оператор возвращает в результате строчку. Например, безопасная проверка на undefined:
Код: (Javascript)
var x;
if(typeof x == "undefined")

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

P.S. Не обсуждавшийся выше оператор throw попросту "валит" программу. Если это "падение" происходит внутри оператора try/catch (упоминавшегося в предыдущих постах) то программа сразу переходит к выполнению оператора catch. Если же нет, то программа "падает" окончательно и больше не работает до полного перезапуска (перезагрузки страницы).
« Последнее редактирование: 19-02-2014 20:20 от Dimka » Записан

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

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

« Ответ #98 : 19-02-2014 20:45 » 

Цитата: Kaspiy
В Киеве жара
Да, это мы тут понимаем. Киев у нас в разделе "Общение" обсуждается. Причём лучше не политизировать: взгляды взглядами, а программирование одинаковое везде при любой власти и в любой стране.

Цитата: Kaspiy
Что касается таймера: мы запускаем время, при этом делаем так,чтобы показывало часы, минуты и секунды. Задаем этому таймеру ИД (у меня txt). Чтобы время показывалось текущее используем
Код:

function checkTime(i)
Ну это не устраивает. Сравни, сколько ты написал про таймер, и сколько я Улыбаюсь Вдумчивее надо:
- по каким поводам/событиям таймер запускается,
- по каким поводам/событиям останавливается,
- как это у тебя происходит - запуски и остановки,
- в каких местах кода,
- а как должно быть в соответствии с замыслом, и где зазор между "есть" и "должно быть".

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

Цитата: Kaspiy
Стили: мы задаем фону белый цвет. <div> у нас в этом случае - часы, следовательно я в <div> поместил функцию onmouseover изадаем размер 300% чтобы сделать часы большими.
Это, опять же, лишь "стратегический замысел", как говорится, "картина крупными мазками". Меня детали интересуют - логика смены стилей. Тщательно и очень подробно описанная. Таблица описания стилей здесь к делу не относится - это статика, здесь достаточно лишь два слова - названия стилевых классов. А вот "Как это работает?" шаг за шагом русским языком - вопрос остаётся открытым.

Т.е. разумеется я по коду вижу, как это у тебя работает. Но есть сомнение, что ты до конца понимаешь, как именно. Код не производит впечатление, что ты обдумывал каждую запятую в нём и принимал по ней осознанное решение. А хорошее программирование именно этого и требует: за каждой буковкой видеть аж биты, "свистящие" в процессоре, байтики в каждой ячейке памяти, как это по шинам "ходит", какие алгоритмы операционной системы, браузера за этим стоят, как компиляторы код в машинный код преобразуют. Такой "рентгеновский" взгляд насквозь до изначальной Пустоты между атомами и квантами времени. Улыбаюсь Поэтому нужно разбираться со всеми мелочами: "что?", "как?", "почему?", "зачем?" Ну до отдельных электронов мы тут погружаться не будем, но на уровне отдельных букв написанного кода будем.

Главный насущный вопрос, разумеется, почему не работает, как задумано. Т.е. надо найти причину и устранить. Моя подсказка: причина в непродуманной логике работы программы. Если ты даёшь описание логики, и из него не следует никакой зацепки для указания причины проблемы, значит описание недостаточное. Если не знаешь, делай предположения - гипотезы, т.е. занимай активную позицию, непримиримую по отношению к ошибкам, "глюкам", косякам. Озвучивай эти гипотезы, проверяй. Будем комментировать, выводить из тупиков, подбрасывать недостающие до полной картины сведения - знания.
« Последнее редактирование: 19-02-2014 20:46 от Dimka » Записан

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

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

WWW
« Ответ #99 : 19-02-2014 23:36 » 

хочу обратить внимание на оформление и форматирование кода
Не жалей табов и пробелов
Желательно все же строку (оператор) заканчивать точкой с запятой.
Посмотри как Dimka назначает имена переменным
с маленькой буквы
А функциям?
Или с большой, или С Капитализацией Ключевых Слов

точно также  и доступ к dom объектам происходит
document.getElementById()

document - пременная, объект
getElementById() - функция

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


Записан

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

ua
Offline Offline

« Ответ #100 : 20-02-2014 00:25 » 

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

-таймер запускается сразу после открытия страницы, на которой он находится.
Код:
function startTime()
-не останавливается (у меня с этим проблема ведь вышла)
-Задумывалось сделать так, чтобы таймер останавливался и опять запускался по клику на нем.
-при наведении мышки на строку с таймером - фон меняет свой цвет, если забрать мышку со строки - восстанавливает предыдущий цвет фона.
Код:
<div onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'" OnClick="abortTime" id="txt"></div>

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


Sla, буду стараться. Спасибо)
« Последнее редактирование: 20-02-2014 00:31 от Kaspiy » Записан
Dimka
Деятель
Команда клуба

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

« Ответ #101 : 20-02-2014 05:28 » 

Цитата: Kaspiy
-таймер запускается сразу после открытия страницы, на которой он находится.
Код:

function startTime()

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

Какие будут у тебя предложения, как это сделать?

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

Цитата: Kaspiy
Что касается логики смены стилей...тут я совсем не знаю, что написать.
Ну вот то, что надо их к часам применить, а ты ко всему фону документа применяешь. Проблема.
« Последнее редактирование: 20-02-2014 05:30 от Dimka » Записан

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

ua
Offline Offline

« Ответ #102 : 20-02-2014 10:03 » 

Код:
this.onclick = stopTime
this.ondbclick = startTime

Так ?)
Извините, друзья, пробки, сегодня приеду домой и основательно займусь всем.
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #103 : 20-02-2014 11:36 » new

Kaspiy, что значит так? Я же говорю: словами объясни. Вот что у тебя написано? Что остановка по клику, а запуск по двойному клику. Кто про двойной клик говорил? Никто. Тогда причём тут двойной клик? Объясни ход своей мысли, как ты рассуждаешь. Пока непонятно, как ты думаешь, непонятно, что тебе и ответить. Ну можно, конечно, за тебя решить задачу. Только это ничему не научит.

Разумеется, проблема здесь есть - на то и задача, но её надо правильно назвать, чтобы выйти на правильное решение.
Записан

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

ua
Offline Offline

« Ответ #104 : 21-02-2014 14:38 » 

Код:
 // Назначаем события
                this.onclick = stopTime;
       
                // Назначаем методы
               
                this.start = function() {
                        if(_id != null) {
                                startTime ();
                       
                        } else {
                                _id = window.stopTime(this.onclick);
                        }
                }
Тогда,возможно,так.
Словами...нужно обьекту задать функцию onclick чтобы при клике на обьект происходило событие. Конкретно - остановка таймера и его запуск. Если таймер уже остановлен, то проиcходит его запуск.
Записан
Dimka
Деятель
Команда клуба

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

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

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

Тут стоит помочь и дать ещё одну короткую вводную про объекты.

Ключевое понятие, на котором мы сейчас застряли, называется "состояние".

Т.е., с одной стороны, у нас есть единственное событие click и единственная функция - его обработчик, но с другой стороны, эта функция должна делать разные вещи: то включать, то выключать.

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

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

Код: (Javascript)
var state = false; // Состояние

function action() { // Некоторое действие
  if(!state) { // Если состояние одно
    action1(); // Делаем одно действие
    state = true; // Запоминаем состояние.
  } else { // Если состояние другое
    action2(); // Делаем другое действие
    state = false; // Запоминаем состояние.
  }
}

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

Даже больше можно сказать: там, где нельзя выделить состояние, там как правило не нужен и объект; объект без состояния в JavaScript почти никогда и не нужен - есть только в качестве модуля, собрания функций на общую тему (например, встроенный Math).


Теперь на основе этой вводной и всех предыдущих таки попробуй написать правильное решение по включению и выключению "хода" часов. Объект у тебя появится обязательно. Как к событию прицепить вызов объекта, я уже показывал.
« Последнее редактирование: 22-02-2014 06:27 от Dimka » Записан

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

ua
Offline Offline

« Ответ #106 : 21-02-2014 21:28 » 

Код:
<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;
}
function OnClick() {
    if(false){
    stopTime();
    state = true;
  }
  else
  {
    startTime();
    state = false;
  }
}
</script>

</head>
<body  onload="startTime()">
<getElementById onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'"  id="txt"></getElementByID>
<body>
</html>

Сделал так, чтобы цвет менялся только при наведении на часы.
 Как сделать чтобы они останавливались? Капец какой-то!
Записан
Sla
Модератор

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

WWW
« Ответ #107 : 21-02-2014 21:34 » 

onmouseover="timerstop"
onmouseout="timerstart"
Записан

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

ua
Offline Offline

« Ответ #108 : 21-02-2014 21:47 » 

onmouseover="timerstop"
onmouseout="timerstart"
Мне нужно по клику это сделать)
Записан
Sla
Модератор

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

WWW
« Ответ #109 : 21-02-2014 22:46 » 

так есть же событие онклик
Записан

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

ua
Offline Offline

« Ответ #110 : 21-02-2014 22:48 » 

так есть же событие онклик

Не работает на таймере.
Записан
Sla
Модератор

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

WWW
« Ответ #111 : 21-02-2014 23:00 » 

о! мамамима!
Что это?
<getElementById onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'"  id="txt"></getElementByID>

Показывай работающий код!

Записан

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

ua
Offline Offline

« Ответ #112 : 22-02-2014 00:01 » 

о! мамамима!
Что это?
<getElementById onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'"  id="txt"></getElementByID>

Показывай работающий код!


А что с ним не так?У меня все работает
Записан
Sla
Модератор

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

WWW
« Ответ #113 : 22-02-2014 00:37 » 

не понятно что это за тег - getElementById

Ну ладно.. html5 может простить, мало ли... а вдруг есть...

а где интересно функция stopTime();

мало того

функция OnClick - работает

не будет работать - по клику таймер все время перезапускается.
Записан

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

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

« Ответ #114 : 22-02-2014 07:03 » 

Kaspiy, ну во-первых, молодец, что обошёл маленькую, но ключевую закладку, оставленную в моём примере - там, действительно, либо условие нужно было инвертировать, либо сохранение state наоборот делать. Ты так и написал. Во-вторых, не молодец, что так и не запрограммировал состояние:
Код: (Javascript)
if(false)
Вот это работает всегда одинаково, а должно попеременно: то так, то этак. Здесь должна быть переменная. Кстати, она у тебя нигде не объявлена. А вообще сделай объект.

Во-вторых, Sla говорит об аккуратности оформления кода. Если тут даже в 10 строчках "каша" из разных последствий разных опытов, то в программа в 100 строчек вообще никогда не взлетит - там вечно будут ошибки: ни одна, так другая. Аккуратность оформления кода - это не наша придурь, это так надо. Проверь каждую синтаксическую конструкцию, что она правильная, что все открывающие элементы имеют соответствующие закрывающие элементы (контролировать это помогают отступы). Программирование требует тщательности и внимания ко всем мелким деталям.

Функции stopTimer в коде, действительно, нет. Элемента getElementById в HTML, действительно, нет - это метод документа в JavaScript.

Т.е. это всё надо "подчищать" и исправлять.

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

Давай так попробуем: в коде и в каждой строчке в конце пишешь комментарий, где обычными словами объясняешь, что эта строчка делает. Вот как у меня выше. И в HTML тоже комментарий к каждой строчке: он там так делается:
Код: (HTML)
<!-- комментарий -->
Для чего это? Чтобы, во-первых, ты "вычитал" и "выписал" каждую строчку твоего кода - код опытный программист "читает" (как поэму Улыбаюсь ), а не "смотрит". И, как в поэме важна рифма между строчками, так в коде важна согласованность разных частей кода - иначе смотрится коряво. Эта согласованность как в синтаксических конструкциях, так и в использовании переменных и объектов, так и логика алгоритмов.

P.S. Поскольку текста в теме много, чтобы не забывать, какие делались замечания, в чём заключается задание, советую где-нибудь делать выжимку из темы и список замечаний - это у программистов называется по-английски "check list" (список дел, где нужно по выполнении каждого поставить галочку) или "bug list" (список ошибок, которые нужно исправить и вычеркнуть). Иначе вечно будут какие-то мелочи оставаться незамеченными и прогнорированными. Это ещё одна сторона аккуратности процесса программирования помимо оформления кода.

Цитата: Sla
не будет работать - по клику таймер все время перезапускается.
Будет: clearTimeout делается до запуска обработчика, а не во время его работы, следовательно, текущий отложенный вызов снимается и больше не запустится.
Записан

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

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

WWW
« Ответ #115 : 22-02-2014 12:09 » 

Про не работу по клику

В том варианте как было написано не будет работать
Код:
function OnClicka() { 
    if (!state){
stopTime();
} else {
startTime();
}
state = !state;
}

А так будет

Но код бы я еще допиливал, есть еще нюансы.


« Последнее редактирование: 22-02-2014 13:29 от Sla » Записан

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

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

« Ответ #116 : 22-02-2014 12:56 » 

Sla, ну я специально уходил от очевидной строчки
Код: (Javascript)
state = !state
(у тебя там, кстати, какой-то status - поправь) из-за того, что это выражение работает только для логического типа. В общем случае нужно именно в каждой ветке своё запоминать или менять. Т.е., например, когда условие числовое или проверка на null.

По поводу рекурсивного перезапуска у меня сомнения: оставить или нет. Потому что чисто как техника "продолженного вычисления" это понадобится потом - при работе в AJAX. Я ещё ж по этой части никаких пояснений не давал. Но как объект это не оформлено и не работает.
Записан

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

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

WWW
« Ответ #117 : 22-02-2014 13:31 » 

Цитата
Sla, ну я специально уходил от очевидной строчки

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

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

ua
Offline Offline

« Ответ #118 : 22-02-2014 15:22 » 

Код:
var x = 3;
if(x == 3) /* и что-то дальше */
Мне нужно использовать это?Переменные
« Последнее редактирование: 22-02-2014 16:25 от Kaspiy » Записан
Dimka
Деятель
Команда клуба

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

« Ответ #119 : 22-02-2014 16:28 » 

Kaspiy, что "это"? Декларации переменных, описание объекта - конечно нужно. Но ты опять привёл кусок кода, и я всё сомневаюсь, что ты это понимаешь. Потому что в этом куске кода есть нужное, и есть ненужное. И кто тебя знает, на какую часть ты подумаешь "нужно", а на какую "не нужно". Это меня беспокоит.
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines