1. Фокус внешних сетевых запросов
В большинстве случаев, чтобы инициировать сетевой запрос на внешнем интерфейсе, нам нужно сосредоточиться только на следующих моментах:
- Передайте основные параметры (
url
, метод запроса) - Параметр запроса, тип параметра запроса
- установить заголовок запроса
- Как получить ответ
- Получить заголовки ответа, статус ответа и результаты ответа
- Обработка исключений
- нести
cookie
настраивать - междоменный запрос
Во-вторых, то, как внешний интерфейс выполняет сетевые запросы.
-
form
форма,ifream
,обновить страницу -
Ajax
- Создатель асинхронных сетевых запросов -
jQuery
- эпоха -
fetch
-Ajax
замена для -
axios、request
и многие другие библиотеки с открытым исходным кодом
3. Вопросы по сетевым запросам
-
Ajax
Какая проблема связана с появлением - Родной
Ajax
как использовать -
jQuery
метод сетевого запроса -
fetch
использование и подводные камни - Как его правильно использовать
fetch
- Как выбрать правильный междоменный метод
С вышеуказанными вопросами и опасениями мы проводим всесторонний анализ нескольких сетевых запросов.
В-четвертых, какую проблему решает появление Ajax?
существуетAjax
перед появлением,web
Программа работает так:
Недостатки такого взаимодействия очевидны: любое взаимодействие с сервером требует обновления страницы, а пользовательский опыт очень плохой.Ajax
появилось решение этой проблемы.Ajax
полное имяAsynchronous JavaScript + XML
(асинхронныйJavaScript
а такжеXML
)
использоватьAjax
, веб-приложение может быстро отображать добавочные обновления пользовательского интерфейса без перезагрузки (обновления) всей страницы.
Ajax
Это не новая технология сама по себе, но используется для описания технического решения, реализованного с использованием набора существующих технологий.XMLHttpRequest
реализуетсяAjax
Самый важный объект (IE6
Используйте следующееActiveXObject
).
несмотря на то чтоX
существуетAjax
Представитель в КитаеXML
, но из-заJSON
множество преимуществ, таких как меньший вес иJavascript
часть текущегоJSON
коэффициент использованияXML
чаще.
Пять, использование родного Ajax
Основной анализ здесьXMLHttpRequest
объект, ниже приведено его основное использование:
var xhr = new XMLHttpRequest();
xhr.open('post','www.xxx.com',true)
// 接收返回值
xhr.onreadystatechange = function(){
if(xhr.readyState === 4 ){
if(xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
console.log(xhr.responseText);
}
}
}
// 处理请求参数
postData = {"name1":"value1","name2":"value2"};
postData = (function(value){
var dataString = "";
for(var key in value){
dataString += key+"="+value[key]+"&";
};
return dataString;
}(postData));
// 设置请求头
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 异常处理
xhr.onerror = function() {
console.log('Network request failed')
}
// 跨域携带cookie
xhr.withCredentials = true;
// 发出请求
xhr.send(postData);
Ниже приведеныXMLHttpRequest
Анализируются часто используемые функции, свойства и события объекта.
функция
open
Используется для инициирования запроса, использование:
xhr.open(method, url, async);
-
method
: метод запроса, напримерget、post
-
url
: запрошеноurl
-
async
: Является ли это асинхронным запросом
send
для отправкиHTTP
запрос, то есть после вызова методаHTTP
Запрос будет фактически выдан, использование:
xhr.send(param)
-
param
: параметр http-запроса, который может бытьstring、Blob
и другие типы.
abort
прекратитьajax
запрос, после вызова этого методаreadyState
будет установлен на0
,Применение:
xhr.abort()
setRequestHeader
для установкиHTTP
заголовок запроса, этот метод должен бытьopen()
Методы иsend()
между вызовами, использование:
xhr.setRequestHeader(header, value);
getResponseHeader
для полученияhttp
Возвращает заголовок. Если в возвращаемом заголовке несколько одинаковых имен, возвращаемое значение будет представлять собой строку, разделенную запятыми и пробелами. Использование:
var header = xhr.getResponseHeader(name);
Атрибуты
readyState
используется для определения текущегоXMLHttpRequest
состояние, в котором находится объект,XMLHttpRequest
Объекты всегда находятся в одном из следующих состояний:
стоимость | условие | описывать |
---|---|---|
0 | UNSENT |
Прокси создан, но еще не вызванopen() метод. |
1 | OPENED |
open() был вызван метод. |
2 | HEADERS_RECEIVED |
send() Метод был вызван, и заголовок и состояние доступны. |
3 | LOADING |
скачивание;responseText Свойство уже содержит некоторые данные. |
4 | DONE |
Операция загрузки завершена. |
status
выражатьhttp
Состояние запроса, начальное значение0
. Если сервер явно не указывает код состояния, тоstatus
будет установлено значение по умолчанию, т.е.200
.
responseType
Указывает тип данных ответа и позволяет нам установить его вручную, если он пуст, по умолчаниюtext
тип, который может принимать следующие значения:
стоимость | описывать |
---|---|
"" |
БудуresponseType установить пустую строку vs установить на"text" же, является типом по умолчанию (фактическиDOMString ). |
"arraybuffer" |
response это двоичные данныеJavaScript ArrayBuffer . |
"blob" |
response это двоичные данныеBlob объект . |
"document" |
ответ - этоHTML Document илиXML XMLDocument в зависимости от типа MIME полученных данных. |
"json" |
response является объектом JavaScript. Этот объект создается путем обработки полученного типа данных какJSON проанализировано. |
"text" |
response входит вDOMString текст в объекте. |
response
Возвращает тело ответа, тип, возвращаемый вышеresponseType
Принимать решение.
withCredentials
ajax
По умолчанию запрос будет содержать запрос того же происхождения.cookie
, а междоменные запросы не будут выполнятьсяcookie
,настраиватьxhr
изwithCredentials
Собственностьtrue
позволит междоменный переносcookie
.
обратный вызов события
onreadystatechange
xhr.onreadystatechange = callback;
когдаreadyState
При изменении свойства будет запущен обратный вызов.
onloadstart
xhr.onloadstart = callback;
существуетajax
до отправки запроса (readyState==1
назад,readyState==2
вперед),callback
будет запущен.
onprogress
xhr.onprogress = function(event){
console.log(event.loaded / event.total);
}
Функция обратного вызова может получить общий размер ресурсаtotal
, размер уже загруженного ресурсаloaded
, ход загрузки можно рассчитать с помощью этих двух значений.
onload
xhr.onload = callback;
Запускается, когда ресурс и его зависимые ресурсы закончили загрузкуcallback
, обычно мы будемonload
Обработайте возвращаемое значение в событии.
Обработка исключений
onerror
xhr.onerror = callback;
когдаajax
Запускается, когда ресурс не загружаетсяcallback
.
ontimeout
xhr.ontimeout = callback;
Срабатывает, когда прогресс прерывается из-за истечения запланированного времениcallback
, период тайм-аута может быть использованtimeout
устанавливаются свойства.
jQuery
ajax
$.ajax、$.get、$.post
$.ajax({
dataType: 'json', // 设置返回值类型
contentType: 'application/json', // 设置参数类型
headers: {'Content-Type','application/json'},// 设置请求头
xhrFields: { withCredentials: true }, // 跨域携带cookie
data: JSON.stringify({a: [{b:1, a:1}]}), // 传递参数
error:function(xhr,status){ // 错误处理
console.log(xhr,status);
},
success: function (data,status) { // 获取结果
console.log(data,status);
}
})
url
type
String
"POST"
"GET"
"GET"
HTTP
PUT
DELETE
timeout
Number
success
Function
jsonp
jsonp
"callback=?"
GET
POST
URL
"callback"
errorFunction
isSuccess = status >= 200 && status < 300 || status === 304;
error
dataType
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text": 返回纯文本字符串
data
String
JSON.stringify
complete
Function
async
Boolean
true
false
contentType
String
"application/x-www-form-urlencoded"
JSON
JSON
{
a: 1,
b: 2,
c: 3
}
Ajax
json
application/x-www-form-urlencoded
JSON
{
data: {
a: [{
x: 2
}]
}
}
json
$.ajax({
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({a: [{b:1, a:1}]})
})
MV*
jQuery
jQuery
изAjax api
Чтобы внедрить его в одиночку, неизбежно нужны новые технические решения.
You Yuxi рекомендует всем использовать его в своей документации.axios
Сделайте сетевой запрос.axios
на основеPromise
родномуXHR
Это очень всесторонне упаковано и используется очень элегантно. Кроме того,axios
Также предоставляется вnode
Поддержка в среде может быть описана как предпочтительное решение для сетевых запросов.
В будущем определенно будет лучшая инкапсуляция. У них очень всесторонние соображения и подробная документация. Мы не будем проводить здесь много исследований. Мы сосредоточимся на более низком уровне API.fetch
.
Fetch API
— это мощный собственный API для доступа к каналам HTTP и управления ими.
Ранее эта функциональность была реализована с помощью XMLHttpRequest. Fetch предоставляет лучшую альтернативу, которую можно легко использовать с другими технологиями, такими как Service Workers. Fetch также предоставляет единое логическое место для определения других концепций, связанных с HTTP, таких как CORS и расширения для HTTP.
видимыйfetch
как естьXMLHttpRequest
появились альтернативы.
использоватьfetch
, вам не нужно загружать дополнительный внешний ресурс. Но он еще не полностью поддерживается браузерами, поэтому вам все еще нуженpolyfill
.
Восемь, использование извлечения
Базовый запрос на выборку:
const options = {
method: "POST", // 请求参数
headers: { "Content-Type": "application/json"}, // 设置请求头
body: JSON.stringify({name:'123'}), // 请求参数
credentials: "same-origin", // cookie设置
mode: "cors", // 跨域
}
fetch('http://www.xxx.com',options)
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson); // 响应数据
})
.catch(function(err){
console.log(err); // 异常处理
})
Fetch API
обеспечивает глобальноеfetch()
метод и несколько вспомогательных объектов для инициирования сетевого запроса.
fetch()
fetch()
Метод используется для инициирования запроса на получение ресурса. он возвращаетpromise
,этоpromise
будет вызываться после ответа на запросresolve
, и возвращаетResponse
объект.
Headers
в состоянии пройтиHeaders()
конструктор для создания собственногоheaders
объект, эквивалентныйresponse/request
Информация заголовка позволяет вам запрашивать эту информацию заголовка или выполнять различные операции для разных результатов.
var myHeaders = new Headers();
myHeaders.append("Content-Type", "text/plain");
Request
пройти черезRequest()
Конструктор может создатьRequest
предмет, который можно использовать какfetch
Второй параметр функции.
Response
существуетfetch()
законченныйpromises
затем вернутьResponse
например, вы также можете создать его вручнуюResponse
пример.
Девять, получение анализа исходного кода полифилла
из-заfetch
это очень низкий уровеньAPI
, так что мы не можем исследовать его нижний слой дальше, но мы можем использовать егоpolyfill
Изучите его обоснование и найдите подводные камни.
структура кода
Видно из кода,polyfill
главная параFetch
Четыре основных объекта, предоставляемых API, инкапсулированы:
получить пакет
Код очень понятен:
- построить
Promise
объект и возврат - Создавать
Request
объект - Создавать
XMLHttpRequest
объект - выиграть
Request
Запрос объектаurl
Просьба о прическе для вечеринки,open
Одинxhr
просить и будетRequest
хранится в объектеheaders
вынуть и назначить xhr -
xhr onload
после выносаresponse
изstatus
,headers
,body
упаковкаResponse
объект, звонокresolve
.
Обработка исключений
можно найти, звонитеreject
Есть три возможности:
-
Запросить время ожидания
-
2. Запрос не выполнен
Примечание. При установлении профиля на сервере и получении от сервера ненормального кода состояния, например404、500
и тд не заводитсяonerror
. Помечается только при сбое сети или при блокировке запроса.reject
, такие как междоменные,url
Не существует, сработает сетевое исключение и т. д.onerror
.
Таким образом, использование fetch будет введено вместо catch, когда будет получен код состояния исключения. Эти плохие запросы часто обрабатываются вручную.
- 3. Ручное прерывание
допустимыйrequest
передается в параметреsignal
объект иsignal
объект добавленabort
прослушиватель событий, когдаxhr.readyState
стали4
(Синтаксический анализ содержимого ответа завершен) После удаления прослушивателя события прерывания объекта сигнала.
Это означает, что вfetch
Может быть вызван до завершения запросаsignal.abort
прекратить его. Доступно в браузереAbortController()
Конструктор создает контроллер, а затем используетAbortController.signal
Атрибуты
Это экспериментальная функция, некоторые браузеры все еще находятся в стадии разработки.
Инкапсуляция заголовков
Объект заголовка поддерживаетсяmap
Объект, который можно передать в конструкторHeader
Объекты, массивы, обычные типы объектовheader
, и сохранить все значения доmap
середина.
доfetch
См. вызов в функцииheader
изforEach
метода, следующая его реализация:
видимыйheader
обход его внутреннихmap
обход.
Кроме тогоHeader
также обеспечиваетappend、delete、get、set
и другие методы, все из которых являются внутренними дляmap
объект для эксплуатации.
Объект запроса
Request
Два параметра, полученные объектом:fetch
Два параметра, полученные функцией, первый параметр может быть передан напрямуюurl
, вы также можете передать сконструированныйrequest
объект. Второй параметр предназначен для управления различными конфигурациями.option
объект.
можно пройти вcredentials、headers、method、mode、signal、referrer
и другие свойства.
Обратите внимание:
- входящий
headers
рассматриваться какHeaders
Параметры конструктора для построения объекта заголовка.
обработка файлов cookie
В функции fetch также есть следующий код:
if (request.credentials === 'include') {
xhr.withCredentials = true
} else if (request.credentials === 'omit') {
xhr.withCredentials = false
}
По умолчаниюcredentials
Типsame-origin
, вы можете хранить файлы cookie запроса того же происхождения.
Затем я нашел реализацию полифилла здесь иMDN — Использование выборкиИ многие данные противоречивы:
mdn: по умолчанию fetch не будет отправлять или получать файлы cookie с сервера.
Поэтому я экспериментировал отдельно, используяpolyfill
и использовать роднойfetch
В случае переноса файлов cookie обнаружено, что, когда файл cookie не установленcredentials
В данном случае это на самом деле гомология по умолчанию.cookie
Да, это не соответствует описанию документа.После ознакомления с большим количеством информации говоритсяfetch
Файлы cookie не переносятся по умолчанию, ниже используется собственныйfetch
При выполнении запроса в браузере:
Затем я нашел вMDN-Fetch-RequestБыли указаны более новые браузерыcredentials
Значение по умолчанию изменено наsame-origin
Старая версия до сих порomit
.
В самом делеMDN — Использование выборкиДокументы здесь обновлены немного не вовремя, что является недоразумением...
Объект ответа
Response
объектfetch
Возвращаемое значение после успешного вызова:
оглядыватьсяf
etch中对
Операция ответа`:
xhr.onload = function () {
var options = {
status: xhr.status,
statusText: xhr.statusText,
headers: parseHeaders(xhr.getAllResponseHeaders() || '')
}
options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
var body = 'response' in xhr ? xhr.response : xhr.responseText
resolve(new Response(body, options))
}
Response
Конструктор:
Видно, что в конструкторе главнаяoptions
серединаstatus、statusText、headers、url
д. обрабатываются отдельно и монтируются наResponse
на объекте.
Конструкторы внутри и нетresponseText
, и, наконец, передали_initBody
обработка функций, в то время какResponse
добровольно не заявлял_initBody
свойства, код используется последнимResponse
называетсяBody
функция, на самом деле_initBody
функция передается черезBody
функция монтируется наResponse
На теле давайте сначала посмотрим_initBody
функция:
видимый,_initBody
функционировать в соответствии сxhr.response
тип(Blob、FormData、String...
), присваивать значения разным параметрам, которые находятся вBody
В методе есть разные приложения, давайте посмотрим на детали ниже.Body
Какие еще операции выполняет функция:
Body
функция такжеResponse
Объект выполняет четыре функции,text、json、blob、formData
, операция в этих функциях заключается в возврате различных типов возвращаемых значений, полученных в _initBody.
Это также показывает, что вfetch
После выполнения вы не можете напрямуюresponse
чтобы получить возвращаемое значение вtext()、json()
Подождите, пока функция получит возвращаемое значение.
Здесь следует отметить еще одну вещь: некоторые функции имеют логику, подобную следующей:
var rejected = consumed(this)
if (rejected) {
return rejected
}
потребляемая функция:
function consumed(body) {
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'))
}
body.bodyUsed = true
}
каждый звонокtext()、json()
После ожидания функции она будетbodyUsed
Изменения переменныхtrue
, используется для указания, что возвращаемое значение было прочитано, и в следующий раз, когда оно будет прочитано, оно будет выброшено напрямуюTypeError('Already read')
. Это также следует за роднымfetch
правила:
Поскольку объекты Response настроены как потоки, их можно прочитать только один раз.
Десять, яма извлечения
VUE
в документации кfetch
Имеет следующее описание:
использовать
fetch
Есть много других соображений, поэтому на данном этапе все все еще предпочитают его.axios
немного больше. Конечно, это может измениться в будущем.
из-заfetch
это очень низкий уровеньAPI
, он не сильно инкапсулирован, и есть ряд проблем, с которыми нужно справиться:
- нельзя пройти напрямую
JavaScript
объект как параметр - Вам нужно самостоятельно определить тип возвращаемого значения и выполнить метод, чтобы получить возвращаемое значение в ответ.
- Метод получения возвращаемого значения может быть вызван только один раз, а не несколько раз.
- Не могу нормально поймать исключение
- Старые браузеры не поддерживают его по умолчанию.
cookie
- не поддерживается
jsonp
11. Инкапсуляция выборки
Обработка параметров запроса
Поддерживает передачу различных типов параметров:
function stringify(url, data) {
var dataString = url.indexOf('?') == -1 ? '?' : '&';
for (var key in data) {
dataString += key + '=' + data[key] + '&';
};
return dataString;
}
if (request.formData) {
request.body = request.data;
} else if (/^get$/i.test(request.method)) {
request.url = `${request.url}${stringify(request.url, request.data)}`;
} else if (request.form) {
request.headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
request.body = stringify(request.data);
} else {
request.headers.set('Content-Type', 'application/json;charset=UTF-8');
request.body = JSON.stringify(request.data);
}
печенье
fetch
В новой версии браузер стал нести тот же ориджин по умолчаниюcookie
, но он не будет использоваться по умолчанию в старых браузерах, нам нужно установить его единообразно:
request.credentials = 'same-origin'; // 同源携带
request.credentials = 'include'; // 可跨域携带
Обработка исключений
Когда получен код состояния HTTP, представляющий ошибку, обещание, возвращенное из fetch(), не будет помечено как отклоненное, даже если код состояния ответа HTTP равен 404 или 500. Вместо этого он пометит статус обещания как разрешение (но установит для свойства ok возвращаемого значения разрешения значение false ) и пометит его как отклонение только в случае сбоя сети или блокировки запроса.
Так что мы должныfetch
Исключения обрабатываются единообразно
.then(response => {
if (response.ok) {
return Promise.resolve(response);
}else{
const error = new Error(`请求失败! 状态码: ${response.status}, 失败信息: ${response.statusText}`);
error.response = response;
return Promise.reject(error);
}
});
обработка возвращаемого значения
Чтобы вызывать разные функции для получения разных типов возвращаемых значений, тип должен быть определен заранее, а метод для получения возвращаемого значения не может вызываться несколько раз:
.then(response => {
let contentType = response.headers.get('content-type');
if (contentType.includes('application/json')) {
return response.json();
} else {
return response.text();
}
});
jsonp
fetch
сама не обеспечиваетjsonp
служба поддержки,jsonp
Это не очень хороший способ решения междоменной проблемы, рекомендуется использоватьcors
илиnginx
Для решения междоменной проблемы см. подробности в следующих главах.
fetch упакован и может быть успешно использован.
Хм, axios работает очень хорошо...
12. Кросс-доменная сводка
Когда дело доходит до сетевых запросов, мы должны упомянуть междоменные.
Политика одного и того же источника браузера ограничивает взаимодействие документов или сценариев, загруженных из одного источника, с ресурсами из другого источника. Это важный механизм безопасности для изоляции потенциально вредоносных файлов. Операции чтения между разными источниками обычно не допускаются.
Кроссдоменные условия: протокол, доменное имя, порт, если есть разница, то кроссдоменная.
Ниже приведены несколько способов решения междоменной проблемы:
nginx
использоватьnginx
Обратный прокси для достижения кросс-доменности, обратитесь к моей статье:Необходимые знания nginx для фронтенд-разработчиков
cors
CORS
ЯвляетсяW3C
Стандартное, полное название — «междоменное совместное использование ресурсов».(Cross-origin resource sharing)
. Это позволяет браузерам отправлять запросы на кросс-серверные серверы.XMLHttpRequest
просить.
Настройки сервераAccess-Control-Allow-Origin
можно включитьCORS
. Этот атрибут указывает, какие доменные имена могут получить доступ к ресурсу. Если установлен подстановочный знак, это означает, что все веб-сайты могут получить доступ к ресурсу.
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
next();
});
jsonp
script
помеченsrc
Ссылки в свойствах могут иметь междоменный доступjs
Сценарий, используя эту функцию, сервер больше не возвращаетсяJSON
форматирует данные, но возвращает раздел, вызывающий функциюjs
код, вsrc
Вызов осуществляется таким образом, который реализует междоменный.
jquery
правильноjsonp
служба поддержки:
$.ajax({
type : "get",
url : "http://xxxx"
dataType: "jsonp",
jsonp:"callback",
jsonpCallback: "doo",
success : function(data) {
console.log(data);
}
});
fetch、axios
и т.д. не предоставил прямогоjsonp
Если нам нужно использовать этот метод, мы можем попробовать вручную инкапсулировать:
(function (window,document) {
"use strict";
var jsonp = function (url,data,callback) {
// 1.将传入的data数据转化为url字符串形式
// {id:1,name:'jack'} => id=1&name=jack
var dataString = url.indexof('?') == -1? '?': '&';
for(var key in data){
dataString += key + '=' + data[key] + '&';
};
// 2 处理url中的回调函数
// cbFuncName回调函数的名字 :my_json_cb_名字的前缀 + 随机数(把小数点去掉)
var cbFuncName = 'my_json_cb_' + Math.random().toString().replace('.','');
dataString += 'callback=' + cbFuncName;
// 3.创建一个script标签并插入到页面中
var scriptEle = document.createElement('script');
scriptEle.src = url + dataString;
// 4.挂载回调函数
window[cbFuncName] = function (data) {
callback(data);
// 处理完回调函数的数据之后,删除jsonp的script标签
document.body.removeChild(scriptEle);
}
document.body.appendChild(scriptEle);
}
window.$jsonp = jsonp;
})(window,document)
postMessage кросс-доменный
postMessage()
Методы позволяют сценариям из разных источников взаимодействовать асинхронно с ограниченным обменом данными, обеспечивая межтекстовый документ, многооконный и междоменный обмен сообщениями.
//捕获iframe
var domain = 'http://scriptandstyle.com';
var iframe = document.getElementById('myIFrame').contentWindow;
//发送消息
setInterval(function(){
var message = 'Hello! The time is: ' + (new Date().getTime());
console.log('blog.local: sending message: ' + message);
//send the message and target URI
iframe.postMessage(message,domain);
},6000);
//响应事件
window.addEventListener('message',function(event) {
if(event.origin !== 'http://davidwalsh.name') return;
console.log('message received: ' + event.data,event);
event.source.postMessage('holla back youngin!',event.origin);
},false);
postMessage
Междоменная связь подходит для следующих сценариев: междоменная связь между несколькими окнами одного и того же браузера,iframe
междоменное общение.
WebSocket
WebSocket
протокол двусторонней связи, после установления соединения,WebSocket
изserver
а такжеclient
Оба могут активно отправлять или получать данные друг другу, не ограничиваясь политикой одного и того же источника.
function WebSocketTest(){
if ("WebSocket" in window){
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:3000/abcd");
ws.onopen = function(){
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function(){
// 关闭 websocket
alert("连接已关闭...");
};
} else{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
Статья впервые опубликована
Если вы хотите прочитать больше качественных статей или вам нужен исходный файл ментальной карты в статье, вы можете подписаться на меня.блог на гитхабе, добро пожаловать звезда✨.
Рекомендую всем использоватьFundebug, очень полезный инструмент для мониторинга ОШИБОК~
Если в тексте есть ошибки, исправьте их в комментариях, спасибо за прочтение.
Подписавшись на официальную учетную запись, ответьте на [Добавить группу], чтобы включить вас в высококачественную группу внешнего интерфейса.