HTML5 рдмреНрд░рд╣реНрдорд╛рдгреНрдб рдХреЗ рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╛рдпрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ XMLHttpRequest 2 рд╣реИред рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдиреЗ рдкрд░, XHR2 HTML5 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИред XHR2 рдПрдХ рд╣реА XMLHttpRequest рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рдеред XHR2 рдЬрдЯрд┐рд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд╛рд░реЗ рдкреБрд░рд╛рдиреЗ рдорд┐рддреНрд░ XMLHttpRequest рдиреЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реИрдВред
XMLHttpRequest Level 2 рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ XMLHttpRequest рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдПрдХ рдЭрдВрдЭрд░реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рдЧрд▓ рд╣реИрдХ рдФрд░ рдиреГрддреНрдп рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧреА: рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рдЕрдиреБрд░реЛрдз, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ AJAX рдХреЛ рдирд╡реАрдирддрдо рдПрдЪрдЯреАрдПрдордПрд▓ 5 рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣реИрдХ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИрдВ:
рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдПрдкреАрдЖрдИ ,
рд╡реЗрдм рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рдФрд░ рд╡реЗрдмрдЬреАрдПрд▓ред
рдпрд╣ рд▓реЗрдЦ XMLHttpRequest рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ
рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг
XHR рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдЪрд╛рд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд╕реНрдЯрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЪрд┐рддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛:
var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true);
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк responseText рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдмреВрдБрдж рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛ рдПрдХ рдмрд╛рдЗрдирд░реА рдкрд┐рдХреНрдЪрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╣рдо XMLHttpRequest рдХреЛ рдЯреНрд░рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдХрдЪреНрдЪрд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╣реИрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рд░реВрдк рдХрд╛ рд╕рдВрдХреЗрдд
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЪрд┐рддреНрд░ рдХреЛ "рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛, рд╕рд░реНрд╡рд░ рдорд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЗрд╕реЗ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ред рдЗрд╕ рдЬрд╛рджреВ рдХреЗ рдмрдЬрд╛рдп, рдЖрдЗрдП рдирдИ XMLHttpRequest рд╕реБрд╡рд┐рдзрд╛ - responseType рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧреБрдгреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
xhr.responseTypeрдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк xhr.responseType рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: "рдкрд╛рда", "рд╕рд░рдгреАрдмрдлрд╝рд░", "рдмреВрдБрдж" рдпрд╛ "рджрд╕реНрддрд╛рд╡реЗрдЬрд╝" (рдбрд┐рдлрд╝реЙрд▓реНрдЯ "рдкрд╛рда" рд╣реИ)ред
xhr.responseрдПрдХ рд╕рдлрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ DOMTring, ArrayBuffer, Blob рдпрд╛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдореЗрдВ рдорд╛рдВрдЧреА рдЧрдИ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯрд╛рдЗрдк рд╣реЛрдЧреАред
рдЗрд╕ рдорд╣рд╛рди рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдПрдХ ArrayBuffer рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рд╣рдо BlobBuilder API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ Blob рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ:
BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder; var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) { if (this.status == 200) { var bb = new BlobBuilder(); bb.append(this.response);
рдЗрддрдирд╛ рдмреЗрд╣рддрд░!
ArrayBuffer рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЙрддреНрддрд░
ArrayBuffer рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓рд╛ рдХрдВрдЯреЗрдирд░ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрдЪреНрдЪреЗ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдмрдлрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди ArrayBuffer рдХреА рдЕрд╕рд▓реА рддрд╛рдХрдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рд╕реЗ
рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд░рдгреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдПрдХ ArrayBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ 8-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд 32-рдмрд┐рдЯ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА ArrayBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░ рдХреЛ ArrayBuffer рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рд╕реЗ 8-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИ:
var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) { var uInt8Array = new Uint8Array(this.response);
рдмреВрдБрдж рдЬрд╡рд╛рдм
рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ
Blob рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдЗрдЯ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ
xhr.responseType='blob'
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЕрдм рдХреЗрд╡рд▓ Chrome
crbug.com/52486 рдореЗрдВ ):
window.URL = window.URL || window.webkitURL; var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true); xhr.responseType = 'blob'; xhr.onload = function(e) { if (this.status == 200) { var blob = this.response; var img = document.createElement('img'); img.onload = function(e) { window.URL.revokeObjectURL(img.src);
Blob рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
indexedDB рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдмрдЪрдд,
HTML5 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд┐рдЦрдирд╛, рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ
Blob URL (
MDC ) рдмрдирд╛рдирд╛ред
рдбреЗрдЯрд╛ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ
рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ (рд╕рд░реНрд╡рд░ рдкрд░) рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред XMLHttpRequest рдиреЗ рд╣рдореЗрдВ DOMString рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (XML) рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЕрдм рдпрд╣ рдЕрддреАрдд рдореЗрдВ рд╣реИред рдЕрджреНрдпрддрди рднреЗрдЬрд╛ рдЧрдпрд╛ () рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: DOMString, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдлрд╝реЙрд░реНрдордбрд╛рдЯрд╛, рдмреВрдБрдж, рдлрд╝рд╛рдЗрд▓, ArrayBufferред рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдЗрди рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВрдЧреЗред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛: xhr.send (DOMString)
XMLHttpRequest 2 рд╕реЗ рдкрд╣рд▓реЗ: function sendText(txt) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/server', true); xhr.onload = function(e) { if (this.status == 200) { console.log(this.responseText); } }; xhr.send(txt); } sendText('test string');
XMLHttpRequest 2 рдХреЗ рдмрд╛рдж: function sendTextNew(txt) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/server', true); xhr.responseType = 'text';
рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ responseType рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк responseType рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рдореЗрд╢рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рда)ред
рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░рдирд╛: xhr.send (рдлреЙрд░реНрдордбреЗрдЯрд╛)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рдиреЗ AJAX рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
jQuery рдпрд╛ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо
рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
, рдПрдХ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕реЗ рдПрдХреНрд╕рдПрдЪрдЖрд░ 2 рд╕рдордЭрддрд╛ рд╣реИред FormData рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдордХреНрдЦреА рдкрд░ HTML рдлреЙрд░реНрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред AJAX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреЗ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
function sendForm() { var formData = new FormData(); formData.append('username', 'johndoe');
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рдкрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдкреЗрдВрдб рдкрджреНрдзрддрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдФрд░ рдЖрдкрдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред FormData рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреГрд╖реНрда рдкрд░ рдореМрдЬреВрджрд╛ HTMLFormElement рддрддреНрд╡реЛрдВ рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
<form id="myform" name="myform" action="/server"> <input type="text" name="username" value="johndoe"> <input type="number" name="id" value="123456"> <input type="submit" onclick="return sendForm(this.form);"> </form>
function sendForm(form) { var formData = new FormData(form);
HTML рдлрд╝реЙрд░реНрдо рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (
<input type="file">
) - рдлрд╝реЙрд░реНрдордбреЗрдЯ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдлрд╝рд╛рдЗрд▓ (рдУрдВ) рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░
send()
рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХ
multipart/form-data
рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ!
function uploadFiles(url, files) { var formData = new FormData(); for (var i = 0, file; file = files[i]; ++i) { formData.append(file.name, file); } var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.onload = function(e) { }; xhr.send(formData);
рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдирд╛ рдпрд╛ рдмреНрд▓реЙрдм рдХрд░рдирд╛: xhr.send (Blob)
XHR2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдлрд╛рдЗрд▓ рдпрд╛ рдмреНрд▓реЙрдм рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмреНрд▓реЙрдм рд╣реИрдВред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо BlobBuilder API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдирдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕ Blob рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреЛрдб рдПрдХ рд╣реИрдВрдбрд▓рд░ рднреА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ (рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА HTML5 рд╕реБрд╡рд┐рдзрд╛):
<progress min="0" max="100" value="0">0% complete</progress>
function upload(blobOrFile) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/server', true); xhr.onload = function(e) { };
рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрдЯ рднреЗрдЬреЗрдВ: xhr.send (ArrayBuffer)
рд╣рдо ArrayBuffers рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ
function sendArrayBuffer() { var xhr = new XMLHttpRequest(); xhr.open('POST', '/server', true); xhr.onload = function(e) { }; var uInt8Array = new Uint8Array([1, 2, 3]);
рдХреНрд░реЙрд╕ рдУрд░рд┐рдЬрд┐рдирд▓ рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ (рдХреЛрд░)
CORS рдПрдХ рдбреЛрдореЗрди рдкрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП AJAX рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ! рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрд╡рдпрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рднреЗрдЬреЗрдЧрд╛ред
рдХреЛрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди
example.com
рдкрд░ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
www.example2.com
www.example2.com
рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ AJAX рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ "рдореВрд▓ рдмреЗрдореЗрд▓" рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдХреЛрд░ рдХреЗ рд╕рд╛рде
www.example2.com
www.example2.com
рдХреЗрд╡рд▓ рдПрдХ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдЬреЛрдбрд╝рдХрд░ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
example.com
рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
Access-Control-Allow-Origin: http:
Access-Control-Allow-Origin
рд╣реЗрдбрд░ рдПрдХ рд╕рд╛рдЗрдЯ рдпрд╛ рдХрд┐рд╕реА рднреА рдбреЛрдореЗрди рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Access-Control-Allow-Origin: *
Html5rocks.com рдкрд░ рдХрд┐рд╕реА рднреА рдкреЗрдЬ рдкрд░ CORS рд╕рдХреНрд╖рдо рд╣реИред рдпрджрд┐ рдЖрдк рдбрд┐рдмрдЧрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд╢реАрд░реНрд╖рд▓реЗрдЦ
Access-Control-Allow-Origin
рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рдХреНрд╡реЗрд░реА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рд╡рд┐рд╡рд░рдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдХреГрдкрдпрд╛
CORS рд╕рдХреНрд╖рдо рдХрд░реЗрдВ !
рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рдЕрдиреБрд░реЛрдз рдмрдирд╛рдирд╛
рдпрджрд┐ рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрди CORS рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рдЕрдиреБрд░реЛрдз рдмрдирд╛рдирд╛ рдирд┐рдпрдорд┐рдд XMLHttpRequest рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░
example.com
рдкрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
www.example2.com
www.example2.com
:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://www.example2.com/hello.json'); xhr.onload = function(e) { var data = JSON.parse(this.response); } xhr.send();
рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ рдФрд░ рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ, рд╡рд┐рдВрдбреЛ.рдирд╛рдо, рдбреЙрдХреНрдпреВрдореЗрдВрдЯ.рдбреЛрдореЗрди, рд╕рд░реНрд╡рд░ рдкреНрд░реЙрдХреНрд╕рд┐рд╕ рдФрд░
рддрд░реАрдХреЛрдВ рдХреЗ рдЕрдиреНрдп
рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдиреГрддреНрдп рдХреЗ рд╕рд╛рде рдХреЛрдИ рдиреГрддреНрдп рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
HTML5 рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд┐рддреНрд░реЛрдВ рдХреА рдПрдХ рдЧреИрд▓рд░реА рд╣реИ рдФрд░ рд╣рдо
рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХрдИ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; function onError(e) { console.log('Error', e); } var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true); xhr.responseType = 'arraybuffer';
рдЪреЗрддрд╛рд╡рдиреА: рджреЗрдЦреЗрдВ
рдХрд┐ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлрд╝рд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдо рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВрднрд╛рдЧреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдирд╛
рдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдПрдХ рдмрдбрд╝реА рдлрд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдмрдбрд╝реА рдлрд╛рдЗрд▓ рдХреЛ рдХрдИ рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рд░ рдПрдХ рдХреЛ рдПрдХреНрд╕рдПрдЪрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдореЗрдВ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕реА рддрд░рд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ GMail рдмрдбрд╝реЗ рдЕрдЯреИрдЪрдореЗрдВрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ Google рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЬрди рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - 32MB рдкреНрд░рддрд┐ http рдЕрдиреБрд░реЛрдзред
window.BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder; function upload(blobOrFile) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/server', true); xhr.onload = function(e) { }; xhr.send(blobOrFile); } document.querySelector('input[type="file"]').addEventListener('change', function(e) { var blob = this.files[0]; const BYTES_PER_CHUNK = 1024 * 1024;
рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рдХрд░рддрд╛ - рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рд╕рдВрджрд░реНрдн
1.
XMLHttpRequest рд╕реНрддрд░ 2 рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
2.
рдХреНрд░реЙрд╕ рдУрд░рд┐рдЬрд┐рдирд▓ рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ (рдХреЛрд░) рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
3.
рдлрд╝рд╛рдЗрд▓ рдПрдкреАрдЖрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢
4.
рдлрд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдо рдПрдкреАрдЖрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢