diff --git a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md b/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md
index f0e20971..81152200 100644
--- a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md
+++ b/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md
@@ -29,4 +29,4 @@ vasya.lastName = 'Сидоров';
alert( vasya.fullName ); // Василий Сидоров
```
-Важно: не рекомендуется дублировать одни и те же данные в различных свойствах. Поэтому в этой задаче `fullName` должно остаться свойством, а `firstName/lastName` -- реализованы через `get/set`.
\ No newline at end of file
+Важно: в этой задаче `fullName` должно остаться свойством, а `firstName/lastName` -- реализованы через `get/set`. Лишнее дублирование здесь ни к чему.
\ No newline at end of file
diff --git a/1-js/6-objects-more/4-descriptors-getters-setters/article.md b/1-js/6-objects-more/4-descriptors-getters-setters/article.md
index 32c2ddfb..1a9fecb9 100644
--- a/1-js/6-objects-more/4-descriptors-getters-setters/article.md
+++ b/1-js/6-objects-more/4-descriptors-getters-setters/article.md
@@ -9,7 +9,7 @@
Основной метод для управления свойствами -- [Object.defineProperty](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty).
-Он позволяет как просто объявить свойство объекта, так и тонко настроить его особые аспекты, которые никак иначе не изменить.
+Он позволяет объявить свойство объекта и, что самое главное, тонко настроить его особые аспекты, которые никак иначе не изменить.
Синтаксис:
@@ -24,7 +24,9 @@ Object.defineProperty(obj, prop, descriptor)
`prop`
Имя свойства, которое нужно объявить или модифицировать.
`descriptor`
-Дескриптор -- объект, который описывает поведение свойства. В нём могут быть следующие поля:
+Дескриптор -- объект, который описывает поведение свойства.
+
+В нём могут быть следующие поля:
- `value` -- значение свойства, по умолчанию `undefined`
diff --git a/2-ui/4-forms-controls/3-events-change/article.md b/2-ui/4-forms-controls/3-events-change/article.md
index a1816168..f4299b73 100644
--- a/2-ui/4-forms-controls/3-events-change/article.md
+++ b/2-ui/4-forms-controls/3-events-change/article.md
@@ -208,7 +208,7 @@
`cut/copy/paste` |
-Срабатывают при вставке/копировании/удалении текста. В них можно отменить действие браузера, и тогда вставке/копирования/удаления не произойдёт. |
+Срабатывают при вставке/копировании/удалении текста. Если в их обработчиках отменить действие браузера, то вставки/копирования/удаления не произойдёт. |
Вставляемое значение получить нельзя: на момент срабатывания события в элементе всё ещё *старое* значение, а новое недоступно. |
diff --git a/4-ajax/12-ajax-iframe/article.md b/4-ajax/12-ajax-iframe/article.md
index a6278ac4..838f1839 100644
--- a/4-ajax/12-ajax-iframe/article.md
+++ b/4-ajax/12-ajax-iframe/article.md
@@ -211,7 +211,7 @@ function postToIframe(url, data, target) {
- В любых, даже самых старых IE, можно обмениваться данными через `window.name`. Эта переменная хранит "имя" окна или фрейма, которое не меняется при перезагрузке страницы.
Поэтому если мы сделали `POST` в `
-- Также в совсем старых IE можно обмениваться данными через хеш, то есть фрагмент URL после `#`. Его изменение доступно между ифреймами с разных доменов и не переводит к перезагрузке страницы. Таким образом они могут передавать данные друг другу. Есть готовые библиотеки, которые реализуют этот подход, например [Porthole](http://ternarylabs.github.io/porthole/).
+- Также в совсем старых IE можно обмениваться данными через хеш, то есть фрагмент URL после `#`. Его изменение доступно между ифреймами с разных доменов и не приводит к перезагрузке страницы. Таким образом они могут передавать данные друг другу. Есть готовые библиотеки, которые реализуют этот подход, например [Porthole](http://ternarylabs.github.io/porthole/).
diff --git a/4-ajax/4-xhr-forms/article.md b/4-ajax/4-xhr-forms/article.md
index 7560f76d..a3df4f7d 100644
--- a/4-ajax/4-xhr-forms/article.md
+++ b/4-ajax/4-xhr-forms/article.md
@@ -172,7 +172,7 @@ Content-Disposition: form-data; name="*!*surname*/!*"
Достаточно указать в заголовке `Content-Type` кодировку и границу, и далее сформировать тело запроса, удовлетворяющее требованиям кодировки.
-Пример кода для пересылке того же запроса, что и раньше, в кодировке `multipart/form-data`:
+Пример кода для того же запроса, что и раньше, теперь в кодировке `multipart/form-data`:
```js
var data = {
@@ -268,7 +268,7 @@ Content-Type: image/jpeg
XMLHttpRequest сам по себе не ограничивает кодировку и формат пересылаемых данных.
-Поэтому просто для обмена данными JS <-> сервер, без всяких форма, часто используется POST с JSON:
+Поэтому для обмена данными часто используется формат JSON:
```js
var xhr = new XMLHttpRequest();
@@ -283,6 +283,10 @@ xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.onreadystatechange = ...;
+*!*
+// Отсылаем объект в формате JSON и с Content-Type application/json
+// Сервер должен уметь такой Content-Type принимать и раскодировать
+*/!*
xhr.send(json);
```
diff --git a/4-ajax/5-xhr-crossdomain/article.md b/4-ajax/5-xhr-crossdomain/article.md
index 559c0f83..0d591871 100644
--- a/4-ajax/5-xhr-crossdomain/article.md
+++ b/4-ajax/5-xhr-crossdomain/article.md
@@ -74,7 +74,7 @@ xhr.send();
-"Непростыми" считаются все остальные, например, запрос с методом `PUT` или с заголовком `Authorization` будет не подходит под ограничения выше.
+"Непростыми" считаются все остальные, например, запрос с методом `PUT` или с заголовком `Authorization` не подходит под ограничения выше.
Принципиальная разница между ними заключается в том, что "простой" запрос можно сформировать и отправить на сервер и без XMLHttpRequest, например при помощи HTML-формы.
@@ -84,7 +84,7 @@ xhr.send();
А вот запросы с нестандартными заголовками или с методом `DELETE` таким образом не создать. Поэтому старый сервер может быть к ним не готов. Или, к примеру, он может полагать, что такие запросы веб-страница в принципе не умеет присылать, значит они пришли из привелигированного приложения, и дать им слишком много прав.
-Поэтому при посылкой "непростых" запросов нужно специальным образом спросить у сервера, согласен ли он в принципе на подобные кросс-доменные запросы или нет? И, если сервер не ответит, что согласен -- значит, нет.
+Поэтому при посылке "непростых" запросов нужно специальным образом спросить у сервера, согласен ли он в принципе на подобные кросс-доменные запросы или нет? И, если сервер не ответит, что согласен -- значит, нет.
[summary]
В спецификации CORS, как мы увидим далее, есть много деталей, но все они объединены единым принципом: новые возможности доступны только с явного согласия сервера (по умолчанию -- нет).
diff --git a/4-ajax/6-xhr-onprogress/article.md b/4-ajax/6-xhr-onprogress/article.md
index 564eec0b..bbef7f89 100644
--- a/4-ajax/6-xhr-onprogress/article.md
+++ b/4-ajax/6-xhr-onprogress/article.md
@@ -173,9 +173,9 @@ function upload(file) {
## Файлы и формы
-Выше мы использовали `xhr.send(file)` для посылки файл пересылается в теле запроса.
+Выше мы использовали `xhr.send(file)` для передачи файла непосредственно в теле запроса.
-При этом посылается только содержимое файла.
+При этом посылается только *содержимое* файла.
Если нужно дополнительно передать имя файла или что-то ещё -- это можно удобно сделать через форму, при помощи объекта [FormData](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData/Using_FormData_Objects):