-
Notifications
You must be signed in to change notification settings - Fork 7
дз7 #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: gh-pages
Are you sure you want to change the base?
дз7 #3
Changes from 9 commits
e38bbdf
ce5137c
972c1c5
20fc2dd
f90678a
0bb2145
fdb3c76
1db9425
2363a74
17e0e5f
27182c0
4cd44a8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,91 @@ | ||
| (function (exports) { | ||
| "use strict"; | ||
|
|
||
| var Collection = function (items) { | ||
|
|
||
| this.items = []; | ||
| var key; | ||
|
|
||
| for (key in items) { | ||
| if (items.hasOwnProperty(key)) { | ||
| this.items.push(items[key]); | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| exports.Collection = Collection; | ||
|
|
||
| Collection.prototype.constructor = Collection; | ||
|
|
||
| /** | ||
| * Сериализует коллекцию | ||
| * | ||
| * @return {JSON object} | ||
| * | ||
| */ | ||
| Collection.prototype.serialise = function () { | ||
| return JSON.stringify(this.items, 3); | ||
| } | ||
|
|
||
| /** | ||
| * Добавляет в коллекцию объект | ||
| * | ||
| * @param {object} model | ||
| * | ||
| * @return {Collection} * @example | ||
| * | ||
| */ | ||
| Collection.prototype.add = function (model) { | ||
|
|
||
| var temp = new this.constructor(this.items); | ||
| temp.items.push(model); | ||
| return temp; | ||
| }; | ||
|
|
||
| /** | ||
| * @param {Function} selector | ||
| * | ||
| * @see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter | ||
| * | ||
| * @example | ||
| * new Collection().filter(function (item) { | ||
| * return item.get('attendee').indexOf("me") !== -1; | ||
| * }); | ||
| * @return {Collection} | ||
| */ | ||
| Collection.prototype.filter = function (selector) { | ||
|
|
||
| if (typeof selector !== "function") { | ||
| throw new Error('Argument must be function'); | ||
| } | ||
|
|
||
| return new this.constructor(this.items.filter(selector)); | ||
| }; | ||
|
|
||
| /** | ||
| * Принимает функцию сортировки и сортирует на основе ее | ||
| * | ||
| * @param {function} selector | ||
| * | ||
| * @return {Collection} * @example | ||
| * | ||
| */ | ||
| Collection.prototype.sort = function (selector) { | ||
|
|
||
| if (typeof selector !== "function") { | ||
| throw new Error('Argument must be function'); | ||
| } | ||
|
|
||
| return new this.constructor(this.items.sort(selector)); | ||
| }; | ||
|
|
||
| Collection.prototype.reverse = function () { | ||
|
|
||
| return new this.constructor(this.items.reverse()); | ||
| }; | ||
|
|
||
| Collection.prototype.length = function (selector) { | ||
|
|
||
| return this.items.length; | ||
| }; | ||
| }(window)); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| [ | ||
| {"name":"pewpew","start":"2012/11/07 10:18","end":"2012/11/07 10:18"}, | ||
| {"name":"Пара по веб-технологиям","start":"2012/11/20 12:50","end":"2012/11/20 12:50","location":"5 этаж","remindTime":10,"description":"Взять бумагу и ручку, не брать бук!"} | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| Modernizr.load({ | ||
| test: Modernizr.inputtypes.date, | ||
| nope: function () { | ||
| $("input[type='date']").datepicker(); | ||
| } | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,234 @@ | ||
| $(function (exports) { | ||
| "use strict"; | ||
|
|
||
| var ListOfEvents = new Events(), | ||
| sortedList = new Events(), | ||
| filterOption = "all", | ||
| sortOption = "without"; | ||
|
|
||
| $(document.body).on('load', initialise()); | ||
|
|
||
| /** | ||
| * Загружает свое состояние с сервера | ||
| * при отсутствии соединения/страницы на сервере пытается подключиться через 5 минут снова | ||
| * | ||
| */ | ||
| function initialise() { | ||
|
|
||
| $.ajax({ | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Так получится немного короче $.getJSON('/dz-7-jquery/current-event.json')$.getJSON("example.json")
.success(function() { alert("success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });http://api.jquery.com/jQuery.getJSON/ Старайся использовать относительные пути |
||
| dataType: 'json', | ||
| url: 'http://yunnii.github.com/dz-7-jquery/current-event.json', | ||
| success: function (jqXHR) { | ||
| var i, newEvent; | ||
|
|
||
| for (i = 0; i < jqXHR.length; i++) { | ||
| newEvent = new Event(jqXHR[i]).validate(); | ||
| ListOfEvents = ListOfEvents.add(newEvent); | ||
| } | ||
| changeDocument("sort"); | ||
| addListener(); | ||
| }, | ||
| error: function () { | ||
| $('#notifyError').show(); | ||
| return; | ||
| } | ||
| }) | ||
| .always(function () { | ||
| $("#notify").hide(); | ||
| }); | ||
| } | ||
| /** | ||
| * Добавляет новое событие в список. Если установлены опции фильтрации и сортировки | ||
| * - то располагает элементы на странице, в с-ии с ними | ||
| * | ||
| */ | ||
| function preventDefault() { | ||
|
|
||
| var name = $("#title").val(), | ||
| start = $("#from").val(), | ||
| end = $("#to").val(), | ||
| location = $("#location").val(), | ||
| raiting = $("#raiting").val(), | ||
| description = $("#description").val(), | ||
| remindTime = $("#remindTime").val(); | ||
|
|
||
| if (!validateTitle(name, $('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; } | ||
| if (!validateDate(start, $('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; } | ||
| if (!validateNumber(remindTime, $('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; } | ||
|
|
||
| var element = new Event({ | ||
| name: name, | ||
| start: start, | ||
| end: end, | ||
| location: location, | ||
| raiting: raiting, | ||
| description: description, | ||
| remindTime: remindTime | ||
| }).validate(); | ||
|
|
||
| var result = ListOfEvents.add(element); | ||
|
|
||
| $.ajax({ | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Аналогично $.post('/dz-7-jquery/current-event.json', result.serialise())
.success(function() { alert("success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); }); |
||
| type: 'POST', | ||
| url: 'http://yunnii.github.com/dz-7-jquery/current-event.json', | ||
| data: result.serialise(), | ||
| error: function () { | ||
| /*if (error === "error") { | ||
| alert("Не могу подключиться к северу. Попробуйте позже"); | ||
| return; | ||
| }*/ | ||
| } | ||
| }) | ||
| .always(function () { | ||
| ListOfEvents = result; | ||
| changeDocument("sort"); | ||
| document.forms["form"].reset(); | ||
| }); | ||
| } | ||
|
|
||
| function filterEvents(listEvents) { | ||
| switch (filterOption) { | ||
| case "future": | ||
| return listEvents.coming(); | ||
| case "past": | ||
| return listEvents.past(); | ||
| default: | ||
| return listEvents; | ||
| } | ||
| } | ||
|
|
||
| function sortEvents(listEvents) { | ||
| switch (sortOption) { | ||
| case "byName": | ||
| return ListOfEvents.sortByName(); | ||
| case "byStart": | ||
| return ListOfEvents.sortByTime(); | ||
| case "byRaiting": | ||
| return ListOfEvents.sortByRaiting(); | ||
| default: | ||
| return ListOfEvents; | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Сортирует и фильтрует события в соответствии с указанными опциями. | ||
| * | ||
| * @param {string} changeType - если указана строка "sort", то события также будут отсортированы, | ||
| * инчае - только отфильтрованы | ||
| * @return коллекция объектов типа event | ||
| */ | ||
|
|
||
| function changeDocument(changeType) { | ||
| var $removeList = $(".events"); | ||
| $removeList.remove(); | ||
|
|
||
| var $addList = $('<ul />') | ||
| .addClass("events"); | ||
|
|
||
| var fragment = document.createDocumentFragment(); | ||
|
|
||
| if (changeType === "sort") { | ||
| sortedList = sortEvents(ListOfEvents); | ||
| } | ||
| var filterList = filterEvents(sortedList), | ||
| length = filterList.length(), | ||
| i; | ||
|
|
||
| for (i = 0; i < length; i++) | ||
| { | ||
| var element = filterList.items[i]; | ||
| var $el = addLiElement(element); | ||
| $el.appendTo($addList); | ||
| } | ||
|
|
||
| var $parent = $(".collection"); | ||
| $addList.appendTo(fragment); | ||
| $parent.append(fragment); | ||
| } | ||
|
|
||
| /** | ||
| * Создает DOM-элемент типа li, заполняется полями из объекта | ||
| * | ||
| * @param {Event} element - объект типа Element | ||
| * | ||
| * @return Возвращает созданный дом-элемент типа li | ||
| */ | ||
|
|
||
| function addLiElement (element) { | ||
| var $el = $('<li />') | ||
| .addClass("event_item"), | ||
|
|
||
| $name = $('<div />', { | ||
| text: "Название: " + element.name | ||
| }).appendTo($el), | ||
|
|
||
| $start = $('<div />', { | ||
| text: "Начало: " + element.start | ||
| }).appendTo($el), | ||
|
|
||
| $end = $('<div />', { | ||
| text: "Окончание: " + element.end | ||
| }).appendTo($el), | ||
|
|
||
| $location = $('<div />', { | ||
| text: "Местоположение: " + element.location | ||
| }).appendTo($el), | ||
|
|
||
| $remindTime = $('<div />', { | ||
| text: "Напомнить за: " + element.remindTime + "минут" | ||
| }).appendTo($el), | ||
|
|
||
| $description = $('<div />', { | ||
| text: "Описание: " + element.description | ||
| }).appendTo($el), | ||
|
|
||
| $raiting = $('<div />', { | ||
| text: "Рейтинг: " + element.raiting | ||
| }).appendTo($el); | ||
|
|
||
| return $el; | ||
| }; | ||
|
|
||
| /** | ||
| * Навешивает обработчики событий на страницу | ||
| */ | ||
| function addListener() { | ||
| var $name = $("#title"); | ||
| var $start = $("#from"); | ||
| var $remindTime = $("#remindTime"); | ||
| var $filters = $('.filter'); | ||
| var $sort = $('.sort'); | ||
| var $button = $("#addButton"); | ||
|
|
||
| $name.on('blur', function($event) { | ||
| var cur = $event.currentTarget; | ||
| validateTitle(cur.value, $('#title_help')); | ||
| }); | ||
|
|
||
| $start.on('blur', function ($event) { | ||
| var cur = $event.currentTarget; | ||
| validateDate(cur.value, $('#from_help')); | ||
| }); | ||
|
|
||
| $remindTime.on('blur', function ($event) { | ||
| var cur = $event.currentTarget; | ||
| validateNumber(remindTime.value, $('#remindTime_help')); | ||
| }); | ||
|
|
||
| $filters.each(function(index) { | ||
| $(this).on('change', function ($event) { | ||
| filterOption = $('input[name="filter"]:checked').val(); | ||
| changeDocument("filter"); | ||
| })}); | ||
|
|
||
| $sort.each(function(index) { | ||
| $(this).on('change', function ($event) { | ||
| sortOption = $('input[name="sort"]:checked').val(); | ||
| changeDocument("sort"); | ||
| })}); | ||
|
|
||
|
|
||
| $button.on('click', preventDefault); | ||
| } | ||
|
|
||
| }(window)); | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
У тебя тут произойдет следющее: функция
initialise()будет вызвана, а результат ее выполнения будет передан в функцию.on()те фактически:Скорее всего это просто невнимательность :)
Вобще лучше использовать событие DOMContentLoaded вместо onload
или сокращенно
Разница между DOMContentLoaded и onload в следующем: load срабатывает когда все ресурсы страницы загрузились DOMContentLoaded - когда загрузился только документ. На страницце может быть много картинок и в случае с onload она "оживет" только когда они все загрузяться.
http://stackoverflow.com/questions/3698200/window-onload-vs-document-ready