This commit is contained in:
Ilya Kantor 2015-05-14 10:40:28 +03:00
parent 204d965821
commit 6bf5977407
7 changed files with 17 additions and 11 deletions

View file

@ -29,4 +29,4 @@ vasya.lastName = 'Сидоров';
alert( vasya.fullName ); // Василий Сидоров
```
Важно: не рекомендуется дублировать одни и те же данные в различных свойствах. Поэтому в этой задаче `fullName` должно остаться свойством, а `firstName/lastName` -- реализованы через `get/set`.
Важно: в этой задаче `fullName` должно остаться свойством, а `firstName/lastName` -- реализованы через `get/set`. Лишнее дублирование здесь ни к чему.

View file

@ -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)
<dt>`prop`</dt>
<dd>Имя свойства, которое нужно объявить или модифицировать.</dd>
<dt>`descriptor`</dt>
<dd>Дескриптор -- объект, который описывает поведение свойства. В нём могут быть следующие поля:
<dd>Дескриптор -- объект, который описывает поведение свойства.
В нём могут быть следующие поля:
<ul>
<li>`value` -- значение свойства, по умолчанию `undefined`</li>

View file

@ -208,7 +208,7 @@
</tr>
<tr>
<td>`cut/copy/paste`</td>
<td>Срабатывают при вставке/копировании/удалении текста. В них можно отменить действие браузера, и тогда вставке/копирования/удаления не произойдёт.</td>
<td>Срабатывают при вставке/копировании/удалении текста. Если в их обработчиках отменить действие браузера, то вставки/копирования/удаления не произойдёт.</td>
<td>Вставляемое значение получить нельзя: на момент срабатывания события в элементе всё ещё *старое* значение, а новое недоступно.</td>
</tr>
</tbody>

View file

@ -211,7 +211,7 @@ function postToIframe(url, data, target) {
<li>В любых, даже самых старых IE, можно обмениваться данными через `window.name`. Эта переменная хранит "имя" окна или фрейма, которое не меняется при перезагрузке страницы.
Поэтому если мы сделали `POST` в `<iframe>` на другой домен и он поставил `window.name = "Вася"`, а затем сделал редирект на основной домен, то эти данные станут доступны внешней странице.</li>
<li>Также в совсем старых IE можно обмениваться данными через хеш, то есть фрагмент URL после `#`. Его изменение доступно между ифреймами с разных доменов и не переводит к перезагрузке страницы. Таким образом они могут передавать данные друг другу. Есть готовые библиотеки, которые реализуют этот подход, например [Porthole](http://ternarylabs.github.io/porthole/).</li>
<li>Также в совсем старых IE можно обмениваться данными через хеш, то есть фрагмент URL после `#`. Его изменение доступно между ифреймами с разных доменов и не приводит к перезагрузке страницы. Таким образом они могут передавать данные друг другу. Есть готовые библиотеки, которые реализуют этот подход, например [Porthole](http://ternarylabs.github.io/porthole/).</li>
</ul>

View file

@ -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);
```

View file

@ -74,7 +74,7 @@ xhr.send();
</li>
</ol>
"Непростыми" считаются все остальные, например, запрос с методом `PUT` или с заголовком `Authorization` будет не подходит под ограничения выше.
"Непростыми" считаются все остальные, например, запрос с методом `PUT` или с заголовком `Authorization` не подходит под ограничения выше.
Принципиальная разница между ними заключается в том, что "простой" запрос можно сформировать и отправить на сервер и без XMLHttpRequest, например при помощи HTML-формы.
@ -84,7 +84,7 @@ xhr.send();
А вот запросы с нестандартными заголовками или с методом `DELETE` таким образом не создать. Поэтому старый сервер может быть к ним не готов. Или, к примеру, он может полагать, что такие запросы веб-страница в принципе не умеет присылать, значит они пришли из привелигированного приложения, и дать им слишком много прав.
Поэтому при посылкой "непростых" запросов нужно специальным образом спросить у сервера, согласен ли он в принципе на подобные кросс-доменные запросы или нет? И, если сервер не ответит, что согласен -- значит, нет.
Поэтому при посылке "непростых" запросов нужно специальным образом спросить у сервера, согласен ли он в принципе на подобные кросс-доменные запросы или нет? И, если сервер не ответит, что согласен -- значит, нет.
[summary]
В спецификации CORS, как мы увидим далее, есть много деталей, но все они объединены единым принципом: новые возможности доступны только с явного согласия сервера (по умолчанию -- нет).

View file

@ -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):