07.09.2012, 14:27
|
|
Интересующийся
|
|
Регистрация: 18.07.2012
Сообщений: 11
|
|
Покритикуйте код новичка кому не сложно(HTML,CSS,JS)
Это можно сказать мое первое JS приложение.
Задание взял с elance.
Само задание
При выполнении не использовал ни каких библиотек(т.к. их еще не учил ).
Целью было - закрепить материал пройденный на learn.javascript.ru до раздела "Анимация" (включительно).
Готовое задание
Поддержка ie7+ современные браузеры.
Так как учу все сам, дома, нет знакомых кто бы шарил в этой области - прошу помощи у профи на этом сайте.
У кого есть время и желание покритикуйте код, укажите на ошибки.
Буду рад любой критике(html, css, js, стиль кода и все в общем).
Последний раз редактировалось vchmuzh, 19.10.2012 в 23:23.
|
|
08.09.2012, 21:57
|
|
Администратор
|
|
Регистрация: 25.05.2007
Сообщений: 1,221
|
|
Лучше структурируйте код, желательно использовать ООП, шаблоны.
Задача интересная. Может, добавлю как-нибудь на learn
|
|
08.09.2012, 22:28
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
label на цифру не хватает, а то я неспамши только с третьего раза на точку попадаю.)
__________________
29375, 35
|
|
09.09.2012, 00:10
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от vchmuzh
|
Это можно сказать мое первое JS приложение.
|
Сколько JS по времени учили?
Ну, сами напросились! (шучу)
var OPTIONS = 6; // кол-во вариантов ответа
Не сказать, что плохо - это деревянно. Нельзя создать опрос с разным количеством вариантов ответа. << сказали "шесть" - значит "шесть"! >>
countAnswers(target); /* при каждом ответе делается пресчет всех уже сделанных ответов
если ответы даны на все вопросы - секция закрывается автоматически и подводится итог*/
трудоёмко. обычно для последовательной записи используют массивы.
function addClass(elem, cls) {
var arr = elem.className.split(' ');
for(var i=0; i<arr.length; i++) {
if(arr[i] == cls) return;
}
arr.push(cls);
return elem.className = arr.join(' ');
}
function removeClass(elem, cls) {
var arr = elem.className.split(' ');
for(var i=0; i<arr.length; i++) {
if(arr[i] == cls) arr.splice(i--, 1);
}
return elem.className = arr.join(' ');
}
function hasClass(elem, cls) {
var arr = elem.className.split(' ');
for(var i=0; i<arr.length; i++) {
if(arr[i] == cls) return true;
}
return false;
}
вообще, код организован по процедурному принципу "никаких объектов, только функции".
такой код может быть трудно расширять и дополнять. (сам так пишу на коленке)
наверное, настало время почитать про такие штуки, как паттерны. MVC тот же, например.
function animate(opts) {
var start = new Date;
var delta = opts.delta || linear;
var timer = setInterval(function() {
var progress = (new Date - start) / opts.duration;
if (progress > 1) progress = 1;
opts.step(1 - delta(1 - progress) );
if (progress == 1) {
clearInterval(timer);
opts.complete && opts.complete();
}
}, opts.delay || 13);
return timer;
}
родная тоже с неё начинал понимание, пока не прошибло.
задержка в 13 мс. по-умолчанию даёт ~77 кадра в секунду. Это потрясно.
Последний раз редактировалось melky, 09.09.2012 в 00:13.
|
|
09.09.2012, 01:01
|
|
Интересующийся
|
|
Регистрация: 18.07.2012
Сообщений: 11
|
|
Спасибо всем большое за советы! Все учту.
Сообщение от Илья Кантор
|
Задача интересная. Может, добавлю как-нибудь на learn
|
Круто
Сообщение от melky
|
Сколько JS по времени учили?
|
Где-то месяца три , по выходным и иногда по вечерам после работы.
Сообщение от melky
|
обычно для последовательной записи используют массивы.
|
Можно немного подробнее? Не совсем понимаю.
|
|
09.09.2012, 01:40
|
Интересующийся
|
|
Регистрация: 30.08.2011
Сообщений: 12
|
|
Зачем вводить в заблуждение новичков? Используемое число, близкое к 13 мс, объясняется, например, у Николаса Закаса в его книге "JavaScript. Оптимизация производительности" - books.ru качается демка книги с упомянутым текстом.
"Точность таймера
Таймеры в JavaScript не отличаются высокой точностью и могут ошибаться на несколько миллисекунд в ту или иную сторону. Если при создании таймера указан интервал 250 мс, это еще не означает, что задание будет добавлено в очередь ровно через 250 мс после вызова setTimeout(). Все броузеры стараются обеспечить максимально высокую точность, но ошибки на несколько миллисекунд в ту или иную сторону нередки. Поэтому таймеры не считаются надежным средством измерения интервалов времени. Разрешающая способность таймеров в Windows составляет 15 мс, поэтому задержка 15 мс, указанная при создании таймера, будет интерпретироваться как 0 или 15 мс в зависимости от момента последнего обновления системного времени. Использование задержек менее 15 мс в Internet Explorer может привести к блокировке броузера, поэтому минимальная задержка, которую рекомендуется устанавливать в нем, составляет 25 мс (которая будет интерпретироваться как 15 или 30 мс), чтобы гарантировать минимальную задержку 15 мс. Такое ограничение минимальной величины задержки также позволит избежать проблем, связанных с разрешающей способностью таймеров в других броузерах и в других системах. Большинство броузеров показывает снижение точности срабатывания таймеров при использовании задержек менее 10 мс."
|
|
09.09.2012, 02:30
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от vchmuzh
|
Можно немного подробнее? Не совсем понимаю.
|
section.total += +questions[i].answer;// сумма балов
ready++; // кол-во готовых ответов
Это может высчитываться при клике. Есть массив вопросов, где лежит информация о каждом вопросе - сумма баллов, кол-во готовых ответов.
Сообщение от jqueryscripter
|
Зачем вводить в заблуждение новичков? Используемое число, близкое к 13 мс, объясняется, например, у Николаса Закаса в его книге "JavaScript. Оптимизация производительности" - books.ru качается демка книги с упомянутым текстом.
"Точность таймера
|
Нет, не качается - в статье обьясняется, почему берётся именно такой интервал, да и почему вообще интервал, а не таймаут. И вообще, эта тема уже не раз разжёвана, как в интернетах, так и в учебнике. И если уж на то пошло, то лучше бы Вы указали на предпочтительное использование requestAnimationFrame вместо интервалов\таймаутов.
... по демке, кстати, не оценил книгу, т.к. не нашёл оглавления. его можно где-нибудь увидеть?
Последний раз редактировалось melky, 09.09.2012 в 02:33.
|
|
09.09.2012, 13:32
|
|
Интересующийся
|
|
Регистрация: 18.07.2012
Сообщений: 11
|
|
Сообщение от melky
|
section.total += +questions[i].answer;// сумма балов
ready++; // кол-во готовых ответов
Это может высчитываться при клике.
|
Это высчитывается при клике.
Сообщение от melky
|
Есть массив вопросов, где лежит информация о каждом вопросе - сумма баллов, кол-во готовых ответов.
|
Я примерно понимаю что вы имеете ввиду, но не могу додуматься как
это реализовать, что бы пользователь мог возвращаться, менять свой ответ и пропускать вопросы.
|
|
09.09.2012, 13:55
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от vchmuzh
|
Это высчитывается при клике.
|
нет, в цикле. я имеел в виду прибавлять сразу, на месте, без обхода всех вопросов.
|
|
09.09.2012, 14:30
|
|
Интересующийся
|
|
Регистрация: 18.07.2012
Сообщений: 11
|
|
Сообщение от melky
|
нет, в цикле. я имеел в виду прибавлять сразу, на месте, без обхода всех вопросов.
|
начинаю понимать.
Можно сделать так:
в объекте section добавить такое свойство
section.numberOfCurrentQuestion
и при пререходе от вопроса к вопросу, следующему или предыдущему, менять его на +1, или -1 соответственно.
и свойство
section.arrayOfAnswers
- значением которого будет массив, в котором в каждом элементе будут данные баллах полученных за ответ на конкретный вопрос
потом при ответе(клике)
считаем общую сумму баллов и кол-во готовых ответов section.sumOfReady =0; и section.totalScore = 0;
var current = section.numberOfCurrentQuestion;// индекс текущего вопроса
if(section.arrayOfAnswers[current]) { // если ответ на этот вопрос уже был сделан
section.totalScore -= +section.arrayOfAnswers[current];// отнимаем баллы прошлого ответа
section.arrayOfAnswers[current] = input.value ;// меняем старый результат ответа на новый
section.totalScore += +section.arrayOfAnswers[current]; // прибавляем баллы нового ответа
} else {// если еще не сделан
section.arrayOfAnswers[current] = input.value;// кол-во баллов за этот ответ
section.totalScore += +section.arrayOfAnswers[current];// прибавляем баллы к общей сумме;
section.sumOfReady++;// еще один готовый ответ
}
Как то так правильно?
пока проще ничего придумать не могу.
Последний раз редактировалось vchmuzh, 09.09.2012 в 16:33.
|
|
|
|