From 8410ce6421b45b3e25d2e8c7ded367c034a9d955 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 12 Mar 2015 10:26:02 +0300 Subject: [PATCH] minor renovations, beautify round 2 (final) --- .../2-first-steps/6-variable-names/article.md | 2 +- .../7-array/9-eratosthenes-sieve/sieve.gif | Bin 0 -> 44506 bytes .../7-array/9-eratosthenes-sieve/task.md | 2 +- .../5-coffeemachine-add-isrunning/task.md | 2 +- .../10-regexp-backreferences/article.md | 6 +- .../12-regexp-alternation/article.md | 2 +- .../article.md | 12 +- .../14-regexp-multiline-mode/article.md | 4 +- .../15-regexp-word-boundary/article.md | 8 +- .../2-regexp-methods/article.md | 40 ++-- .../3-regexp-character-classes/article.md | 16 +- .../article.md | 14 +- .../1-find-text-manydots/solution.md | 2 +- .../1-find-text-manydots/task.md | 2 +- .../7-regexp-quantifiers/article.md | 24 +-- .../8-regexp-greedy-and-lazy/article.md | 2 +- .../9-regexp-groups/article.md | 34 +-- 10-regular-expressions-javascript/index.md | 4 +- 12-extra/10-cookie/article.md | 44 ++-- .../11-intl/1-collate-array-sort/solution.md | 2 +- 12-extra/11-intl/1-collate-array-sort/task.md | 2 +- 12-extra/11-intl/article.md | 36 ++-- 12-extra/12-regexp-specials/article.md | 34 +-- 12-extra/3-templates/article.md | 6 +- 12-extra/4-books/article.md | 2 +- 12-extra/5-setImmediate/article.md | 1 + 12-extra/6-bind-late/article.md | 4 +- .../8-range-textrange-selection/article.md | 195 +++++++++--------- .../1-browser-environment/article.md | 4 +- .../10-compare-document-position/article.md | 49 +++-- .../10-clock-setinterval/solution.md | 14 +- .../2-remove-polyfill/solution.md | 2 +- .../2-remove-polyfill/task.md | 6 +- .../3-insert-after/solution.md | 6 +- .../3-insert-after/task.md | 3 +- .../4-remove-children/solution.md | 8 +- .../4-remove-children/task.md | 4 +- .../11-modifying-document/5-why-aaa/task.md | 10 +- .../7-create-object-tree/task.md | 20 +- .../11-modifying-document/article.md | 16 +- 2-ui/1-document/12-multi-insert/article.md | 37 ++-- 2-ui/1-document/13-document-write/article.md | 26 ++- .../2-create-notification/task.md | 2 +- .../14-styles-and-classes/article.md | 29 ++- .../15-metrics/2-scrollbar-width/solution.md | 4 +- .../15-metrics/3-div-placeholder/solution.md | 4 +- .../15-metrics/3-div-placeholder/task.md | 2 +- .../4-put-ball-in-center/solution.md | 8 +- 2-ui/1-document/15-metrics/article.md | 5 +- 2-ui/1-document/16-metrics-window/article.md | 10 +- .../1-find-point-coordinates/solution.md | 6 +- .../18-coordinates-document/article.md | 41 ++-- .../2-dom-nodes/1-body-from-head/solution.md | 5 +- .../2-dom-nodes/1-body-from-head/task.md | 5 +- 2-ui/1-document/2-dom-nodes/article.md | 58 +++--- .../4-traversing-dom/1-dom-children/task.md | 29 +-- .../2-has-childnodes/solution.md | 3 + .../4-traversing-dom/2-has-childnodes/task.md | 1 + 2-ui/1-document/4-traversing-dom/article.md | 51 +++-- .../2-tree/solution.md | 2 +- .../5-searching-elements-dom/article.md | 39 ++-- .../solution.md | 7 +- .../1-collection-length-after-remove/task.md | 4 +- .../2-compare-elements-count/task.md | 2 +- .../3-benchmark-search-dom/solution.md | 2 +- .../6-searching-elements-internals/article.md | 14 +- .../solution.md | 8 +- .../2-lastchild-nodetype-inline/solution.md | 14 +- .../2-lastchild-nodetype-inline/task.md | 14 +- .../3-tag-in-comment/solution.md | 6 +- .../3-tag-in-comment/task.md | 6 +- .../7-basic-dom-node-properties/article.md | 81 ++++---- .../1-polyfill-matches/solution.md | 6 +- .../3-polyfill-textcontent-ie8/solution.md | 15 +- 2-ui/1-document/8-dom-polyfill/article.md | 18 +- .../1-get-user-attribute/solution.md | 4 +- .../1-get-user-attribute/task.md | 6 +- .../2-set-class-links/solution.md | 16 +- .../2-set-class-links/task.md | 16 +- .../article.md | 54 ++--- .../2-hide-self-onclick/solution.md | 2 +- .../3-which-handlers-run/solution.md | 4 +- .../3-which-handlers-run/task.md | 1 + .../4-sliding-menu/solution.md | 30 ++- .../5-hide-message/solution.view/messages.css | 2 +- .../5-hide-message/source.view/messages.css | 2 +- .../1-introduction-browser-events/article.md | 67 +++--- .../2-events-and-timing-depth/article.md | 9 +- .../3-obtaining-event-object/article.md | 10 +- .../4-event-bubbling/article.md | 16 +- .../solution.view/messages.css | 2 +- .../source.view/messages.css | 2 +- .../2-sliding-tree/solution.md | 48 +++-- .../5-event-delegation/article.md | 58 +++--- .../1-why-return-false-fails/solution.md | 2 +- .../1-why-return-false-fails/task.md | 2 +- .../2-catch-link-navigation/solution.md | 8 +- .../3-image-gallery/solution.md | 6 +- .../7-default-browser-action/article.md | 7 +- .../8-dispatch-events/article.md | 77 +++---- .../3-event-details/1-mouse-clicks/article.md | 12 +- .../10-onload-ondomcontentloaded/article.md | 20 +- .../3-script-callback/task.md | 2 +- .../4-scripts-callback/task.md | 1 + .../11-onload-onerror/article.md | 21 +- .../3-event-details/2-unselectable/article.md | 18 +- .../2-hoverintent/task.md | 2 +- .../article.md | 4 +- .../4-drag-and-drop/article.md | 20 +- .../5-drag-and-drop-objects/article.md | 10 +- 2-ui/3-event-details/6-mousewheel/article.md | 10 +- 2-ui/3-event-details/7-fixevent/article.md | 10 +- .../8-onscroll/2-updown-button/solution.md | 4 +- .../8-onscroll/3-load-visible-img/solution.md | 4 +- 2-ui/3-event-details/8-onscroll/article.md | 2 +- .../1-numeric-input/solution.md | 6 +- .../2-check-sync-keydown/task.md | 1 + .../9-keyboard-events/article.md | 32 +-- .../1-add-select-option/solution.md | 4 +- .../1-form-elements/article.md | 90 ++++---- .../2-focus-blur/3-hotkeys/solution.md | 34 +-- .../7-capslock-warning-field/solution.md | 18 +- 2-ui/4-forms-controls/2-focus-blur/article.md | 76 ++++--- .../3-events-change/article.md | 91 ++++---- .../4-forms-submit/1-modal-dialog/task.md | 2 +- .../4-forms-submit/article.md | 2 +- .../2-widgets-structure/1-clock/task.md | 2 +- .../6-voter-add-step/task.md | 2 +- 2-ui/5-widgets/2-widgets-structure/article.md | 14 +- .../3-widgets-markup/1-semantic-menu/task.md | 2 - 2-ui/5-widgets/3-widgets-markup/article.md | 2 +- .../1-table-template/task.md | 1 + .../4-template-lodash/3-menu-template/task.md | 6 +- 2-ui/5-widgets/4-template-lodash/article.md | 33 ++- .../5-custom-events/1-voter-events/task.md | 2 +- .../4-slider-events/solution.md | 4 +- .../5-custom-events/4-slider-events/task.md | 2 +- 2-ui/5-widgets/5-custom-events/article.md | 5 +- .../2-webcomponent-core/article.md | 6 +- 3-webcomponents/3-shadow-dom/article.md | 10 +- 3-webcomponents/4-template-tag/article.md | 12 +- 3-webcomponents/5-css-scoping/article.md | 55 +++-- 3-webcomponents/6-link-import/article.md | 3 + .../7-webcomponent-build/article.md | 70 ++++--- 3-webcomponents/index.md | 4 +- 4-ajax/10-ajax-jsonp/article.md | 7 +- 4-ajax/11-server-sent-events/article.md | 15 +- 4-ajax/12-ajax-iframe/article.md | 44 ++-- 4-ajax/13-csrf/article.md | 1 + 4-ajax/2-ajax-nodejs/article.md | 2 +- .../1-phones-list/solution.md | 28 +-- 4-ajax/3-ajax-xmlhttprequest/article.md | 14 +- 4-ajax/4-xhr-forms/article.md | 31 +-- 4-ajax/5-xhr-crossdomain/article.md | 7 +- 4-ajax/6-xhr-onprogress/article.md | 30 +-- 4-ajax/7-xhr-resume/article.md | 4 +- 4-ajax/9-websockets/article.md | 17 +- 4-ajax/9-websockets/websocket.zip | Bin 0 -> 1950 bytes 4-ajax/index.md | 4 +- 5-animation/1-bezier/article.md | 4 + 5-animation/1-bezier/demo.svg | 2 +- .../1-animate-logo-css/solution.md | 2 +- 5-animation/2-css-transitions/article.md | 75 ++++--- .../3-js-animation/1-animate-ball/solution.md | 2 +- .../2-animate-ball-hops/solution.md | 6 +- 5-animation/3-js-animation/article.md | 38 ++-- 6-optimize/1-memory-leaks/article.md | 22 +- 6-optimize/2-memory-leaks-jquery/article.md | 45 ++-- .../jquery-leak.view/index.html | 34 --- 6-optimize/3-minification/article.md | 125 +++++------ 6-optimize/4-better-minification/article.md | 76 +++---- .../5-gcc-advanced-optimization/article.md | 30 ++- 6-optimize/6-gcc-check-types/article.md | 12 +- 6-optimize/7-gcc-closure-library/article.md | 31 ++- .../8-memory-removechild-innerhtml/article.md | 8 +- 7-frames-and-windows/2-iframes/article.md | 18 +- .../3-same-origin-policy/article.md | 20 +- .../article.md | 7 +- .../5-window-focus/article.md | 38 ++-- .../6-clickjacking/article.md | 12 +- 8-css-for-js/10-box-sizing/article.md | 41 ++-- .../11-margin/1-failing-margins/task.md | 2 +- 8-css-for-js/11-margin/article.md | 9 +- 8-css-for-js/12-space-under-img/article.md | 75 ++++--- 8-css-for-js/13-overflow/article.md | 10 +- 8-css-for-js/14-height-percent/article.md | 5 +- .../1-select-elements-selector/task.md | 4 +- 8-css-for-js/15-css-selectors/article.md | 33 +-- 8-css-for-js/17-css-sprite/article.md | 36 ++-- 8-css-for-js/18-css-format/article.md | 20 +- 8-css-for-js/2-css-units/article.md | 6 +- 8-css-for-js/3-display/article.md | 9 +- .../4-float/3-paginator-css/solution.md | 5 +- .../4-add-border-keep-width/solution.md | 2 +- .../4-float/4-add-border-keep-width/task.md | 2 +- 8-css-for-js/4-float/article.md | 4 + 8-css-for-js/5-position/article.md | 16 +- .../solution.md | 2 +- .../task.md | 2 +- 8-css-for-js/6-css-center/article.md | 14 +- .../7-font-size-line-height/article.md | 2 +- 8-css-for-js/8-white-space/article.md | 3 +- 8-css-for-js/9-outline/article.md | 2 +- .../3-jquery-stub/2-jquery-search/article.md | 37 ++-- .../1-select-parents-with-self/task.md | 12 +- .../3-jquery-traversal/article.md | 93 +++++---- archive/4-script-place-optimize/article.md | 31 +-- archive/widget-tasks/1-date-selector/task.md | 8 +- .../1-tooltip-over-element/solution.md | 7 +- .../1-tooltip-over-element/task.md | 2 +- .../widget-tasks/2-draggable-windows/task.md | 2 +- .../widget-tasks/2-moving-tooltip/solution.md | 1 + 212 files changed, 1981 insertions(+), 1717 deletions(-) create mode 100644 1-js/4-data-structures/7-array/9-eratosthenes-sieve/sieve.gif create mode 100644 4-ajax/9-websockets/websocket.zip delete mode 100644 6-optimize/2-memory-leaks-jquery/jquery-leak.view/index.html diff --git a/1-js/2-first-steps/6-variable-names/article.md b/1-js/2-first-steps/6-variable-names/article.md index ceb5ab74..202a4f03 100644 --- a/1-js/2-first-steps/6-variable-names/article.md +++ b/1-js/2-first-steps/6-variable-names/article.md @@ -95,7 +95,7 @@ var border_left_width; Есть причина и поважнее. Поскольку именно это имя переменной пришло в голову -- скорее всего, оно больше соответствует хранимым там данным, чем то, которое было мы придумали изначально. Исключения бывают, но в любом случае -- такое несовпадение -- это повод задуматься. -Чтобы удобно переименовывать переменную, нужно использовать [хороший редактор JavaScript](/editors), тогда этот процесс будет очень простым и быстрым. +Чтобы удобно переименовывать переменную, нужно использовать [хороший редактор JavaScript](/editor), тогда этот процесс будет очень простым и быстрым. [smart header="Если коротко..."] Смысл имени переменной -- это "имя на коробке", по которому мы сможем максимально быстро находить нужные нам данные. diff --git a/1-js/4-data-structures/7-array/9-eratosthenes-sieve/sieve.gif b/1-js/4-data-structures/7-array/9-eratosthenes-sieve/sieve.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1960cefce9ed783675b6f3d7ed0a4b76f604d28 GIT binary patch literal 44506 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Все оставшиеся незачеркнутыми числа -- простые. -Посмотрите также анимацию алгоритма. +Посмотрите также [анимацию алгоритма](sieve.gif). Реализуйте "Решето Эратосфена" в JavaScript, используя массив. diff --git a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md b/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md index 4fd21cdf..7d8ff96c 100644 --- a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md +++ b/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md @@ -22,4 +22,4 @@ coffeeMachine.setOnReady(function() { }); ``` -Исходный код возьмите из решения [предыдущей задачи](/task/setter-onReady). \ No newline at end of file +Исходный код возьмите из решения [предыдущей задачи](/task/setter-onready). \ No newline at end of file diff --git a/10-regular-expressions-javascript/10-regexp-backreferences/article.md b/10-regular-expressions-javascript/10-regexp-backreferences/article.md index f2f69286..bb8e3a82 100644 --- a/10-regular-expressions-javascript/10-regexp-backreferences/article.md +++ b/10-regular-expressions-javascript/10-regexp-backreferences/article.md @@ -10,7 +10,7 @@ var name = "Александр Пушкин"; name = name.replace(/([а-яё]+) ([а-яё]+)/i, "$2, $1"); -alert(name); // Пушкин, Александр +alert( name ); // Пушкин, Александр ``` К скобочной группе можно также обратиться в самом шаблоне. @@ -25,7 +25,7 @@ str = "He said:\"She's the one\"." reg = /['"](.*?)['"]/g -alert( str.match(reg) ) // "She' +alert(str.match(reg)) // "She' ``` Как видно, регэксп нашёл открывающую кавычку ", затем текст, вплоть до новой кавычки ', которая закрывает соответствие. @@ -38,7 +38,7 @@ str = "He said:\"She's the one\"." reg = /(['"])(.*?)\1/g -alert( str.match(reg) ) // "She's the one" +alert(str.match(reg)) // "She's the one" ``` Теперь работает верно! diff --git a/10-regular-expressions-javascript/12-regexp-alternation/article.md b/10-regular-expressions-javascript/12-regexp-alternation/article.md index b9a4cb55..adb1adc9 100644 --- a/10-regular-expressions-javascript/12-regexp-alternation/article.md +++ b/10-regular-expressions-javascript/12-regexp-alternation/article.md @@ -14,7 +14,7 @@ var reg = /html|php|css|java(script)?/gi var str = "Сначала появился HTML, затем CSS, потом JavaScript" -alert( str.match(reg) ) // 'HTML', 'CSS', 'JavaScript' +alert(str.match(reg)) // 'HTML', 'CSS', 'JavaScript' ``` **Альтернация имеет очень низкий приоритет.** diff --git a/10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md b/10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md index 736de5d2..3ac236a6 100644 --- a/10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md +++ b/10-regular-expressions-javascript/13-regexp-ahchors-and-multiline-mode/article.md @@ -16,7 +16,7 @@ ```js //+ run var str = '100500 попугаев съели 500100 бананов!'; -alert( str.match( /\d+/ig ) // 100500, 500100 (все числа) +alert(str.match(/\d+/ig) // 100500, 500100 (все числа) ``` А с кареткой: @@ -24,7 +24,7 @@ alert( str.match( /\d+/ig ) // 100500, 500100 (все числа) ```js //+ run var str = '100500 попугаев съели 500100 бананов!'; -alert( str.match( /^\d+/ig ) // 100500 (только в начале строки)*!* +alert(str.match(/^\d+/ig) // 100500 (только в начале строки)*!* ``` Знак доллара $ используют, чтобы указать, что паттерн должен заканчиваться в конце текста. @@ -34,7 +34,7 @@ alert( str.match( /^\d+/ig ) // 100500 (только в начале строк ```js //+ run var str = '100500 попугаев съели 500100 бананов!'; -alert( str.match( /\d+$/ig ) // null (в начале строки чисел нет)*!* +alert(str.match(/\d+$/ig) // null (в начале строки чисел нет)*!* ``` Якоря используют одновременно, чтобы указать, что паттерн должен охватывать текст с начала и до конца. Обычно это требуется при валидации. @@ -46,7 +46,7 @@ alert( str.match( /\d+$/ig ) // null (в начале строки чисел ```js //+ run var num = "ля-ля 12.34"; -alert( num.match( /\d+\.\d+/ig) ); // 12.34 +alert( num.match(/\d+\.\d+/ig) ); // 12.34 ``` Если мы хотим проверить, что `num` *целиком* соответствует паттерну \d+\.\d+, то укажем якоря по обе стороны от него: @@ -54,9 +54,9 @@ alert( num.match( /\d+\.\d+/ig) ); // 12.34 ```js //+ run var num = "ля-ля 12.34"; -alert( num.match( /^\d+\.\d+$/ig) ); // null, не дробь +alert( num.match(/^\d+\.\d+$/ig) ); // null, не дробь var num = "12.34"; -alert( num.match( /^\d+\.\d+$/ig) ); // 12.34, дробь! +alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь! ``` diff --git a/10-regular-expressions-javascript/14-regexp-multiline-mode/article.md b/10-regular-expressions-javascript/14-regexp-multiline-mode/article.md index d2e147e8..1f0e0d19 100644 --- a/10-regular-expressions-javascript/14-regexp-multiline-mode/article.md +++ b/10-regular-expressions-javascript/14-regexp-multiline-mode/article.md @@ -15,7 +15,7 @@ var str = '1е место: Винни-пух\n' + '2е место: Пятачок\n' + '33е место: Слонопотам'; -alert( str.match(/^\d+/gm ) ); // 1, 2, 33*!* +alert( str.match(/^\d+/gm) ); // 1, 2, 33*!* ``` Обратим внимание -- без флага /m было бы только первое число: @@ -26,7 +26,7 @@ var str = '1е место: Винни-пух\n' + '2е место: Пятачок\n' + '33е место: Слонопотам'; -alert( str.match(/^\d+/g ) ); // 1 +alert( str.match(/^\d+/g) ); // 1 ``` Это потому что в обычном режиме каретка ^ -- это только начало текста. diff --git a/10-regular-expressions-javascript/15-regexp-word-boundary/article.md b/10-regular-expressions-javascript/15-regexp-word-boundary/article.md index 09ddc758..50c64d53 100644 --- a/10-regular-expressions-javascript/15-regexp-word-boundary/article.md +++ b/10-regular-expressions-javascript/15-regexp-word-boundary/article.md @@ -6,7 +6,7 @@ For example, \bdog\b matches a standalone dog matches, because the previous char is a space (non-wordly), and the next position is text end. @@ -16,14 +16,14 @@ If the word is long enough, it may match multiple times: ```js //+ run -showMatch( "Boombaroom", /\w{4}/g) // 'Boom', 'baro' +showMatch("Boombaroom", /\w{4}/g) // 'Boom', 'baro' ``` Appending \b causes \w{4}\b to match only at word end: ```js //+ run -showMatch( "Because life is awesome", /\w{4}\b/g) // 'ause', 'life', 'some' +showMatch("Because life is awesome", /\w{4}\b/g) // 'ause', 'life', 'some' ``` **The word boundary \b like ^ and $ doesn't match a char. It only performs the check.** @@ -32,7 +32,7 @@ Let's add the check from another side, \b\w{4}\b: ```js //+ run -showMatch( "Because life is awesome", /\b\w{4}\b/g) // 'life' +showMatch("Because life is awesome", /\b\w{4}\b/g) // 'life' ``` Now there is only one result life. diff --git a/10-regular-expressions-javascript/2-regexp-methods/article.md b/10-regular-expressions-javascript/2-regexp-methods/article.md index d637ea65..a0c4b801 100644 --- a/10-regular-expressions-javascript/2-regexp-methods/article.md +++ b/10-regular-expressions-javascript/2-regexp-methods/article.md @@ -112,7 +112,7 @@ alert( result.index ); // undefined var str = "Ой-йой-йой"; // результат match не всегда массив! -alert( str.match( /лю/gi ).length ) // ошибка! нет свойства length у null +alert(str.match(/лю/gi).length) // ошибка! нет свойства length у null ``` [/warn] @@ -124,7 +124,7 @@ alert( str.match( /лю/gi ).length ) // ошибка! нет свойства l ```js //+ run -alert( '12-34-56'.split('-') ) // [12, 34, 56] +alert('12-34-56'.split('-')) // [12, 34, 56] ``` Можно передать в него и регулярное выражение, тогда он разобьёт строку по всем совпадениям. @@ -133,7 +133,7 @@ alert( '12-34-56'.split('-') ) // [12, 34, 56] ```js //+ run -alert( '12-34-56'.split(/-/) ) // [12, 34, 56] +alert('12-34-56'.split(/-/)) // [12, 34, 56] ``` ## str.replace(reg, str|func) @@ -145,7 +145,7 @@ alert( '12-34-56'.split(/-/) ) // [12, 34, 56] ```js //+ run // заменить дефис на двоеточие -alert( '12-34-56'.replace("-", ":") ) // 12:34-56 +alert('12-34-56'.replace("-", ":")) // 12:34-56 ``` **При вызове со строкой замены `replace` всегда заменяет только первое совпадение.** @@ -198,7 +198,7 @@ alert( '12-34-56'.replace( *!*/-/g*/!*, ":" ) ) // 12:34:56 //+ run var str = "Василий Пупкин"; -alert( str.replace( /(Василий) (Пупкин)/ ,'$2, $1') ) // Пупкин, Василий +alert(str.replace(/(Василий) (Пупкин)/, '$2, $1')) // Пупкин, Василий ``` Ещё пример, с использованием `$&`: @@ -207,7 +207,7 @@ alert( str.replace( /(Василий) (Пупкин)/ ,'$2, $1') ) // Пупки //+ run var str = "Василий Пупкин"; -alert( str.replace( /Василий Пупкин/ ,'Великий $&!') ) // Великий Василий Пупкин! +alert(str.replace(/Василий Пупкин/, 'Великий $&!')) // Великий Василий Пупкин! ``` **Для ситуаций, который требуют максимально "умной" замены, в качестве второго аргумента предусмотрена функция.** @@ -221,9 +221,9 @@ alert( str.replace( /Василий Пупкин/ ,'Великий $&!') ) // В var i = 0; // заменить каждое вхождение "ой" на результат вызова функции -alert( "ОЙ-Ой-ой".replace( /ой/gi, function() { - return ++i; -}) ); // 1-2-3 +alert("ОЙ-Ой-ой".replace(/ой/gi, function() { + return ++i; +})); // 1-2-3 ``` В примере выше функция просто возвращала числа по очереди, но обычно она основывается на поисковых данных. @@ -245,12 +245,12 @@ alert( "ОЙ-Ой-ой".replace( /ой/gi, function() { //+ run // вывести и заменить все совпадения function replacer(str, offset, s) { - alert("Найдено: " + str + " на позиции: " + offset + " в строке: " + s); + alert( "Найдено: " + str + " на позиции: " + offset + " в строке: " + s ); return str.toLowerCase(); -} +} -var result = "ОЙ-Ой-ой".replace( /ой/gi, replacer); -alert('Результат: ' + result); // Результат: ой-ой-ой +var result = "ОЙ-Ой-ой".replace(/ой/gi, replacer); +alert( 'Результат: ' + result ); // Результат: ой-ой-ой ``` С двумя скобочными выражениями -- аргументов уже 5: @@ -260,8 +260,8 @@ alert('Результат: ' + result); // Результат: ой-ой-ой function replacer(str, name, surname, offset, s) { return surname + ", " + name; } - -alert( str.replace( /(Василий) (Пупкин)/ , replacer) ) // Пупкин, Василий + +alert(str.replace(/(Василий) (Пупкин)/, replacer)) // Пупкин, Василий ``` Функция -- это самый мощный инструмент для замены, какой только может быть. Она владеет всей информацией о совпадении и имеет доступ к замыканию, поэтому может всё. @@ -319,14 +319,14 @@ var str = 'Многое по JavaScript можно найти на сайте ht var regexp = /javascript/ig; -alert("Начальное значение lastIndex: " + regexp.lastIndex); +alert( "Начальное значение lastIndex: " + regexp.lastIndex ); -while( result = regexp.exec(str) ) { - alert('Найдено: ' + result[0] + ' на позиции:' + result.index); - alert('Свойство lastIndex: ' + regexp.lastIndex); +while (result = regexp.exec(str)) { + alert( 'Найдено: ' + result[0] + ' на позиции:' + result.index ); + alert( 'Свойство lastIndex: ' + regexp.lastIndex ); } -alert('Конечное значение lastIndex: ' + regexp.lastIndex); +alert( 'Конечное значение lastIndex: ' + regexp.lastIndex ); ``` Здесь цикл продолжается до тех пор, пока `regexp.exec` не вернёт `null`, что означает "совпадений больше нет". diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/article.md b/10-regular-expressions-javascript/3-regexp-character-classes/article.md index 668cfbe5..2a9e449a 100644 --- a/10-regular-expressions-javascript/3-regexp-character-classes/article.md +++ b/10-regular-expressions-javascript/3-regexp-character-classes/article.md @@ -114,21 +114,21 @@ alert( str.replace(/\D/g, "") ); // 79031234567 ```js //+ run -alert( "1 - 5".match (/\d-\d/) ); // null, нет совпадений! +alert( "1 - 5".match(/\d-\d/) ); // null, нет совпадений! ``` Поправим это, добавив в регэксп пробелы: ```js //+ run -alert( "1 - 5".match (/\d - \d/) ); // работает, пробелы вокруг дефиса +alert( "1 - 5".match(/\d - \d/) ); // работает, пробелы вокруг дефиса ``` В регулярные выражения также не надо вставлять лишние пробелы. Все символы имеют значение: ```js //+ run -alert( "1-5".match( /\d - \d/ ) ); // null, так как в строке 1-5 нет пробелов +alert( "1-5".match(/\d - \d/) ); // null, так как в строке 1-5 нет пробелов ``` ## Класс точка @@ -159,7 +159,7 @@ alert( "CS 4".match(re) ); // найдено "CS 4" (пробел тоже си ```js //+ run -alert( "CS4".match (/CS.4/) ); // нет совпадений, так как для точки нет символа +alert( "CS4".match(/CS.4/) ); // нет совпадений, так как для точки нет символа ``` ## Экранирование специальных символов @@ -180,14 +180,14 @@ alert( "CS4".match (/CS.4/) ); // нет совпадений, так как д ```js //+ run -alert( "Глава 5.1".match( /\d\.\d/ ) ); // 5.1 +alert( "Глава 5.1".match(/\d\.\d/) ); // 5.1 ``` Круглые скобки также являются специальными символами, так что для поиска именно скобки нужно использовать `\(`. Пример ниже ищет строку `"g()"`: ```js //+ run -alert( "function g()".match( /g\(\)/ ) ); // "g()" +alert( "function g()".match(/g\(\)/) ); // "g()" ``` Сам символ слэш `'/'`, хотя и не является специальными символом в регулярных выражениях, но открывает-закрывает регэксп в синтаксисе /...pattern.../, поэтому его тоже нужно экранировать. @@ -196,7 +196,7 @@ alert( "function g()".match( /g\(\)/ ) ); // "g()" ```js //+ run -alert( "/".match( /\// ) ); // '/' +alert( "/".match(/\//) ); // '/' ``` Ну и, наконец, если нам нужно найти сам обратный слэш `\`, то его нужно просто задублировать. @@ -205,7 +205,7 @@ alert( "/".match( /\// ) ); // '/' ```js //+ run -alert( "1\2".match( /\\/ ) ); // '\' +alert( "1\2".match(/\\/) ); // '\' ``` ## Итого diff --git a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md index 2cc997de..00f2481f 100644 --- a/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md +++ b/10-regular-expressions-javascript/5-regexp-character-sets-and-ranges/article.md @@ -13,7 +13,7 @@ ```js //+ run // найти [г или т], а затем "оп" -alert( "Гоп-стоп".match( /[гт]оп/gi ) ); // "Гоп", "топ" +alert( "Гоп-стоп".match(/[гт]оп/gi) ); // "Гоп", "топ" ``` Обратим внимание: несмотря на то, что в наборе указано несколько символов, в совпадении должен присутствовать *ровно один* из них. @@ -23,7 +23,7 @@ alert( "Гоп-стоп".match( /[гт]оп/gi ) ); // "Гоп", "топ" ```js //+ run // найти "В", затем [у или а], затем "ля" -alert( "Вуаля".match( /В[уа]ля/ ) ); // совпадений нет +alert( "Вуаля".match(/В[уа]ля/) ); // совпадений нет ``` Поиск подразумевает: @@ -69,7 +69,7 @@ alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); //+ run var str = "The sun is rising!"; -alert( str.match( /\w+/g ) ); // The, sun, is, rising*!* +alert( str.match(/\w+/g) ); // The, sun, is, rising*!* ``` А если есть слова и на русском? @@ -78,7 +78,7 @@ alert( str.match( /\w+/g ) ); // The, sun, is, rising*!* //+ run var str = "Солнце встаёт!"; -alert( str.match( /\w+/g ) ); // null*!* +alert( str.match(/\w+/g) ); // null*!* ``` Ничего не найдено! Это можно понять, ведь \w -- это именно английская букво-цифра, как можно видеть из аналога [a-zA-Z0-9_]. @@ -91,7 +91,7 @@ alert( str.match( /\w+/g ) ); // null*!* //+ run var str = "Солнце (the sun) встаёт!"; -alert( str.match( /[\wа-я]+/gi ) ); // Солнце, the, sun, вста, т*!* +alert( str.match(/[\wа-я]+/gi) ); // Солнце, the, sun, вста, т*!* ``` ...Присмотритесь внимательно к предыдущему примеру! Вы видите странность? Оно не находит букву ё, более того -- считает её разрывом в слове. Причина -- в кодировке юникод, она подробно раскрыта в главе [](/string). @@ -102,7 +102,7 @@ alert( str.match( /[\wа-я]+/gi ) ); // Солнце, the, sun, вста, т*!* //+ run var str = "Солнце (the sun) встаёт!"; -alert( str.match( /[\wа-яё]+/gi ) ); // Солнце, the, sun, встаёт*!* +alert( str.match(/[\wа-яё]+/gi) ); // Солнце, the, sun, встаёт*!* ``` Теперь всё в порядке. @@ -125,7 +125,7 @@ alert( str.match( /[\wа-яё]+/gi ) ); // Солнце, the, sun, встаёт* ```js //+ run -alert( "alice15@gmail.com".match( /[^\d\sA-Z]/gi ) ); // "@", "." +alert( "alice15@gmail.com".match(/[^\d\sA-Z]/gi) ); // "@", "." ``` ## Не нужно экранирование diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md index 350fdc0e..4eb72c42 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/solution.md @@ -4,6 +4,6 @@ ```js //+ run var reg = /\.{3,}/g; -alert("Привет!... Как дела?.....".match(reg)); // ..., ..... +alert( "Привет!... Как дела?.....".match(reg) ); // ..., ..... ``` diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md index 750f6c59..414a49b4 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/1-find-text-manydots/task.md @@ -9,6 +9,6 @@ ```js var reg = /ваше выражение/g; -alert("Привет!... Как дела?.....".match(reg)); // ..., ..... +alert( "Привет!... Как дела?.....".match(reg) ); // ..., ..... ``` diff --git a/10-regular-expressions-javascript/7-regexp-quantifiers/article.md b/10-regular-expressions-javascript/7-regexp-quantifiers/article.md index ac0b6608..38f2ccf8 100644 --- a/10-regular-expressions-javascript/7-regexp-quantifiers/article.md +++ b/10-regular-expressions-javascript/7-regexp-quantifiers/article.md @@ -20,7 +20,7 @@ ```js //+ run -alert( "Мне 12345 лет".match (/\d{5}/) ); // "12345" +alert( "Мне 12345 лет".match(/\d{5}/) ); // "12345" ``` @@ -29,14 +29,14 @@ alert( "Мне 12345 лет".match (/\d{5}/) ); // "12345" ```js //+ run -alert( "Мне не 12, а 1234 года".match( /\d{3,5}/ ) ); // "1234" +alert( "Мне не 12, а 1234 года".match(/\d{3,5}/) ); // "1234" ``` Последнее значение можно и не указывать. Тогда выражение \d{3,} найдет числа, длиной от трех цифр: ```js //+ run -alert( "Мне не 12, а 345678 лет".match( /\d{3,5}/ ) ); // "345678" +alert( "Мне не 12, а 345678 лет".match(/\d{3,5}/) ); // "345678" ``` @@ -47,7 +47,7 @@ alert( "Мне не 12, а 345678 лет".match( /\d{3,5}/ ) ); // "345678" //+ run var str = "+7(903)-123-45-67"; -alert( str.match( /\d{1,}/g ) ); // 7,903,123,45,67 +alert( str.match(/\d{1,}/g) ); // 7,903,123,45,67 ``` @@ -65,7 +65,7 @@ alert( str.match( /\d{1,}/g ) ); // 7,903,123,45,67 //+ run var str = "+7(903)-123-45-67"; -alert( str.match( /\d+/g ) ); // 7,903,123,45,67 +alert( str.match(/\d+/g) ); // 7,903,123,45,67 ``` @@ -80,7 +80,7 @@ alert( str.match( /\d+/g ) ); // 7,903,123,45,67 //+ run var str = "Можно писать color или colour (британский вариант)"; -alert( str.match( /colou?r/g ) ); // color, colour +alert( str.match(/colou?r/g) ); // color, colour ``` @@ -91,14 +91,14 @@ alert( str.match( /colou?r/g ) ); // color, colour ```js //+ run -alert( "100 10 1".match( /\d0*/g ) ); // 100, 10, 1 +alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1 ``` Сравните это с `'+'` (один или более): ```js //+ run -alert( "100 10 1".match( /\d0+/g ) ); // 100, 10 +alert( "100 10 1".match(/\d0+/g) ); // 100, 10 ``` @@ -115,7 +115,7 @@ alert( "100 10 1".match( /\d0+/g ) ); // 100, 10 В действии: ```js //+ run -alert( "0 1 12.345 7890".match( /\d+\.\d+/g ) ); // 123.45 +alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 123.45 ``` @@ -124,7 +124,7 @@ alert( "0 1 12.345 7890".match( /\d+\.\d+/g ) ); // 123.45 ```js //+ run -alert( " ... ".match ( /<[a-z]+>/gi ) ); // +alert( " ... ".match(/<[a-z]+>/gi) ); // ``` Это регулярное выражение ищет символ '<', за которым идут одна или более букв английского алфавита, и затем '>'. @@ -135,7 +135,7 @@ alert( " ... ".match ( /<[a-z]+>/gi ) ); // ```js //+ run -alert( "

Привет!

".match( /<[a-z][a-z0-9]*>/gi ) ); //

+alert( "

Привет!

".match(/<[a-z][a-z0-9]*>/gi) ); //

``` @@ -144,7 +144,7 @@ alert( "

Привет!

".match( /<[a-z][a-z0-9]*>/gi ) ); //

```js //+ run -alert( "

Привет!

".match( /<\/?[a-z][a-z0-9]*>/gi ) ); //

,

+alert( "

Привет!

".match(/<\/?[a-z][a-z0-9]*>/gi) ); //

,

``` diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md index 483116d9..e8610df7 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md @@ -152,7 +152,7 @@ alert( str.match(reg) ); // witch, broom ```js //+ run -alert( "123 456".match ( /\d+ \d+?/g) ); // 123 4 +alert( "123 456".match(/\d+ \d+?/g) ); // 123 4 ```
    diff --git a/10-regular-expressions-javascript/9-regexp-groups/article.md b/10-regular-expressions-javascript/9-regexp-groups/article.md index dcfd7072..8e8a9685 100644 --- a/10-regular-expressions-javascript/9-regexp-groups/article.md +++ b/10-regular-expressions-javascript/9-regexp-groups/article.md @@ -4,7 +4,7 @@ У такого выделения есть два эффекта:
      -
    1. Он позволяет выделить часть совпадения в отдельный элемент массива при поиске через [:String#match] или [:RegExp#exec].
    2. +
    3. Он позволяет выделить часть совпадения в отдельный элемент массива при поиске через [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match) или [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec).
    4. Если поставить квантификатор после скобки, то он применится *ко всей скобке*, а не всего лишь к одному символу.
    @@ -13,7 +13,7 @@ ```js //+ run -alert( 'Gogogo now!'.match( /(go)+/i ); // "Gogogo" +alert( 'Gogogo now!'.match(/(go)+/i ); // "Gogogo" ``` Без скобок, шаблон /go+/ означал бы g, после которого идёт одна или более o, например: goooo. @@ -25,17 +25,17 @@ alert( 'Gogogo now!'.match( /(go)+/i ); // "Gogogo" Для удобства заключим его в скобки: <(.*?)>. Тогда содержимое скобок можно будет получить отдельно. -Используем метод [:String#match]. В результирующем массиве будет сначала всё совпадение, а далее -- скобочные группы, в данном случае -- только одна: +Используем метод [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match). В результирующем массиве будет сначала всё совпадение, а далее -- скобочные группы, в данном случае -- только одна: ```js //+ run var str = '

    Привет, мир!

    ' -var reg = /<(.*?)>/ +var reg = /<(.*?)>/ -alert( str.match(reg) ) // массив:

    , h1 +alert(str.match(reg)) // массив:

    , h1 ``` -Для поиска всех совпадений, как мы обсуждали ранее, используется метод [:RegExp#exec]. +Для поиска всех совпадений, как мы обсуждали ранее, используется метод [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec). **Скобки могут быть и вложенными. В этом случае нумерация также идёт слева направо.** @@ -49,7 +49,7 @@ var str = ''; reg = /<(([a-z])[a-z0-9]*).*?>/; -alert( str.match(reg) ); // , span, s +alert( str.match(reg) ); // , span, s ``` Вот так выглядят скобочные группы: @@ -65,12 +65,12 @@ alert( str.match(reg) ); // , span, s ```js //+ run -match = 'a'.match( /a(z)?(c)?/ ) +match = 'a'.match(/a(z)?(c)?/) -alert(match.length); // 3 -alert(match[0]); // a -alert(match[1]); // undefined -alert(match[2]); // undefined +alert( match.length ); // 3 +alert( match[0] ); // a +alert( match[1] ); // undefined +alert( match[2] ); // undefined ``` Массив получился длины `3`, но все скобочные группы -- `undefined`. @@ -79,12 +79,12 @@ alert(match[2]); // undefined ```js //+ run -match = 'ack'.match( /a(z)?(c)?/ ) +match = 'ack'.match(/a(z)?(c)?/) -alert(match.length); // 3 -alert(match[0]); // ac, всё совпадение -alert(match[1]); // undefined, для (z)? ничего нет -alert(match[2]); // c +alert( match.length ); // 3 +alert( match[0] ); // ac, всё совпадение +alert( match[1] ); // undefined, для (z)? ничего нет +alert( match[2] ); // c ``` Длина массива результатов по-прежнему `3`. Она постоянна. А вот для скобочной группы (z)? в ней ничего нет. diff --git a/10-regular-expressions-javascript/index.md b/10-regular-expressions-javascript/index.md index 6dc875d7..f96e0193 100644 --- a/10-regular-expressions-javascript/index.md +++ b/10-regular-expressions-javascript/index.md @@ -1,5 +1,3 @@ # Регулярные выражения [в работе] -Регулярные выражения -- мощный способ поиска и замены для строк. - -В JavaScript они поддерживаются в простом варианте, менее мощном, чем в большинстве других языков. Но зато нам будет проще их изучить. +Регулярные выражения -- мощный способ поиска и замены для строк. \ No newline at end of file diff --git a/12-extra/10-cookie/article.md b/12-extra/10-cookie/article.md index 3b232a91..3887263f 100644 --- a/12-extra/10-cookie/article.md +++ b/12-extra/10-cookie/article.md @@ -13,11 +13,11 @@ alert( document.cookie ); ``` -Эта строка состоит из пар `ключ=значение`, которые перечисляются через точку с запятой с пробелом `; `. +Эта строка состоит из пар `ключ=значение`, которые перечисляются через точку с запятой с пробелом `"; "`. -Значит, чтобы прочитать cookie, достаточно разбить строку по `; `, и затем найти нужный ключ. Это можно делать либо через `split` и работу с массивом, либо через регулярное выражение. +Значит, чтобы прочитать cookie, достаточно разбить строку по `"; "`, и затем найти нужный ключ. Это можно делать либо через `split` и работу с массивом, либо через регулярное выражение. -### Функция getCookie(name) +## Функция getCookie(name) Следующая функция `getCookie(name)` возвращает cookie с именем `name`: @@ -63,7 +63,7 @@ document.cookie = "userName=Vasya"; ```js // +1 день от текущего момента var date = new Date; -date.setDate( date.getDate() + 1 ); +date.setDate(date.getDate() + 1); alert( date.toUTCString() ); ``` @@ -78,8 +78,8 @@ alert( date.toUTCString() ); ```js //+ run -var date = new Date( new Date().getTime() + 60*1000 ); -document.cookie="name=value; path=/; expires="+date.toUTCString(); +var date = new Date(new Date().getTime() + 60 * 1000); +document.cookie = "name=value; path=/; expires=" + date.toUTCString(); ``` Чтобы удалить это cookie: @@ -87,12 +87,12 @@ document.cookie="name=value; path=/; expires="+date.toUTCString(); ```js //+ run var date = new Date(0); -document.cookie="name=; path=/; expires="+date.toUTCString(); +document.cookie = "name=; path=/; expires=" + date.toUTCString(); ``` При удалении значение не важно. Можно его не указывать, как сделано в коде выше. -### Функция setCookie(name, value, options) +## Функция setCookie(name, value, options) Если собрать все настройки воедино, вот такая функция ставит куки: @@ -104,23 +104,23 @@ function setCookie(name, value, options) { if (typeof expires == "number" && expires) { var d = new Date(); - d.setTime(d.getTime() + expires*1000); + d.setTime(d.getTime() + expires * 1000); expires = options.expires = d; } - if (expires && expires.toUTCString) { - options.expires = expires.toUTCString(); + if (expires && expires.toUTCString) { + options.expires = expires.toUTCString(); } value = encodeURIComponent(value); var updatedCookie = name + "=" + value; - for(var propName in options) { + for (var propName in options) { updatedCookie += "; " + propName; - var propValue = options[propName]; - if (propValue !== true) { + var propValue = options[propName]; + if (propValue !== true) { updatedCookie += "=" + propValue; - } + } } document.cookie = updatedCookie; @@ -137,7 +137,7 @@ function setCookie(name, value, options) {
    expires
    Время истечения cookie. Интерпретируется по-разному, в зависимости от типа:
    • Число -- количество секунд до истечения. Например, `expires: 3600` -- кука на час.
    • -
    • Объект типа [:Date] -- дата истечения.
    • +
    • Объект типа [Date](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Date) -- дата истечения.
    • Если expires в прошлом, то cookie будет удалено.
    • Если expires отсутствует или `0`, то cookie будет установлено как сессионное и исчезнет при закрытии браузера.
    @@ -149,13 +149,15 @@ function setCookie(name, value, options) {
    -### Функция deleteCookie(name) +## Функция deleteCookie(name) Здесь всё просто -- удаляем вызовом `setCookie` с датой в прошлом. ```js function deleteCookie(name) { - setCookie(name, "", { expires: -1 }) + setCookie(name, "", { + expires: -1 + }) } ``` @@ -241,13 +243,13 @@ function deleteCookie(name) { ```js //+ run if (!navigator.cookieEnabled) { - alert('Включите cookie для комфортной работы с этим сайтом'); + alert( 'Включите cookie для комфортной работы с этим сайтом' ); } ``` ...Конечно, предполагается, что включён JavaScript. Впрочем, посетитель без JS и cookie с большой вероятностью не человек, а бот. -## Cookie.js +## Итого -Файл с функциями для работы с cookie: [cookie.js](/files/tutorial/browser/cookie/cookie.js). \ No newline at end of file +Файл с функциями для работы с cookie: [cookie.js](cookie.js). \ No newline at end of file diff --git a/12-extra/11-intl/1-collate-array-sort/solution.md b/12-extra/11-intl/1-collate-array-sort/solution.md index 6d2a2f49..78c1d455 100644 --- a/12-extra/11-intl/1-collate-array-sort/solution.md +++ b/12-extra/11-intl/1-collate-array-sort/solution.md @@ -11,7 +11,7 @@ animals.sort(function(a, b) { }); */!* -alert(animals); // АИСТ,ёж,енот,ехидна,тигр,ЯК +alert( animals ); // АИСТ,ёж,енот,ехидна,тигр,ЯК ``` А вот, что было бы при обычном вызове `sort()`: diff --git a/12-extra/11-intl/1-collate-array-sort/task.md b/12-extra/11-intl/1-collate-array-sort/task.md index b50404b4..c457627a 100644 --- a/12-extra/11-intl/1-collate-array-sort/task.md +++ b/12-extra/11-intl/1-collate-array-sort/task.md @@ -9,7 +9,7 @@ var animals = ["тигр", "ёж", "енот", "ехидна", "АИСТ", "ЯК // ... ваш код ... -alert(animals); // АИСТ,ёж,енот,ехидна,тигр,ЯК +alert( animals ); // АИСТ,ёж,енот,ехидна,тигр,ЯК ``` В этом примере порядок сортировки не должен зависеть от регистра. diff --git a/12-extra/11-intl/article.md b/12-extra/11-intl/article.md index 7b1bd827..062bed07 100644 --- a/12-extra/11-intl/article.md +++ b/12-extra/11-intl/article.md @@ -77,7 +77,7 @@ ```js // создание -var collator = new Intl.Collator([locales, [options] ]) +var collator = new Intl.Collator([locales, [options]]) ``` Параметры: @@ -131,7 +131,9 @@ alert( collator.compare("ёжик", "яблоко") ); // -1 (ёжик мень var collator = new Intl.Collator(); alert( collator.compare("ЁжиК", "ёжик") ); // 1, разные -var collator = new Intl.Collator(undefined, { sensitivity: "accent" } ); +var collator = new Intl.Collator(undefined, { + sensitivity: "accent" +}); alert( collator.compare("ЁжиК", "ёжик") ); // 0, одинаковые ``` @@ -141,7 +143,7 @@ alert( collator.compare("ЁжиК", "ёжик") ); // 0, одинаковые ```js // создание -var formatter = new Intl.DateFormatter([locales, [options] ]) +var formatter = new Intl.DateFormatter([locales, [options]]) ``` Первый аргумент -- такой же, как и в `Collator`, а в объекте `options` мы можем определить, какие именно части даты показывать (часы, месяц, год...) и в каком формате. @@ -281,13 +283,13 @@ alert( formatter.format(date) ); // 12/31/2014 var date = new Date(2014, 11, 31, 12, 30, 0); var formatter = new Intl.DateTimeFormat("ru", { - weekday: "long", - year: "numeric", + weekday: "long", + year: "numeric", month: "long", - day: "numeric" + day: "numeric" }); -alert( formatter.format(date) ); // среда, 31 декабря 2014 г. +alert( formatter.format(date) ); // среда, 31 декабря 2014 г. ``` Только время: @@ -297,12 +299,12 @@ alert( formatter.format(date) ); // среда, 31 декабря 2014 г. var date = new Date(2014, 11, 31, 12, 30, 0); var formatter = new Intl.DateTimeFormat("ru", { - hour: "numeric" , - minute: "numeric" , - second: "numeric" + hour: "numeric", + minute: "numeric", + second: "numeric" }); -alert( formatter.format(date) ); // 12:30:00 +alert( formatter.format(date) ); // 12:30:00 ``` ## Числа: Intl.NumberFormat @@ -312,7 +314,7 @@ alert( formatter.format(date) ); // 12:30:00 Синтаксис: ```js -var formatter = new Intl.NumberFormat([locales [, options] ]); +var formatter = new Intl.NumberFormat([locales[, options]]); formatter.format(number); // форматирование ``` @@ -398,7 +400,7 @@ formatter.format(number); // форматирование ```js //+ run var formatter = new Intl.NumberFormat("ru"); -alert(formatter.format(1234567890.123)); // 1 234 567 890,123 +alert( formatter.format(1234567890.123) ); // 1 234 567 890,123 ``` С ограничением значимых цифр (важны только первые 3): @@ -408,7 +410,7 @@ alert(formatter.format(1234567890.123)); // 1 234 567 890,123 var formatter = new Intl.NumberFormat("ru", { maximumSignificantDigits: 3 }); -alert(formatter.format(1234567890.123)); // 1 230 000 000 +alert( formatter.format(1234567890.123) ); // 1 230 000 000 ``` C опциями для валюты: @@ -419,7 +421,7 @@ var formatter = new Intl.NumberFormat("ru", { currency: "GBP" }); -alert( formatter.format(1234.5)); // 1 234,5 £ +alert( formatter.format(1234.5) ); // 1 234,5 £ ``` С двумя цифрами после запятой: @@ -431,7 +433,7 @@ var formatter = new Intl.NumberFormat("ru", { minimumFractionDigits: 2 }); -alert( formatter.format(1234.5)); // 1 234,50 £ +alert( formatter.format(1234.5) ); // 1 234,50 £ ``` ## Методы в Date, String, Number @@ -454,7 +456,7 @@ alert( str.localeCompare("яблоко", "ru") ); // -1
    Форматирует дату в соответствии с локалью, например: ```js -//+ run +//+ run no-beautify var date = new Date(2014, 11, 31, 12, 00); alert( date.toLocaleString("ru", { year: 'numeric', month: 'long' }) ); // Декабрь 2014 diff --git a/12-extra/12-regexp-specials/article.md b/12-extra/12-regexp-specials/article.md index 9a0ddd00..50303b3c 100644 --- a/12-extra/12-regexp-specials/article.md +++ b/12-extra/12-regexp-specials/article.md @@ -2,7 +2,7 @@ Регулярные выражения в javascript немного странные. Вроде - перловые, обычные, но с подводными камнями, на которые натыкаются даже опытные javascript-разработчики. -Эта статья ставит целью перечислить неожиданные фишки и особенности [:RegExp] в краткой и понятной форме. +Эта статья ставит целью перечислить неожиданные фишки и особенности `RegExp` в краткой и понятной форме. [cut] @@ -18,12 +18,12 @@ //+ run function bbtagit(text) { text = text.replace(/\[u\](.*?)\[\/u\]/gim, '$1') - + return text } var line = "[u]мой\n текст[/u]" -alert( bbtagit(line) ) +alert(bbtagit(line)) ``` Попробуйте запустить. Заменяет? Как бы не так! @@ -38,12 +38,12 @@ alert( bbtagit(line) ) //+ run function bbtagit(text) { text = text.replace(/\[u\]([\s\S]*)\[\/u\]/gim, '$1') - + return text } var line = "[u]мой\n текст[/u]" -alert( bbtagit(line) ) +alert(bbtagit(line)) ``` ## Жадность @@ -103,7 +103,7 @@ alert(text) //+ run text = ' [b]a [u]b[/u] c [/b] ' -var reg = /\[([bus])\](.*?)\[\//*u*/\1/*/u*/\]/ +var reg = /\[([bus])\](.*?)\[\// * u * /\1/ * /u*/\] / text = text.replace(reg, '<$1>$2') alert(text) ``` @@ -120,7 +120,7 @@ P.S. Понятно, что при таком способе поиска bb-т ### Заменить все -Для замены всех вхождений используется метод [:String#replace|]. +Для замены всех вхождений используется метод [String#replace](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/replace). Он интересен тем, что допускает первый аргумент - регэксп или строку. Если первый аргумент - строка, то будет осуществлен поиск подстроки, без преобразования в регулярное выражение. @@ -134,7 +134,7 @@ alert("2 ++ 1".replace("+", "*")) Как видите, заменился только один плюс, а не оба. -**Чтобы заменить все вхождения, [:String#replace|] обязательно нужно использовать с регулярным выражением.** +**Чтобы заменить все вхождения, [String#replace](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/replace) обязательно нужно использовать с регулярным выражением.** В режиме регулярного выражения плюс придётся экранировать, но зато replace заменит все вхождения (при указании флага g): @@ -152,7 +152,7 @@ alert("2 ++ 1".replace(/\+/g, "*")) Следующий пример произведет операции вычитания: ```js -//+ run +//+ run no-beautify var str = "count 36 - 26, 18 - 9" str = str.replace(/(\d+) - (\d+)/g, function(a,b,c) { return b-c }) alert(str) @@ -161,32 +161,32 @@ alert(str) ### Найти всё В javascript нет одного универсального метода для поиска всех совпадений. -Для поиска без запоминания скобочных групп - можно использовать [:String#match|]: +Для поиска без запоминания скобочных групп - можно использовать [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match): ```js //+ run var str = "count 36-26, 18-9" -var re = /(\d+)-(\d+)/g +var re = /(\d+)-(\d+)/g result = str.match(re) -for(var i=0; i'g' у регулярного выражения обязателен), но при этом не запоминает скобочные группы. Эдакий "облегченный вариант". ### Найти всё с учётом скобочных групп -В сколько-нибудь сложных задачах важны не только совпадения, но и скобочные группы. Чтобы их найти, предлагается использовать многократный вызов [:RegExp#exec|]. +В сколько-нибудь сложных задачах важны не только совпадения, но и скобочные группы. Чтобы их найти, предлагается использовать многократный вызов [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec). Для этого регулярное выражение должно использовать флаг 'g'. Тогда результат поиска, запомненный в свойстве lastIndex объекта RegExp используется как точка отсчета для следующего поиска: ```js //+ run var str = "count 36-26, 18-9" -var re = /(\d+)-(\d+)/g +var re = /(\d+)-(\d+)/g var res -while ( (res = re.exec(str)) != null) { - alert("Найдено " + res[0] + ": ("+ res[1]+") и ("+res[2]+")") - alert("Дальше ищу с позиции "+re.lastIndex) +while ((res = re.exec(str)) != null) { + alert("Найдено " + res[0] + ": (" + res[1] + ") и (" + res[2] + ")") + alert("Дальше ищу с позиции " + re.lastIndex) } ``` diff --git a/12-extra/3-templates/article.md b/12-extra/3-templates/article.md index 1165be14..e69a0253 100644 --- a/12-extra/3-templates/article.md +++ b/12-extra/3-templates/article.md @@ -16,6 +16,7 @@ Пример: ```html + ``` @@ -281,6 +281,7 @@ function ieTextRangeHighlight(text) { Эту задачу мы уже решали в самом начале статьи в примере с миксом. Теперь рассмотрим код: ```js +//+ no-beautify function getSelectionText() { var txt = ''; if (txt = window.getSelection) // Не IE, используем метод getSelection @@ -342,21 +343,21 @@ IE предоставляет собственный интерфейс взаи ``` @@ -372,7 +373,7 @@ function clearSelection() { try { // современный объект Selection window.getSelection().removeAllRanges(); - } catch(e) { + } catch (e) { // для IE8- document.selection.empty(); } @@ -393,15 +394,15 @@ function clearSelection() { ```js var range = getRangeObject(); - if(range) { - alert(range); - alert(range.startContainer.nodeValue); - alert(range.startOffset); - alert(range.endOffset); + if (range) { + alert( range ); + alert( range.startContainer.nodeValue ); + alert( range.startOffset ); + alert( range.endOffset ); } else { - alert('Ничего не выделено'); + alert( 'Ничего не выделено' ); + } } -} ``` В действии: diff --git a/2-ui/1-document/1-browser-environment/article.md b/2-ui/1-document/1-browser-environment/article.md index 12515f49..c713e303 100644 --- a/2-ui/1-document/1-browser-environment/article.md +++ b/2-ui/1-document/1-browser-environment/article.md @@ -29,7 +29,7 @@ window.open('http://ya.ru'); ```js //+ run document.body.style.background = 'red'; -alert('Элемент BODY стал красным, а сейчас обратно вернётся'); +alert( 'Элемент BODY стал красным, а сейчас обратно вернётся' ); document.body.style.background = ''; ``` @@ -57,7 +57,7 @@ BOM -- это объекты для работы с чем угодно, кро Пример использования: ```js //+ run -alert(location.href); // выведет текущий адрес +alert( location.href ); // выведет текущий адрес ``` Большинство возможностей BOM стандартизированы в [HTML 5](http://www.w3.org/TR/html5/Overview.html), хотя различные браузеры и предоставляют зачастую что-то своё, в дополнение к стандарту. diff --git a/2-ui/1-document/10-compare-document-position/article.md b/2-ui/1-document/10-compare-document-position/article.md index 4e958160..e8374584 100644 --- a/2-ui/1-document/10-compare-document-position/article.md +++ b/2-ui/1-document/10-compare-document-position/article.md @@ -57,21 +57,21 @@ var result = nodeA.compareDocumentPosition(nodeB); ``` @@ -111,13 +111,13 @@ alert( 20..toString(2) ); ``` @@ -139,18 +139,17 @@ if( body.compareDocumentPosition(li) & 16 ) { ```js // код с http://compatibility.shwups-cms.ch/en/polyfills/?&id=82 -(function(){ +(function() { var el = document.documentElement; - if( !el.compareDocumentPosition && el.sourceIndex !== undefined ){ + if (!el.compareDocumentPosition && el.sourceIndex !== undefined) { - Element.prototype.compareDocumentPosition = function(other){ + Element.prototype.compareDocumentPosition = function(other) { return (this != other && this.contains(other) && 16) + - (this != other && other.contains(this) && 8) + - (this.sourceIndex >= 0 && other.sourceIndex >= 0 ? - (this.sourceIndex < other.sourceIndex && 4) + - (this.sourceIndex > other.sourceIndex && 2) - : 1 - ) + 0; + (this != other && other.contains(this) && 8) + + (this.sourceIndex >= 0 && other.sourceIndex >= 0 ? + (this.sourceIndex < other.sourceIndex && 4) + + (this.sourceIndex > other.sourceIndex && 2) : 1 + ) + 0; } } }()); diff --git a/2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.md b/2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.md index 682e2e1a..d591b6b4 100644 --- a/2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.md +++ b/2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.md @@ -4,7 +4,7 @@ ```html
    - hh:mm:ss + hh:mm:ss
    ``` @@ -15,21 +15,21 @@ ```js function update() { var clock = document.getElementById('clock'); - + *!* var date = new Date(); // (*) */!* var hours = date.getHours(); - if (hours < 10) hours = '0'+hours; + if (hours < 10) hours = '0' + hours; clock.children[0].innerHTML = hours; var minutes = date.getMinutes(); - if (minutes < 10) minutes = '0'+minutes; + if (minutes < 10) minutes = '0' + minutes; clock.children[1].innerHTML = minutes; var seconds = date.getSeconds(); - if (seconds < 10) seconds = '0'+seconds; + if (seconds < 10) seconds = '0' + seconds; clock.children[2].innerHTML = seconds; } ``` @@ -41,9 +41,9 @@ function update() { Функция `clockStart` для запуска часов: ```js -function clockStart() { // запустить часы +function clockStart() { // запустить часы setInterval(update, 1000); - update(); // (*) + update(); // (*) } function clockStop() { diff --git a/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md b/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md index c4330e37..bd99772f 100644 --- a/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md +++ b/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md @@ -18,6 +18,6 @@ var elem = document.body.children[0]; - elem.remove(); + elem.remove(); ``` \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md b/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md index a4c72d87..a212fdc0 100644 --- a/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md +++ b/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md @@ -16,12 +16,12 @@
    Элементы DOM
    ``` diff --git a/2-ui/1-document/11-modifying-document/3-insert-after/solution.md b/2-ui/1-document/11-modifying-document/3-insert-after/solution.md index 63e6e886..4436bdcb 100644 --- a/2-ui/1-document/11-modifying-document/3-insert-after/solution.md +++ b/2-ui/1-document/11-modifying-document/3-insert-after/solution.md @@ -9,9 +9,9 @@ function insertAfter(elem, refElem) { var parent = refElem.parentNode; var next = refElem.nextSibling; if (next) { - return parent.insertBefore(elem, next); + return parent.insertBefore(elem, next); } else { - return parent.appendChild(elem); + return parent.appendChild(elem); } } ``` @@ -20,7 +20,7 @@ function insertAfter(elem, refElem) { ```js function insertAfter(elem, refElem) { - return refElem.parentNode.insertBefore(elem, refElem.nextSibling); + return refElem.parentNode.insertBefore(elem, refElem.nextSibling); } ``` diff --git a/2-ui/1-document/11-modifying-document/3-insert-after/task.md b/2-ui/1-document/11-modifying-document/3-insert-after/task.md index 30947467..d5fa5329 100644 --- a/2-ui/1-document/11-modifying-document/3-insert-after/task.md +++ b/2-ui/1-document/11-modifying-document/3-insert-after/task.md @@ -20,8 +20,7 @@ insertAfter(elem, body.firstChild); // <--- должно работать // вставить elem за последним элементом - insertAfter(elem, body.lastChild); // <--- должно работать - + insertAfter(elem, body.lastChild); // <--- должно работать ``` diff --git a/2-ui/1-document/11-modifying-document/4-remove-children/solution.md b/2-ui/1-document/11-modifying-document/4-remove-children/solution.md index 9ea9f63d..3ca743c4 100644 --- a/2-ui/1-document/11-modifying-document/4-remove-children/solution.md +++ b/2-ui/1-document/11-modifying-document/4-remove-children/solution.md @@ -4,7 +4,7 @@ ```js function removeChildren(elem) { - for(var k=0; k - ЭтоВсеЭлементы DOM + Это + Все + Элементы DOM diff --git a/2-ui/1-document/11-modifying-document/5-why-aaa/task.md b/2-ui/1-document/11-modifying-document/5-why-aaa/task.md index 47a76ec2..d0d6d4df 100644 --- a/2-ui/1-document/11-modifying-document/5-why-aaa/task.md +++ b/2-ui/1-document/11-modifying-document/5-why-aaa/task.md @@ -9,17 +9,17 @@ aaa - +
    TestTest
    ``` diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md b/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md index ce416085..25eb80be 100644 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md +++ b/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md @@ -8,19 +8,19 @@ ```js var data = { - "Рыбы":{ - "Форель":{}, - "Щука":{} + "Рыбы": { + "Форель": {}, + "Щука": {} }, - "Деревья":{ - "Хвойные":{ - "Лиственница":{}, - "Ель":{} + "Деревья": { + "Хвойные": { + "Лиственница": {}, + "Ель": {} }, - "Цветковые":{ - "Берёза":{}, - "Тополь":{} + "Цветковые": { + "Берёза": {}, + "Тополь": {} } } }; diff --git a/2-ui/1-document/11-modifying-document/article.md b/2-ui/1-document/11-modifying-document/article.md index 8c891639..9fe5ea49 100644 --- a/2-ui/1-document/11-modifying-document/article.md +++ b/2-ui/1-document/11-modifying-document/article.md @@ -78,12 +78,10 @@ div.innerHTML = "Ура! Вы прочитали это важ

``` @@ -101,7 +99,6 @@ div.innerHTML = "Ура! Вы прочитали это важ
  • 2
  • ``` Обратите внимание на последнюю строку, которая вставляет `div2` после `div`: ```js -div.parentNode.insertBefore( div2, div.nextSibling ); +div.parentNode.insertBefore(div2, div.nextSibling); ```
      @@ -284,6 +283,7 @@ div.parentNode.insertBefore( div2, div.nextSibling ); ```html +

      Сообщение пропадёт через секунду

      @@ -321,12 +321,12 @@ div.parentNode.insertBefore( div2, div.nextSibling ); var div = document.createElement('div'); div.className = "alert alert-success"; document.body.appendChild(div); - + *!* var text = prompt("Введите текст для сообщения", "Жили были и !"); // вставится именно как текст, без HTML-обработки - div.appendChild( document.createTextNode(text) ); + div.appendChild(document.createTextNode(text)); */!* ``` diff --git a/2-ui/1-document/12-multi-insert/article.md b/2-ui/1-document/12-multi-insert/article.md index 53acc250..74e54233 100644 --- a/2-ui/1-document/12-multi-insert/article.md +++ b/2-ui/1-document/12-multi-insert/article.md @@ -14,13 +14,14 @@ ```js var ul = document.createElement('ul'); document.body.appendChild(ul); // сначала в документ -for(...) ul.appendChild(li); // потом узлы +for (...) ul.appendChild(li); // потом узлы ```
    1. Полностью создать список "вне DOM", а потом -- вставить в документ: ```js +//+ no-beautify var ul = document.createElement('ul'); for(...) ul.appendChild(li); // сначала вставить узлы document.body.appendChild(ul); // затем в документ @@ -115,14 +116,14 @@ elem.insertAdjacentHTML(where, html); ``` -Единственный недостаток этого метода -- он не работает в Firefox до версии 8. Но его можно легко добавить, используя [полифилл insertAdjacentHTML для Firefox](insertAdjacentHTML.js). +Единственный недостаток этого метода -- он не работает в Firefox до версии 8. Но его можно легко добавить, используя [полифилл insertAdjacentHTML для Firefox](insertAdjacentFF.js). У этого метода есть "близнецы-братья", которые поддерживаются везде, кроме Firefox, но в него они добавляются тем же полифиллом: @@ -181,7 +182,7 @@ for (цикл по li) { fragment.appendChild(list[i]); // вставить каждый LI в DocumentFragment } -ul.appendChild(fragment); // вместо фрагмента вставятся элементы списка +ul.appendChild(fragment); // вместо фрагмента вставятся элементы списка ``` В современных браузерах эффект от такой оптимизации может быть различным, а на небольших документах иногда и отрицательным. @@ -211,28 +212,30 @@ ul.appendChild(fragment); // вместо фрагмента вставятс ```html + - + // добавить элемент после

      + p.after(document.createElement('hr')) + + ``` diff --git a/2-ui/1-document/13-document-write/article.md b/2-ui/1-document/13-document-write/article.md index 4fe6b849..49f2e34e 100644 --- a/2-ui/1-document/13-document-write/article.md +++ b/2-ui/1-document/13-document-write/article.md @@ -13,11 +13,11 @@ HTML-документ ниже будет содержать `1 2 3`. ```html -1 - -3 + 1 + + 3 ``` @@ -29,14 +29,18 @@ HTML-документ ниже будет содержать `1 2 3`. ```html - + - + Текст внутри TD. - +
      ``` @@ -93,7 +97,7 @@ HTML-документ ниже будет содержать `1 2 3`. var url = 'http://ads.com/buyme?screen=' + screen.width + "x" + screen.height; // загрузить такой скрипт прямо сейчас - document.write(' ``` @@ -103,7 +107,7 @@ HTML-документ ниже будет содержать `1 2 3`. Также используют запись: ```js -document.write('`: обратный слеш `\` обычно используется для вставки спецсимволов типа `\n`, а если такого спецсимвола нет, в данном случае `\/` не является спецсимволом, то будет проигнорирован. Так что получается такой альтернативный способ безопасно вставить строку ``. diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md b/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md index aab40b32..bc89ddcc 100644 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md +++ b/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md @@ -16,7 +16,7 @@ * @param options.className {string} CSS-класс * @param options.html {string} HTML-текст для показа */ -function showNotification(options) { +function showNotification(options) { // ваш код } ``` diff --git a/2-ui/1-document/14-styles-and-classes/article.md b/2-ui/1-document/14-styles-and-classes/article.md index 5659f895..fb7ce900 100644 --- a/2-ui/1-document/14-styles-and-classes/article.md +++ b/2-ui/1-document/14-styles-and-classes/article.md @@ -21,6 +21,7 @@ **Для свойств, названия которых состоят из нескольких слов, используется вотТакаяЗапись:** ```js +//+ no-beautify background-color => elem.style.backgroundColor z-index => elem.style.zIndex border-left-width => elem.style.borderLeftWidth @@ -73,15 +74,15 @@ setTimeout(function() { ```html - @@ -146,7 +147,7 @@ setTimeout(function() { Вот так `style` уже ничего не увидит: ```html - + @@ -190,14 +191,17 @@ getComputedStyle(element[, pseudo]) ```html + - @@ -264,10 +268,13 @@ function getStyle(elem) { ```html + - ``` diff --git a/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md b/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md index 4dda1121..9f376da1 100644 --- a/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md +++ b/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md @@ -4,9 +4,9 @@ //+ run // создадим элемент с прокруткой var div = document.createElement('div'); - + div.style.overflowY = 'scroll'; -div.style.width = '50px'; +div.style.width = '50px'; div.style.height = '50px'; // при display:none размеры нельзя узнать diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/solution.md b/2-ui/1-document/15-metrics/3-div-placeholder/solution.md index 13b7d7e5..dd09226b 100644 --- a/2-ui/1-document/15-metrics/3-div-placeholder/solution.md +++ b/2-ui/1-document/15-metrics/3-div-placeholder/solution.md @@ -20,9 +20,9 @@ placeHolder.style.height = div.offsetHeight + 'px'; // можно и width, но в этом примере это не обязательно // IE || другой браузер -var computedStyle = div.currentStyle || getComputedStyle(div, ''); +var computedStyle = div.currentStyle || getComputedStyle(div, ''); -placeHolder.style.marginTop = computedStyle.marginTop; // (1) +placeHolder.style.marginTop = computedStyle.marginTop; // (1) placeHolder.style.marginBottom = computedStyle.marginBottom; ``` diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/task.md b/2-ui/1-document/15-metrics/3-div-placeholder/task.md index 130cdb84..3fa0528f 100644 --- a/2-ui/1-document/15-metrics/3-div-placeholder/task.md +++ b/2-ui/1-document/15-metrics/3-div-placeholder/task.md @@ -5,7 +5,7 @@ Посмотрим следующий случай из жизни. Был текст, который, в частности, содержал `div` с зелеными границами: ```html - +
      список

      ``` diff --git a/2-ui/1-document/9-attributes-and-custom-properties/article.md b/2-ui/1-document/9-attributes-and-custom-properties/article.md index faf8d359..5654e451 100644 --- a/2-ui/1-document/9-attributes-and-custom-properties/article.md +++ b/2-ui/1-document/9-attributes-and-custom-properties/article.md @@ -19,22 +19,22 @@ ```js //+ run -document.body.myData = { +document.body.myData = { name: 'Петр', familyName: 'Петрович' }; -alert(document.body.myData.name); // Петр +alert( document.body.myData.name ); // Петр ``` Можно добавить и новую функцию: ```js //+ run -document.body.sayHi = function() { - alert(this.nodeName); +document.body.sayHi = function() { + alert( this.nodeName ); } - + document.body.sayHi(); // BODY, выполнилась с правильным this ``` @@ -91,13 +91,13 @@ document.body.sayHi(); // BODY, выполнилась с правильным t @@ -162,7 +162,7 @@ document.body.sayHi(); // BODY, выполнилась с правильным t // работа с checked через атрибут */!* alert( input.getAttribute('checked') ); // пустая строка - input.removeAttribute('checked'); // снять галочку + input.removeAttribute('checked'); // снять галочку *!* // работа с checked через свойство @@ -189,7 +189,7 @@ document.body.sayHi(); // BODY, выполнилась с правильным t *!* input.value = 'new'; // поменяли свойство - alert(input.getAttribute('value')); // 'markup', не изменилось! + alert( input.getAttribute('value') ); // 'markup', не изменилось! */!* @@ -232,10 +232,10 @@ document.body.sayHi(); // BODY, выполнилась с правильным t ``` @@ -269,16 +269,16 @@ document.body.sayHi(); // BODY, выполнилась с правильным t ``` @@ -331,9 +331,11 @@ document.body.sayHi(); // BODY, выполнилась с правильным t .order[order-state="new"] { color: green; } + .order[order-state="pending"] { color: blue; } + .order[order-state="canceled"] { color: red; } @@ -364,7 +366,7 @@ div.setAttribute('order-state', 'canceled'); Для классов -- нужно знать, какой класс у заказа сейчас. И тогда мы можем снять старый класс, и поставить новый: ```js -div.classList.remove('order-state-new'); +div.classList.remove('order-state-new'); div.classList.add('order-state-canceled'); ``` @@ -417,7 +419,7 @@ div.classList.add('order-state-canceled'); Этот атрибут должен прятать элемент, действие весьма простое, для его поддержки в HTML достаточно такого CSS: ```html - +
      FORM -
      DIV -

      P

      -
      +
      DIV +

      P

      +
      ``` @@ -166,7 +169,7 @@ JS-код здесь такой: var elems = document.querySelectorAll('form,div,p'); // на каждый элемент повесить обработчик на стадии перехвата -for(var i=0; iКросс-браузерно остановить всплытие можно так: ```js +//+ no-beautify event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true); ``` diff --git a/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/messages.css b/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/messages.css index f6e6a0e0..469b5769 100755 --- a/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/messages.css +++ b/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/messages.css @@ -26,7 +26,7 @@ p { position: absolute; font-size: 110%; top: 0; - color: red; + color: darkred; right: 10px; display: block; width: 24px; diff --git a/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/messages.css b/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/messages.css index 0379abe8..6588f729 100755 --- a/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/messages.css +++ b/2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/messages.css @@ -22,7 +22,7 @@ p { .remove-button { font-size: 110%; - color: red; + color: darkred; right: 10px; width: 24px; height: 24px; diff --git a/2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.md b/2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.md index dd6daa3d..2dd5aae6 100644 --- a/2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.md +++ b/2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.md @@ -11,18 +11,20 @@ ```html
        -
      • Млекопетающие -
          -
        • Коровы
        • -
        • Ослы
        • -
        • Собаки
        • -
        • Тигры
        • -
        -
      • +
      • Млекопетающие +
          +
        • Коровы
        • +
        • Ослы
        • +
        • Собаки
        • +
        • Тигры
        • +
        +
      ``` @@ -41,9 +43,9 @@ var treeUl = document.getElementsByTagName('ul')[0]; var treeLis = treeUl.getElementsByTagName('li'); -for(var i=0; i
        -
      • Млекопетающие -
          -
        • Коровы
        • -
        • Ослы
        • -
        • Собаки
        • -
        • Тигры
        • -
        -
      • +
      • Млекопетающие +
          +
        • Коровы
        • +
        • Ослы
        • +
        • Собаки
        • +
        • Тигры
        • +
        +
      ``` @@ -88,10 +92,10 @@ var tree = document.getElementsByTagName('ul')[0]; tree.onclick = function(event) { var target = event.target; - if (target.tagName != 'SPAN') { + if (target.tagName != 'SPAN') { return; // клик был не на заголовке } - + var li = target.parentNode; // получить родительский LI // получить UL с потомками -- это первый UL внутри LI diff --git a/2-ui/2-events-and-interfaces/5-event-delegation/article.md b/2-ui/2-events-and-interfaces/5-event-delegation/article.md index 370fd03c..ef3c45fc 100644 --- a/2-ui/2-events-and-interfaces/5-event-delegation/article.md +++ b/2-ui/2-events-and-interfaces/5-event-delegation/article.md @@ -19,9 +19,9 @@ Bagua Chart: Direction, Element, Color, Meaning - ...Northwest... - ... - ... + ...Northwest... + ... + ... ...еще 2 строки такого же вида... ...еще 2 строки такого же вида... @@ -44,7 +44,7 @@ var selectedTd; *!* table.onclick = function(event) { var target = event.target; // где был клик? - + if (target.tagName != 'TD') return; // не на TD? тогда не интересует highlight(target); // подсветить TD @@ -94,13 +94,13 @@ function highlight(node) { ```js table.onclick = function(event) { var target = event.target; - + // цикл двигается вверх от target к родителям до table - while(target != table) { + while (target != table) { if (target.tagName == 'TD') { - // нашли элемент, который нас интересует! - highlight(target); - return; + // нашли элемент, который нас интересует! + highlight(target); + return; } target = target.parentNode; } @@ -115,7 +115,7 @@ table.onclick = function(event) { Кстати, в проверке `while` можно бы было использовать `this` вместо `table`: ```js -while(target != this) { +while (target != this) { // ... } ``` @@ -128,13 +128,13 @@ while(target != this) { ```js table.onclick = function(event) { var target = event.target; - + var td = event.target.closest('td'); if (!td) return; // клик вне , не интересует // если клик на td, но вне этой таблицы (возможно при вложенных таблицах) // то не интересует - if (!table.contains(td)) return; + if (!table.contains(td)) return; // нашли элемент, который нас интересует! highlight(td); @@ -172,25 +172,31 @@ table.onclick = function(event) { ``` diff --git a/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/solution.md b/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/solution.md index fcfccc4a..27e91612 100644 --- a/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/solution.md +++ b/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/solution.md @@ -4,7 +4,7 @@ ```js function(event) { - handler() // тело взято из атрибута onclick + handler() // тело взято из атрибута onclick } ``` diff --git a/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/task.md b/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/task.md index a7a13551..a2ef7979 100644 --- a/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/task.md +++ b/2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/task.md @@ -8,7 +8,7 @@ diff --git a/2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.md b/2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.md index b653e648..a10433d7 100644 --- a/2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.md +++ b/2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.md @@ -8,12 +8,12 @@ contents.onclick = function(evt) { var target = evt.target; - function handleLink(href) { - var isLeaving = confirm('Уйти на '+href+'?'); + function handleLink(href) { + var isLeaving = confirm('Уйти на ' + href + '?'); if (!isLeaving) return false; } - - while(target != this) { + + while (target != this) { if (target.nodeName == 'A') { *!* return handleLink(target.getAttribute('href')); // (*) diff --git a/2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.md b/2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.md index 728e9af9..40f8e09c 100644 --- a/2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.md +++ b/2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.md @@ -10,7 +10,7 @@ var largeImg = document.getElementById('largeImg'); document.getElementById('thumbs').onclick = function(e) { var target = e.target; - while(target != this) { + while (target != this) { if (target.nodeName == 'A') { showThumbnail(target.href, target.title); @@ -34,11 +34,11 @@ function showThumbnail(href, title) { ```js var imgs = thumbs.getElementsByTagName('img'); -for(var i=0; i + Нажми здесь или здесь @@ -68,7 +68,7 @@ menu.onclick = function(event) { if (event.target.nodeName != 'A') return; var href = event.target.getAttribute('href'); - alert(href); // может быть подгрузка с сервера, генерация интерфейса и т.п. + alert( href ); // может быть подгрузка с сервера, генерация интерфейса и т.п. *!* return false; // отменить переход по url @@ -127,7 +127,7 @@ menu.onclick = function(event) { element.onclick = function(event) { event = event || window.event; - if (event.preventDefault) { // если метод существует + if (event.preventDefault) { // если метод существует event.preventDefault(); // то вызвать его } else { // иначе вариант IE8-: event.returnValue = false; @@ -138,6 +138,7 @@ element.onclick = function(event) { Можно записать в одну строку: ```js +//+ no-beautify ... event.preventDefault ? event.preventDefault() : (event.returnValue=false); ... diff --git a/2-ui/2-events-and-interfaces/8-dispatch-events/article.md b/2-ui/2-events-and-interfaces/8-dispatch-events/article.md index 9a34c5be..f9b8c5ce 100644 --- a/2-ui/2-events-and-interfaces/8-dispatch-events/article.md +++ b/2-ui/2-events-and-interfaces/8-dispatch-events/article.md @@ -37,7 +37,7 @@ var event = new Event(тип события[, флаги]); При просмотре примера ниже кнопка обработчик `onclick` на кнопке сработает сам по себе, событие генерируется скриптом: ```html - + ``` @@ -318,22 +323,22 @@ event.initEvent("click", true, true); Выглядят они немного страшновато, например (взято из [спецификации](http://www.w3.org/TR/DOM-Level-3-Events/#idl-interface-MouseEvent-initializers)): ```js -void initMouseEvent ( - DOMString typeArg, // тип - boolean bubblesArg, // всплывает? - boolean cancelableArg, // можно отменить? - AbstractView? viewArg, // объект window, null означает текущее окно - long detailArg, // свойство detail и другие... - long screenXArg, - long screenYArg, - long clientXArg, - long clientYArg, - boolean ctrlKeyArg, - boolean altKeyArg, - boolean shiftKeyArg, - boolean metaKeyArg, - unsigned short buttonArg, - EventTarget? relatedTargetArg); +void initMouseEvent( + DOMString typeArg, // тип + boolean bubblesArg, // всплывает? + boolean cancelableArg, // можно отменить? + AbstractView ? viewArg, // объект window, null означает текущее окно + long detailArg, // свойство detail и другие... + long screenXArg, + long screenYArg, + long clientXArg, + long clientYArg, + boolean ctrlKeyArg, + boolean altKeyArg, + boolean shiftKeyArg, + boolean metaKeyArg, + unsigned short buttonArg, + EventTarget ? relatedTargetArg); }; ``` @@ -345,7 +350,7 @@ void initMouseEvent ( ``` diff --git a/2-ui/3-event-details/1-mouse-clicks/article.md b/2-ui/3-event-details/1-mouse-clicks/article.md index af3f0dbc..1478db2c 100644 --- a/2-ui/3-event-details/1-mouse-clicks/article.md +++ b/2-ui/3-event-details/1-mouse-clicks/article.md @@ -77,7 +77,7 @@ Это событие срабатывает при клике правой кнопкой мыши: ```html - +
      Правый клик на этой кнопке выведет "Клик".
      ``` @@ -89,7 +89,7 @@ В примере ниже встроенное меню показано не будет: ```html - + ``` @@ -116,7 +116,7 @@ *!* if (!e.altKey || !e.shiftKey) return; */!* - alert('Ура!'); + alert( 'Ура!' ); } ``` @@ -230,7 +230,7 @@ ```js function fixWhich(e) { if (!e.which && e.button) { // если which нет, но есть button... (IE8-) - if (e.button & 1) e.which = 1; // левая кнопка + if (e.button & 1) e.which = 1; // левая кнопка else if (e.button & 4) e.which = 2; // средняя кнопка else if (e.button & 2) e.which = 3; // правая кнопка } @@ -247,13 +247,13 @@ function fixWhich(e) { ```js function fixPageXY(e) { - if (e.pageX == null && e.clientX != null ) { // если нет pageX.. + if (e.pageX == null && e.clientX != null) { // если нет pageX.. var html = document.documentElement; var body = document.body; e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0); e.pageX -= html.clientLeft || 0; - + e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0); e.pageY -= html.clientTop || 0; } diff --git a/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md b/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md index 219db890..ec5bb970 100644 --- a/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md +++ b/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md @@ -33,14 +33,14 @@ document.addEventListener("DOMContentLoaded", ready); + ``` @@ -69,7 +69,7 @@ document.addEventListener("DOMContentLoaded", ready); ```html - ``` @@ -99,7 +99,7 @@ Firefox/Chrome/Opera автозаполняют формы по `DOMContentLoade @@ -144,9 +144,9 @@ Firefox игнорирует текст, а всегда показывает с ```html ... - + ``` @@ -166,7 +166,7 @@ Firefox игнорирует текст, а всегда показывает с diff --git a/2-ui/3-event-details/11-onload-onerror/3-script-callback/task.md b/2-ui/3-event-details/11-onload-onerror/3-script-callback/task.md index 5e984aab..e20c2320 100644 --- a/2-ui/3-event-details/11-onload-onerror/3-script-callback/task.md +++ b/2-ui/3-event-details/11-onload-onerror/3-script-callback/task.md @@ -11,7 +11,7 @@ ```js // go.js содержит функцию go() addScript("go.js", function() { - go(); + go(); }); ``` diff --git a/2-ui/3-event-details/11-onload-onerror/4-scripts-callback/task.md b/2-ui/3-event-details/11-onload-onerror/4-scripts-callback/task.md index de6c4e6c..f286dfc2 100644 --- a/2-ui/3-event-details/11-onload-onerror/4-scripts-callback/task.md +++ b/2-ui/3-event-details/11-onload-onerror/4-scripts-callback/task.md @@ -9,6 +9,7 @@ Пример использования: ```js +//+ no-beautify addScripts(["a.js", "b.js", "c.js"], function() { a() }); /* функция a() описана в a.js и использует b.js,c.js */ ``` diff --git a/2-ui/3-event-details/11-onload-onerror/article.md b/2-ui/3-event-details/11-onload-onerror/article.md index 0836272d..03b4bb41 100644 --- a/2-ui/3-event-details/11-onload-onerror/article.md +++ b/2-ui/3-event-details/11-onload-onerror/article.md @@ -39,9 +39,9 @@ document.body.appendChild(script); *!* script.onload = function() { - // после выполнения скрипта становится доступна функция _ - alert(_); // её код -} + // после выполнения скрипта становится доступна функция _ + alert( _ ); // её код + } */!* ``` @@ -65,7 +65,7 @@ document.body.appendChild(script); *!* script.onerror = function() { - alert("Ошибка: " + this.src); + alert( "Ошибка: " + this.src ); }; */!* ``` @@ -89,7 +89,7 @@ script.onerror = function() { Например, рабочий скрипт: ```js -//+ run +//+ run no-beautify var script = document.createElement('script'); script.src = "https://code.jquery.com/jquery.js"; document.documentElement.appendChild(script); @@ -104,7 +104,7 @@ script.onreadystatechange = function() { Скрипт с ошибкой: ```js -//+ run +//+ run no-beautify var script = document.createElement('script'); script.src = "http://ajax.googleapis.com/404.js"; document.documentElement.appendChild(script); @@ -132,7 +132,7 @@ script.onreadystatechange = function() { Пример ниже вызывает `afterLoad` после загрузки скрипта и работает только в IE: ```js -//+ run +//+ run no-beautify var script = document.createElement('script'); script.src = "https://code.jquery.com/jquery.js"; document.documentElement.appendChild(script); @@ -176,7 +176,7 @@ script.src = "https://code.jquery.com/jquery.js"; document.documentElement.appendChild(script); function afterLoad() { - alert("Загрузка завершена: " + typeof(jQuery)); + alert( "Загрузка завершена: " + typeof(jQuery) ); } script.onload = script.onerror = function() { @@ -189,7 +189,9 @@ script.onload = script.onerror = function() { script.onreadystatechange = function() { var self = this; if (this.readyState == "complete" || this.readyState == "loaded") { - setTimeout(function() { self.onload() }, 0);// сохранить "this" для onload + setTimeout(function() { + self.onload() + }, 0); // сохранить "this" для onload } }; ``` @@ -221,6 +223,7 @@ script.onreadystatechange = function() {
      Ставим обработчики на `onload` + `onerror` ```js +//+ no-beautify var img = document.createElement('img'); img.onload = function() { alert("Успех "+this.src }; img.onerror = function() { alert("Ошибка "+this.src }; diff --git a/2-ui/3-event-details/2-unselectable/article.md b/2-ui/3-event-details/2-unselectable/article.md index f037c744..66133de3 100644 --- a/2-ui/3-event-details/2-unselectable/article.md +++ b/2-ui/3-event-details/2-unselectable/article.md @@ -98,11 +98,15 @@ ```html Строка до.. @@ -151,7 +155,7 @@ b {
    2. Отмена действий на `mousedown` и `selectstart`: ```js -elem.onmousedown = elem.onselectstart = function() { +elem.onmousedown = elem.onselectstart = function() { return false; }; ``` @@ -171,7 +175,7 @@ elem.onmousedown = elem.onselectstart = function() { Если уж хочется запретить копирование -- можно использовать событие `oncopy`: ```html - +
      Уважаемый копирователь, почему-то автор хочет заставить вас покопаться в исходном коде этой страницы. diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md index 3bb9a2d8..426d4d7d 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md @@ -24,7 +24,7 @@ tooltip.innerHTML = "Подсказка"; // при "наведении на элемент" показать подсказку new HoverIntent({ - elem: elem, + elem: elem, over: function() { tooltip.style.left = this.getBoundingClientRect().left + 'px'; tooltip.style.top = this.getBoundingClientRect().bottom + 5 + 'px'; diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md index 3dce9eb5..f28d33df 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md @@ -161,12 +161,12 @@ ```js table.onmouseover = function(event) { - var target = event.target; + var target = event.target; target.style.background = 'pink'; }; table.onmouseout = function(event) { - var target = event.target; + var target = event.target; target.style.background = ''; }; ``` diff --git a/2-ui/3-event-details/4-drag-and-drop/article.md b/2-ui/3-event-details/4-drag-and-drop/article.md index 80d22846..60316bcb 100644 --- a/2-ui/3-event-details/4-drag-and-drop/article.md +++ b/2-ui/3-event-details/4-drag-and-drop/article.md @@ -38,19 +38,19 @@ ball.onmousedown = function(e) { // 1. отследить нажатие*!* // подготовить к перемещению // 2. разместить на том же месте, но в абсолютных координатах*!* - ball.style.position = 'absolute'; + ball.style.position = 'absolute'; moveAt(e); // переместим в body, чтобы мяч был точно не внутри position:relative - document.body.appendChild(ball); + document.body.appendChild(ball); ball.style.zIndex = 1000; // показывать мяч над другими элементами - + // передвинуть мяч под координаты курсора // и сдвинуть на половину ширины/высоты для центрирования function moveAt(e) { - ball.style.left = e.pageX - ball.offsetWidth/2 + 'px'; - ball.style.top = e.pageY - ball.offsetHeight/2 + 'px'; - } + ball.style.left = e.pageX - ball.offsetWidth / 2 + 'px'; + ball.style.top = e.pageY - ball.offsetHeight / 2 + 'px'; + } // 3, перемещать по экрану*!* document.onmousemove = function(e) { @@ -78,8 +78,8 @@ ball.onmousedown = function(e) { // 1. отследить нажатие*!* Его нужно отключить: ```js -ball.ondragstart = function() { - return false; +ball.ondragstart = function() { + return false; }; ``` @@ -106,8 +106,8 @@ ball.ondragstart = function() { В примерах выше мяч позиционируется в центре под курсором мыши: ```js -self.style.left = e.pageX - ball.offsetWidth/2 + 'px'; -self.style.top = e.pageY - ball.offsetHeight/2 + 'px'; +self.style.left = e.pageX - ball.offsetWidth / 2 + 'px'; +self.style.top = e.pageY - ball.offsetHeight / 2 + 'px'; ``` Если поставить `left/top` ровно в `pageX/pageY`, то мячик прилипнет верхним-левым углом к курсору мыши. Будет некрасиво. Поэтому мы сдвигаем его на половину высоты/ширины, чтобы был центром под мышью. Уже лучше. diff --git a/2-ui/3-event-details/5-drag-and-drop-objects/article.md b/2-ui/3-event-details/5-drag-and-drop-objects/article.md index e4c236d4..3653dc8e 100644 --- a/2-ui/3-event-details/5-drag-and-drop-objects/article.md +++ b/2-ui/3-event-details/5-drag-and-drop-objects/article.md @@ -60,7 +60,7 @@ Код обработчика `mousedown`: ```js -var dragObject = {}; +var dragObject = {}; document.onmousedown = function(e) { @@ -103,8 +103,8 @@ document.onmousedown = function(e) { document.onmousemove = function(e) { if (!dragObject.elem) return; // элемент не зажат - if ( !dragObject.avatar ) { // элемент нажат, но пока не начали его двигать - ... начать перенос, присвоить dragObject.avatar = переносимый элемент + if (!dragObject.avatar) { // элемент нажат, но пока не начали его двигать + ...начать перенос, присвоить dragObject.avatar = переносимый элемент } ...отобразить перенос элемента... @@ -131,7 +131,7 @@ document.onmousemove = function(e) { ```js // в начале переноса: -if (avatar.parentNode != document.body) { +if (avatar.parentNode != document.body) { document.body.appendChild(avatar); // переместить в BODY, если надо } avatar.style.zIndex = 9999; // сделать, чтобы элемент был над другими @@ -356,6 +356,7 @@ function findDroppable(event) { Для его создания используем не обычный синтаксис `{...}`, а вызов `new function`. Это позволит прямо при создании объявить дополнительные переменные и функции в замыкании, которыми могут пользоваться методы объекта, а также назначить обработчики: ```js +//+ no-beautify var DragManager = new function() { var dragObject = {}; @@ -400,6 +401,7 @@ var DragManager = new function() { С использованием `DragManager` пример, с которого начиналась эта глава -- перенос иконок браузеров в компьютер, реализуется совсем просто: ```js +//+ no-beautify DragManager.onDragEnd = function(dragObject, dropElem) { // скрыть/удалить переносимый объект diff --git a/2-ui/3-event-details/6-mousewheel/article.md b/2-ui/3-event-details/6-mousewheel/article.md index ca3c4331..dbd5cff2 100644 --- a/2-ui/3-event-details/6-mousewheel/article.md +++ b/2-ui/3-event-details/6-mousewheel/article.md @@ -9,7 +9,7 @@ Несмотря на то, что колёсико мыши обычно ассоциируется с прокруткой, это совсем разные вещи.
        -
      • При прокрутке срабатывает событие [onscroll](/event-onscroll) -- рассмотрим его в дальнейшем. Оно произойдёт *при любой прокрутке*, в том числе через клавиатурy, но *только на прокручиваемых элементах*. Например, элемент с `overflow:hidden` в принципе не может сгенерировать `onscroll`.
      • +
      • При прокрутке срабатывает событие [onscroll](/onscroll) -- рассмотрим его в дальнейшем. Оно произойдёт *при любой прокрутке*, в том числе через клавиатурy, но *только на прокручиваемых элементах*. Например, элемент с `overflow:hidden` в принципе не может сгенерировать `onscroll`.
      • А событие `wheel` является чисто "мышиным". Оно генерируется *над любым элементом* при передвижении колеса мыши. При этом не важно, прокручиваемый он или нет. В частности, `overflow:hidden` никак не препятствует обработке колеса мыши.
      @@ -39,16 +39,16 @@ if (elem.addEventListener) { if ('onwheel' in document) { // IE9+, FF17+, Ch31+ - elem.addEventListener ("wheel", onWheel); + elem.addEventListener("wheel", onWheel); } else if ('onmousewheel' in document) { // устаревший вариант события - elem.addEventListener ("mousewheel", onWheel); + elem.addEventListener("mousewheel", onWheel); } else { // Firefox < 17 - elem.addEventListener ("MozMousePixelScroll", onWheel); + elem.addEventListener("MozMousePixelScroll", onWheel); } } else { // IE8- - elem.attachEvent ("onmousewheel", onWheel); + elem.attachEvent("onmousewheel", onWheel); } function onWheel(e) { diff --git a/2-ui/3-event-details/7-fixevent/article.md b/2-ui/3-event-details/7-fixevent/article.md index 62e46576..bc9eaf50 100644 --- a/2-ui/3-event-details/7-fixevent/article.md +++ b/2-ui/3-event-details/7-fixevent/article.md @@ -18,7 +18,7 @@ elem.onclick = function(event) { *!* // если IE8-, то получить объект события window.event и исправить его - event = event || fixEvent.call(this, window.event); + event = event || fixEvent.call(this, window.event); */!* ... } @@ -40,11 +40,11 @@ function fixEvent(e) { e.currentTarget = this; e.target = e.srcElement; - + if (e.type == 'mouseover' || e.type == 'mouseenter') e.relatedTarget = e.fromElement; if (e.type == 'mouseout' || e.type == 'mouseleave') e.relatedTarget = e.toElement; - - if (e.pageX == null && e.clientX != null ) { + + if (e.pageX == null && e.clientX != null) { var html = document.documentElement; var body = document.body; @@ -56,7 +56,7 @@ function fixEvent(e) { } if (!e.which && e.button) { - e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : (e.button & 4 ? 2 : 0) ); + e.which = e.button & 1 ? 1 : (e.button & 2 ? 3 : (e.button & 4 ? 2 : 0)); } return e; diff --git a/2-ui/3-event-details/8-onscroll/2-updown-button/solution.md b/2-ui/3-event-details/8-onscroll/2-updown-button/solution.md index ae85065b..8fa8c587 100644 --- a/2-ui/3-event-details/8-onscroll/2-updown-button/solution.md +++ b/2-ui/3-event-details/8-onscroll/2-updown-button/solution.md @@ -47,7 +47,7 @@ window.onscroll = function() { var pageY = window.pageYOffset || document.documentElement.scrollTop; var innerHeight = document.documentElement.clientHeight; - switch(updownElem.className) { + switch (updownElem.className) { case '': if (pageY > innerHeight) { updownElem.className = 'up'; @@ -77,7 +77,7 @@ var pageYLabel = 0; updownElem.onclick = function() { var pageY = window.pageYOffset || document.documentElement.scrollTop; - switch(this.className) { + switch (this.className) { case 'up': pageYLabel = pageY; window.scrollTo(0, 0); diff --git a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.md b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.md index d43306ff..1608bab1 100644 --- a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.md +++ b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.md @@ -3,7 +3,7 @@ Она должна срабатывать не только при прокрутке, но и при загрузке. Вполне достаточно для этого -- указать ее вызов в скрипте под страницей, вот так: ```js -... страница ... +...страница... function isVisible(elem) { @@ -20,7 +20,7 @@ function isVisible(elem) { *!* -showVisible(); +showVisible(); window.onscroll = showVisible; */!* ``` diff --git a/2-ui/3-event-details/8-onscroll/article.md b/2-ui/3-event-details/8-onscroll/article.md index df24ac01..da325c24 100644 --- a/2-ui/3-event-details/8-onscroll/article.md +++ b/2-ui/3-event-details/8-onscroll/article.md @@ -9,7 +9,7 @@ ```js //+ autorun -window.onscroll = function() { +window.onscroll = function() { var scrolled = window.pageYOffset || document.documentElement.scrollTop; document.getElementById('showScroll').innerHTML = scrolled + 'px'; } diff --git a/2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.md b/2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.md index d7de0b52..35f6c937 100644 --- a/2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.md +++ b/2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.md @@ -17,8 +17,8 @@ ```js input.onkeypress = function(e) { e = e || event; - - if (e.ctrlKey || e.altKey || e.metaKey) return; + + if (e.ctrlKey || e.altKey || e.metaKey) return; var chr = getChar(e); @@ -26,7 +26,7 @@ input.onkeypress = function(e) { // т.к. например null >= '0' => true // на всякий случай лучше вынести проверку chr == null отдельно if (chr == null) return; - + if (chr < '0' || chr > '9') { return false; } diff --git a/2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/task.md b/2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/task.md index d3884444..285e4f92 100644 --- a/2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/task.md +++ b/2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/task.md @@ -7,6 +7,7 @@ Например, код ниже выведет `alert` при одновременном нажатии клавиш `"Q"` и `"W"` (в любом регистре, в любой раскладке) ```js +//+ no-beautify runOnKeys( function() { alert("Привет!") }, "Q".charCodeAt(0), diff --git a/2-ui/3-event-details/9-keyboard-events/article.md b/2-ui/3-event-details/9-keyboard-events/article.md index 31ce098a..a0ea7019 100644 --- a/2-ui/3-event-details/9-keyboard-events/article.md +++ b/2-ui/3-event-details/9-keyboard-events/article.md @@ -79,15 +79,15 @@ //+ autorun // event.type должен быть keypress function getChar(event) { - if (event.which == null) { // IE + if (event.which == null) { // IE if (event.keyCode < 32) return null; // спец. символ - return String.fromCharCode(event.keyCode) - } + return String.fromCharCode(event.keyCode) + } - if (event.which!=0 && event.charCode!=0) { // все кроме IE + if (event.which != 0 && event.charCode != 0) { // все кроме IE if (event.which < 32) return null; // спец. символ return String.fromCharCode(event.which); // остальные - } + } return null; // спец. символ } @@ -179,18 +179,18 @@ function getChar(event) { ```html ``` diff --git a/2-ui/4-forms-controls/1-form-elements/1-add-select-option/solution.md b/2-ui/4-forms-controls/1-form-elements/1-add-select-option/solution.md index cdf6dffb..4ec1dec3 100644 --- a/2-ui/4-forms-controls/1-form-elements/1-add-select-option/solution.md +++ b/2-ui/4-forms-controls/1-form-elements/1-add-select-option/solution.md @@ -12,12 +12,12 @@ // 1) var selectedOption = select.options[select.selectedIndex]; - alert(selectedOption.value); + alert( selectedOption.value ); // 2) var newOption = new Option("Classic", "Классика"); select.appendChild(newOption); - + // 3) newOption.selected = true; diff --git a/2-ui/4-forms-controls/1-form-elements/article.md b/2-ui/4-forms-controls/1-form-elements/article.md index 6ad537e6..82f9280d 100644 --- a/2-ui/4-forms-controls/1-form-elements/article.md +++ b/2-ui/4-forms-controls/1-form-elements/article.md @@ -11,6 +11,7 @@ Например: ```js +//+ no-beautify document.forms.my -- форма с именем 'my' document.forms[0] -- первая форма в документе ``` @@ -24,18 +25,18 @@ document.forms[0] -- первая форма в документе ```html -
      - - -
      +
      + + +
      - + alert( elem.value ); // "один" + ``` @@ -67,24 +68,25 @@ alert(elems[0].value); // 10, первый input ```html -
      -
      fieldset + +
      + fieldset -
      - +
      + - + ``` -Спецификация: [HTML5 Forms](http://www.w3.org/TR/html5/forms.html). +Спецификация: [HTML5 Forms](https://html.spec.whatwg.org/multipage/forms.html). [warn header="Доступ `form.name` тоже работает, но с особенностями"] Получить доступ к элементам формы можно не только через `form.elements[name/index]`, но и проще: `form[index/name]`. @@ -95,19 +97,21 @@ alert( form.elements.set.elements.text ); // INPUT ```html -
      +
      + +
      ``` @@ -138,7 +142,7 @@ alert(elem.form == form); // true ``` -Познакомиться с другими свойствами элементов можно в спецификации [HTML5 Forms](http://www.w3.org/TR/html5/forms.html). +Познакомиться с другими свойствами элементов можно в спецификации [HTML5 Forms](https://html.spec.whatwg.org/multipage/forms.html). ## Элемент label @@ -157,12 +161,20 @@ alert(elem.form == form); // true - - + + - - + +
      + + + +
      + + + +
      ``` @@ -171,7 +183,7 @@ alert(elem.form == form); // true
    3. Завернуть элемент в `label`. В этом случае можно обойтись без дополнительных атрибутов: ```html - + ``` @@ -196,8 +208,8 @@ textarea.value = "Новый текст"; **Текущее "отмеченное" состояние для `checkbox` и `radio` находится в свойстве `checked` (`true/false`).** ```js -if (input.checked) { - alert("Чекбокс выбран"); +if (input.checked) { + alert( "Чекбокс выбран" ); } ``` @@ -242,13 +254,13 @@ for (var i=0; i ``` -Спецификация: HTMLSelectElement. +Спецификация: [the select element](https://html.spec.whatwg.org/multipage/forms.html#the-select-element). [smart header="`new Option`"] -В стандарте [the Option Element](http://dev.w3.org/html5/spec/the-option-element.html#the-option-element) есть любопытный короткий синтаксис для создания элемента с тегом `option`: +В стандарте [the option element](https://html.spec.whatwg.org/multipage/forms.html#the-option-element) есть любопытный короткий синтаксис для создания элемента с тегом `option`: ```js -option = new Option( text, value, defaultSelected, selected); +option = new Option(text, value, defaultSelected, selected); ``` Параметры: @@ -261,7 +273,7 @@ option = new Option( text, value, defaultSelected, selected); Его можно использовать вместо `document.createElement('option')`, например: ```js -var option = new Option("Текст", "value"); +var option = new Option("Текст", "value"); // создаст ``` @@ -275,7 +287,7 @@ var option = new Option("Текст", "value", true, true); [smart header="Дополнительные свойства `option`"] -У элементов `option` также есть особые свойства, которые могут оказаться полезными (см. [The Option Element](http://dev.w3.org/html5/spec/the-option-element.html#the-option-element)): +У элементов `option` также есть особые свойства, которые могут оказаться полезными (см. [the option element](https://html.spec.whatwg.org/multipage/forms.html#the-option-element)):
      `selected`
      diff --git a/2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.md b/2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.md index cb0173e2..71bccf8b 100644 --- a/2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.md +++ b/2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.md @@ -5,7 +5,8 @@ Так как мы преобразуем `
      ` в `