рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд░

рдЫрд╡рд┐

рдореИрдВ рдПрдХ рдЧреИрд░-рдореБрдЦреНрдп рд╢рд┐рдХреНрд╖рд╛ рдФрд░ ~ 10 рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдореИрдВрдиреЗ рд╡реЗрдм рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА, рдЙрдирдХреЗ рд╡рд░рд┐рд╖реНрдареЛрдВ рдХреЛред рдореБрдЭреЗ рдпрд╣ рдиреМрдХрд░реА рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВ рдмрд┐рдирд╛ рдореБрд╕реНрдХреБрд░рд╛рдП рдХрд░рддрд╛ рд╣реВрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд░ рд╣реИред рд╢реБрд░реВ рд╕реЗ рд╣реА - рдЬрдм рдпрд╣ рдЕрдЬрд╛рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХрднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ - рдФрд░ рдЕрдм рддрдХ - рдЬрдм рдпрд╣ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдХрдИ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ, рдмрд╣реБрдд рдЕрдзрд┐рдХ - рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдпрджрд┐ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдПрдХ рдЫреЛрдЯреА рд╕реА рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реА рд╣реИ, jQuery рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╢рд┐рдХрд╛рдпрддреЗрдВ, $ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдгред рдкрд╕рдВрджреАрджрд╛, рдЬрдЧрд╣ рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд▓рд╛рдЧреВ рдкреИрдЯрд░реНрди рдФрд░ рдПрдХ рдЕрдЬреАрдм рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреБрд╕реНрддрдХ рдХрд╛ рд▓рд┐рдВрдХред





рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдХрд╛рд░реНрдп рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рдмреЗрд╢рдХ, AJAX, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрд░реЙрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ред рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдЯреНрд░рд┐рдХреНрд╕ (iframe рдореЗрдВ рдПрдХ-рд▓рд╛ рд╕рдмрдорд┐рдЯ рдлреЙрд░реНрдо) рд╣рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдФрд░ рдирдП (xhr.send) рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдорд╛рдирдХреАрдХрд░рдг рдХреА рдПрдХ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдЕрдЪрд╛рдирдХ рдореГрддреНрдпреБ рд╣реЛ рдЧрдИ , рдЬрд┐рд╕рд╕реЗ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд░реЗрдЧреАред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп Drag'n'Drop рд╣реИред рдЕрднреА рднреА input'a рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ?

рдорд╛рд░реНрдЧ рд╕рдВрдЦреНрдпрд╛ 1, Google- рд╕рдВрдЪрд╛рд▓рд┐рдд-рд╡рд┐рдХрд╛рд╕


Shustrenko google рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп jQuery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдордп рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╣реА рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рд╕реНрд╡рд░реВрдкрд┐рдд рдбреЛрдо рдХреЛ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдм рдХреЗ рдмрд╛рдж, рд╡рд╣рд╛рдБ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде DOM (рдпрд╛ рдпрд╣рд╛рдБ рддрдХ рдХрд┐ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рд╕рд╣реА?), рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдкрдЪрд╛рдк рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддрд╛ рд╣реИ ("рд╣рд╛рдБ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдирд░рдХ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ!"), рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рджрд▓реЛрдВ ("рдареАрдХ рд╣реИ, рд╣рд╛рдБ, рд╣рдордиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦреЗрдВ рдХрд┐ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рддрд░рдл рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЪрд┐рдк рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рд╣реБрдИ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдкрд░ рд╣реИ?")ред рдФрд░ рд╕рдм рдХреБрдЫ рд╕реБрдкрд░ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рджрд┐рди рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рджреЗрдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ ... рдкрд╣рд▓рд╛ рдирд┐рдЧрд▓ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рд╕реЗ рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛ - рдХреБрдЫ рджрд┐рд╡рд╛ рдирд┐рдХрд▓ рдЧрдпрд╛ (рдХрд┐рд╕реА рдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдмрдирд╛рдпрд╛, рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ)ред рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдЗрд╕ div рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓реНрдХрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рд╢реИрд▓реА, рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рд░рд┐рдкреНрд░реЛрдЪ рдХреЛ рдкрдЪрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХреЗ рдЖрдЧрдорди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрджреНрднреБрдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдорд╛рдирдХреЛрдВ рдХреЗ рдХрд╛рд░рдг, рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ XX рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд░реВрдк рдореЗрдВ (рдФрд░ рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди!) рдХрд╛рд░реНрдп, рдкреНрд░рдЧрддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ! рд╣реЙрд░рд░ред рдЖрдк рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рдирд░рдХ рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ ("рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?") рдФрд░ рдПрдХ рд╡рд┐рдЬрдпреА рдирдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдЖрдк рдЬрдмрдбрд╝реЗ рдореЗрдВ рд╣реБрдХ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ: "рддреЛ, рдЗрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ Vkontakte рдЕрдкрд▓реЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!" рдФрд░ рдмрд╕ рдЙрд╕ рдкрд▓ рдореЗрдВ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЕрдкрд░рд╛рдзреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд░рддреЗ рд╣реИрдВ - рдЖрдк рдЗрд╕ рдЕрджреНрднреБрдд рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред (рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд▓рдЧрдЗрди рдЯреНрд░реИрдХрд░ рдореЗрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрджреЗрд╢ рдвреВрдВрдвреЗрдВ рдФрд░, рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдмреИрд╕рд╛рдЦреА рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдПред рдЖрдк рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗ - рдХрднреА-рдХрднреА рдЕрдЪреНрдЫрд╛, рдХрднреА-рдХрднреА ... рдЕрд▓рдЧред рдЖрдк рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ jQuery рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдорд┐рд▓рд╛, рдЙрдирдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рд╕рдордп рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЪреБрдирд╛?

рдФрд░ рдлрд┐рд░ рднреА - рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдкреНрд▓рдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рдХреЗрд╡рд▓ рдорд┐рдирд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдХрд╣реАрдВ рднреА рди рдЫреЛрдбрд╝реЗрдВред

рд╕рд╛рд░рд╛рдВрд╢: рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрд░рд┐рдЪрд┐рдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рдпрд╛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдФрд░ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЗ рдмрджрд▓рд╛ / рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдПред рдпрд╛ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреМрд╢рд▓ рдореЗрдВ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВред



рдкрде рд╕рдВрдЦреНрдпрд╛ 2, рдРрддрд┐рд╣рд╛рд╕рд┐рдХ


рд╣рд╛! рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдерд╛ред рдбрдЪ (рдпреВрдирд╛рдиреА, рдСрд╕реНрдЯреНрд░реЗрд▓рд┐рдпрд╛рдИ, рдлрд╛рд░рд╕рд┐рдпреЛрдВ ...) рдХреЗ рд▓рд┐рдПред рдЕрднреА рднреА рд╣рд░реЗ рдЕрдВрдбрд╛рдХрд╛рд░ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдереАред рд╣рдо рдкреБрд░рд╛рдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдПрдХ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░, рдмрд░реНрди-рдЖрдЙрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдЕрдиреНрдп 100500 рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрд╕реЗ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ) рдЦреЛрд▓рддреЗ рд╣реИрдВред рджреЗрдЦрд╛ рдЕрдкрд▓реЛрдбрд░, рдзреВрдореНрд░рдкрд╛рди рдкреНрд░рдХрд╛рд░ред рдФрд░ рд╡рд╣рд╛рдБ ... рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ - рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред рджреВрд╕рд░реЗ, рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рдлреНрд▓реИрд╢ рдЖрдХрд╛рд░ред рддреАрд╕рд░рд╛, рдпрд╣ рд╕рдмрд╕реЗ рдпрд╛рджрдЧрд╛рд░ рдЕрдВрдбрд╛рдХрд╛рд░ (рдбрд┐рдЬрд╛рдЗрдирд░ рдореИрд▓ рд╣реИ!) рдкреНрд░рдЧрддрд┐ рдХреЛ рдЕрдкрд▓реЛрдбрд░ рдХреЛрдб рдореЗрдВ рд╣реА рд╣рд╛рд░реНрдб-рд╡рд╛рдпрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреМрдерд╛, рдкрд╛рдБрдЪрд╡рд╛рдБ рдЖрджрд┐ред рдкреНрд▓рд╕ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ред рдЖрдирдВрдж рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ - рдмрд░реНрдл рднреА рдирд╣реАрдВред рдЖрдзреБрдирд┐рдХ рддрдХрдиреАрдХ рдХреА рдкрд╣рд╛рдбрд╝ рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдкрд░ рдЙрдбрд╝рд╛рди рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп - рдПрдХ рдЖрдзрд╛ рд╕рд╛рд▓ рдХрд╛ рд░реЛрд▓рдмреИрдХред

рд╕рд╛рд░рд╛рдВрд╢: рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдПрдХ рдЧреБрд░реБ рдереЗ рдФрд░ рдХреЗрд╡рд▓ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдХреЛрдб рджрд┐рдпрд╛ рдерд╛, рддреЛ рдЕрдм рдЖрдк рд╡реИрд╕реЗ рднреА рдХреВрд▓рд░ рд╣реИрдВред



рдкрде рд╕рдВрдЦреНрдпрд╛ 3, рдкреНрд░рдХрд▓реНрдкрд┐рдд


рддреЛ, рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рд╕рдкрдирд╛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? (рдмреАрдпрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкрдбрд╝реЛрд╕реА рдФрд░ рдПрдХ рдмрд┐рд▓реНрд▓реА)ред рдХрдо рд╕реЗ рдХрдо - рд╣рдо рдПрдХ рдЕрдкрд▓реЛрдбрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрддрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЗрд╕реЗ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдЕрдЧрд▓реЗ рдореЗрдВ рдЪрд┐рдкрдХрд╛ рджреЗрдВред рд╡реИрд╕реЗ, рдЗрдЪреНрдЫрд╛, рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдЫреЛрдЯреА рдкреБрд╕реНрддрдХ - рдПрд░рд┐рдХ рдФрд░ рдПрд▓рд┐рдЬрд╛рдмреЗрде рдлреНрд░рд┐рдореЗрдиреЛрд╡ рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред рдЬреА рдирд╣реАрдВ, рдпрд╣ рдЧреИрдВрдЧ рдСрдл рдлреЛрд░ рдж рдЧреИрдВрдЧ рдСрдл рдж рдСрд▓ рджреИрдЯ рд░реАрдб рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдиреНрдп рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрддрдирд╛ рдордЬрдмреВрдд рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиред рдкрд╣рд▓реЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рдкрд╛рдардХ рдХреЗ рд╕рд┐рд░ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╕рдмрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдкрд╣рд▓реВ рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рди рдХреЗрд╡рд▓, рдмрд▓реНрдХрд┐ рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ)ред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рддреЛ рд╣рдордиреЗ jQuery рдкреНрд▓рдЧрдЗрди рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рдХреБрдЫ рдкреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдУрдУрдкреА-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ - рддреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рджреЗрдВ) рдФрд░ рдЕрдкрд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ - рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХрдИ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рдмрд╣реБрдд рд╕рд░рд▓:



Uploader = senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)-> stream = false $.each @senders, (i, func)=> if stream = func(options) false stream
      
      







2 рд╢рдмреНрджреЛрдВ рдореЗрдВ - рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рди рд╣реИ!), рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣рдж рддрдХ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рддрд╛рд▓рдореЗрд▓ рджреЗрдВрдЧреЗ) рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЧреИрд░-рд░рд┐рдХреНрдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдЬреЛ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛, рд╡рд╣ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЖрд▓рд╕реА рд╣реИред) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ "рдореВрд▓реНрдпрд╡рд╛рди" рдлрд╝рдВрдХреНрд╢рди рд╕рд░рдгреА рдореЗрдВ рдкрд╣рд▓реЗ рд╣реИрдВ, рдФрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдлрд▓-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рд╡рд╣реА рд╕рдмрдорд┐рдЯ-рдлреЙрд░реНрдо-рдЗрдлреНрд░реЗрдо рд╡рд┐рдзрд┐)ред рд╣рд╛рдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ - рдлрд┐рд░ рдЕрдкрд▓реЛрдбрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╣рдо рдЙрди рд╕рднреА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ (рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред рдЙрдиреНрд╣реЛрдВрдиреЗ $ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рдж рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗред

рдЕрдм рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ:

- рдХреЛрдб jQuery рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦрдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ "рд╕реБрд╡рд┐рдзрд╛рдУрдВ" рдХреЗ рдХрд╛рд░рдг, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд░реНрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╣реБрдд рдХрд╕рдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

- рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдб рдПрдХ рдЕрджреНрднреБрдд рдкреНрд▓рдЧрдЗрди рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ рдФрд░ рдмреЛрд▓рд╛: "рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВ рддрд░реНрдХ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?"

- рдлрд┐рд▓рд╣рд╛рд▓ рдХреЛрдб рдХрд╛ рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдПрдХ рдЪрд┐рддреНрд░рдг рд╣реИред



рдЕрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:



  iframe = (options)-> return false unless options.input && options.input.value id = 'frame' + Math.random() $form = $ '<form>', method: options.method, enctype:'multipart/form-data', target: id, action: options.url $('<iframe>', name: id ).appendTo($form).on 'load', -> try response = @contents() throw new Error unless response.length && response[0].firstChild dfd.resolve response, name: options.input.value catch e dfd.reject response, name: options.input.value $form.hide().appendTo('body').submit() (dfd = $.Deferred()).promise()
      
      







рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реА рд╡рд╣реА рдЕрдкрдЯрд╛рдЗрдо рд╕реБрд╡рд┐рдзрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдПрдХ рдлреЙрд░реНрдо рдмрдирд╛рдПрдБ, iframe рдкрд░ рд▓рдХреНрд╖реНрдп рдХрд░реЗрдВ, рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред рд╣рдо рдЖрд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдпрд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╕реНрдердЧрд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдмрд╛рд╣рд░реА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрд╕реНрдердЧрд┐рдд рдХрд╛ рдореЗрд░рд╛ рд╡рд┐рд╡рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ - рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдж рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреБрдЫ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдм рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ ред



  formDataFile = (options)-> return false unless options.files && options.files.length && window.FormData $.when.apply $, options.files.map (f)-> formData = new FormData() formData.append options.name, f xhr = new XMLHttpRequest() dfd = $.Deferred() xhr.onload = xhr.onerror = ->dfd[@status == 200 && 'resolve' || 'reject'] @response, file if xhr.upload xhr.upload.onprogress = (e)->dfd.notify e, file xhr.open options.method, options.url, true xhr.responseType = 'text' xhr.send formData dfd.promise()
      
      







рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рджреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП (рдЬрд╣рд╛рдБ рд╡рд┐рдХрд▓реНрдк рдереЗред рдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдП рдФрд░ рдЙрд╕рдореЗрдВ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИ) рд╣рдо рдПрдХ рдЕрд▓рдЧ XMLHttpRequest рдФрд░ deferred рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрд╕реНрдердЧрд┐рдд, рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдпрд╛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЕрд╕рдлрд▓-рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдорд╛рдзрд╛рди / рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ рддреЛ рдЕрдкрд▓реЛрдб рдкреНрд░рдЧрддрд┐ (xhr.upload.onprogress = (e) -> dfd.notify e, file) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдбреЗрдЯрд╛ рднреЗрдЬреЗрдЧрд╛ред рдЖрд╕реНрдердЧрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдЙрдкрдпреЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдкрдврд╝реВрдВрдЧрд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпреЛрдВред



рдЫреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рд▓ рджрд┐рдпрд╛
рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЗрди рд╣реИрдВрдбрд▓рд░ рдХреА рдХреЙрд▓ рд╕реЗ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕реНрдердЧрд┐рдд рдПрдХ рддрдВрддреНрд░ рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ ajax рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рд╕рдмрд╕реЗ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреВрдВрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛:



  $.get('/some/url/for/ajax', function(){ alert('got response'); }, function(){ alert('got error'); })
      
      







рдЕрдм рдЗрд╕ рддрд░рд╣:



  var request = $.get('/some/url/for/ajax'); request.done(function(){ alert('got response'); }); request.fail(function(){ alert('got error'); })
      
      







рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд┐рд╕ рд╕рдордп рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рдЖрдк рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ (рдХреЙрд▓ рдХреЛ $ .get рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛)ред рдЕрдм рдирд╣реАрдВред рдЖрдк рдЕрдиреБрд░реЛрдз рдЪрд░ рдкрд░ рднреА рд▓рдЯрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрд╕реНрдердЧрд┐рдд-рд╡рд╕реНрддреБ рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА) рд╣реИрдВрдбрд▓рд░

рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ред рд╕рдЪ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╣реИрдВрдбрд▓рд░ рдХреА рддрддреНрдХрд╛рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд░реНрдб рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ ("рдХрдВрдЬреНрдпреВрдорд░") рдкрдХреНрд╖ рд╣реИ - рд╣рдо $ .get рд╡рд┐рдзрд┐ рд╕реЗ рдЖрд╕реНрдердЧрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рд░рд╛рдЬреНрдп рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм "рдбрд╛рд░реНрдХ" рдкрдХреНрд╖, jQuery рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:



  var def = $.Deferred(); def.done(function(){ // ""  ("")   ""  deferred- console.log('done1', arguments) }); //     def.resolve('param12');//   ""  deferred     done-,      'param12' //   -  ['done1', Arguments['param12']] def.done(function(){ // ""  ("")   ""  deferred- console.log('done2', arguments) }); //    //   -  ['done2', Arguments['param12']]
      
      







рд╣рдореЗрдВ рдХреБрдЫ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдорд┐рд▓рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ 'рд╕реЙрд▓реНрд╡' рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╣рд▓реЗ рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЕрд╕рдлрд▓рддрд╛ рдХреА рджреВрд╕рд░реА рдЬреЛрдбрд╝реА - рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрд╕реА рддрд░рд╣ рд╕реЗ 'рдЕрд╕реНрд╡реАрдХреГрдд' рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ

рдкреНрд░рдЧрддрд┐ рдХреА рддреАрд╕рд░реА рдЬреЛрдбрд╝реА - рдЕрдзрд┐рд╕реВрдЪрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╕реВрдЪрдирд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдкреНрд░рдЧрддрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред



рд╡рд╛рджрд╛ () рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдЪреАрдЬ рднреА рд╣реИред рдЖрдк рдХреЗ рд▓рд┐рдП "рдЦрддрдирд╛" рдЖрд╕реНрдердЧрд┐рдд рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рд╣реИрдВрдбрд▓рд░ рдЙрд╕ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд┐рдпрд╛, рд╡рд┐рдлрд▓, рдкреНрд░рдЧрддрд┐), рд▓реЗрдХрд┐рди рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рд╡рд╣ $ рд╣реИред рдЖрдк рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред рдФрд░ рдареАрдХ рд╣реА рддреЛ - рдЖрдкрдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?



рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, $ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реМрджрд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрд╕реНрдердЧрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ "рд╕рдВрдШ" рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



  var def = $.when(a, b, c ....); //  "" deferred def.done(function(){ alert('resolved'); //   1 , ,     deferred  resolve }); def.fail(function(){ alert('got error'); //   1 ,        deferred  reject }) def.progress(function(){ alert('some error'); //  ,        deferred  notify })
      
      







рдпрджрд┐ рдЖрдк $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдордЧреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ a.resolve (1) рдФрд░ b.resolve (2) рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рддреЛ рд╕рдордЧреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ 1, 2 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдЖрдк рдмреЗрд▓рд╛ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред



рд▓реЗрдХрд┐рди Deferred рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ - рдпрд╣рд╛рдБ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣рд╛рдБ ред







рдмрд╣реБрдд рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ, рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрдИ рдмрд╛рд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░), рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдВрд╕рд░ (рд╕реНрдердЧрд┐рдд) рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдЗрди рд╕реЗрдВрд╕рд░ рд╕реЗ рд╕рдВрдХреЗрддрдХ (рд╡рд╛рджрд╛) рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди-рдЪреИрдирд▓ рд╕реЗрдВрд╕рд░ рдФрд░ рд╕рдВрдХреЗрддрдХ рд╣реИрдВред



рдПрдХ рдЕрдиреБрднрд╡реА рдЪреМрдХрд╕ рдкрд╛рдардХ рдХреЛ рдкрд╣рд▓реЗ рд╣реА тАЬрдмрд╛тАЭ рдХрд╛ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рддреЛ рдпрд╣ рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ! тАЭрдФрд░ рд╣рд╛рдБ, рдпрд╣ 100% рд╕рд╣реА рд╣реЛрдЧрд╛ (рдЬреЗрдПрд╕ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП)ред рд╕реНрдХреЗрдкреНрдЯрд┐рдХреНрд╕ рдиреЗ рдЕрдкрдиреЗ рд╣реЛрдВрдареЛрдВ, рдкреИрдЯрд░реНрди рдХреЛ js рдореЗрдВ рд╕реНрдХреНрд╡реАрд╢рд▓реАрд╢ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдиреГрддреНрдп рдХрд░рдирд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрдирд╛, рд╣рдо рд▓рдЧрднрдЧ рдЕрдкрдиреЗ рдЖрдк рд╣реА рдкреИрдЯрд░реНрди рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред ред



рдпрджрд┐ рд╡реЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрдЪрд╛ рд╣реА рдХреНрдпрд╛ рд╣реИ? рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдХрд╛рдо рднреА рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдиреБрдорд╛рди рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ) - рдмрд╕ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдкрд╛рдардХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдп рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдЙрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╣реА рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдЕрдкрд▓реЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВред рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:



 Uploader = _responsibilityChain: (options, chain, name = false)-> stream = false $.each chain, (i, func)=> if stream = func(options) #        Uploader #          @[name] = func if name false stream readers: [entry, file, input] read: (options)->@_responsibilityChain options, @readers, 'read' senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)->@_responsibilityChain options, @senders, 'send'
      
      







рддрдВрддреНрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдкрд▓реЛрдбрд░ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЖрд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрд▓реЛрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ (рдкрдврд╝реЗрдВ рдпрд╛ рднреЗрдЬреЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрдм рдкрдврд╝реЗ рдЧрдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реНрд╡рдпрдВ рджреЗрдЦреЗрдВ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрди рдХреЛрдб рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░)ред



 #     input = (options)-> return false unless options.input.value $.Deferred().resolve([]).promise() #    -      input #         , Deferred      3-  file = (options)-> files = $.makeArray $(options.input).prop 'files' return false unless files.length if (files[0].name == undefined && files[0].fileName) # File normalization for Safari 4 and Firefox 3: $.each files, (index, file)-> file.name = file.fileName; file.size = file.fileSize; $.Deferred().resolve(files).promise() #   -reader.    . , ..  #  Deferred.    ,    entry = (options)-> roots = $(options.input).prop('webkitEntries') || $(options.input).prop('entries') return false unless roots && roots.length > 0 readEntries = (entries, path='')-> $.when.apply($, $.map entries, (entry)-> dfd = $.Deferred() errorHandler = (e)-> e.entry = entry if e && !e.entry # Since $.when returns immediately if one # Deferred is rejected, we use resolve instead. # This allows valid files and invalid items # to be returned together in one set: dfd.resolve [e] resolveHandler = (file)-> # Workaround for Chrome bug #149735 file.relativePath = path dfd.resolve file if entry.isFile entry._file && resolveHandler(entry._file) || entry.file resolveHandler, errorHandler else if entry.isDirectory entry.createReader().readEntries((entries)-> readEntries(entries, path + entry.name + '/' ).done((files)->dfd.resolve files ).fail(errorHandler) , errorHandler) else # Return an empy list for file system items other than files or directories: dfd.resolve([]); dfd.promise() #we do need this pipe here bc we do resolve some files scoped ).pipe -> Array.prototype.concat.apply [],arguments readEntries(roots).promise()
      
      







рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдЗрдирдкреБрдЯ рдХреЛ рдмрд▓рд╛рддреНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд░реАрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╢рд╛рдВрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдПрдХ рдЪреМрдХрд╕ рдФрд░ рдЕрдиреБрднрд╡реА рдкрд╛рдардХ рдХреЛ рдпрд╣рд╛рдБ рдХрд╣реАрдВ рдФрд░ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: "рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ!"ред рдФрд░ рдлрд┐рд░, рдпрд╣ 100% рд╕рд╣реА рд╣реЛрдЧрд╛ред рдЕрдВрджрд░ рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИред рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рднреА рдкреНрд░реЗрд╖рдХреЛрдВ рдХреЛ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдирдкреБрдЯ рд░реАрдбрд░ рдХреЗ рдмрд╛рдж, xhrFile рдкреНрд░реЗрд╖рдХ рдирд╣реАрдВ рднреЗрдЬ рдкрд╛рдПрдЧрд╛)ред рдЦреИрд░, рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдмрд╛рдиреАред рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрдкрдпреБрдХреНрдд рдкреНрд░реЗрд╖рдХреЛрдВ рдХреЗ рдЭреВрдареЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдкреНрд░реЗрд╖рдХ рдХреЗ рдЕрдВрджрд░ рдЗрдирдкреБрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдПрдХ рдмрд░реНрдл рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЖрдк рднреВрд▓ рдЧрдП рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рдбреНрд░реИрдЧ'рдПрди'рдбреНрд░реЙрдк рдХрд░реЗрдВрдЧреЗ? рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ, рдЕрдЪрд╛рдирдХ рдПрдХ рдЪрдорддреНрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдордЭрджрд╛рд░ рд╕рд▓рд╛рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ?



рдПрдХ рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдЗрдирдкреБрдЯ рд░реАрдбрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЛрдмрд░-рдЕрдк рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ, рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ Uploader.read рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ - рдмрджрд╕реВрд░рдд, рд▓реЗрдХрд┐рди рд╡рд░реНрджреАред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╣рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рднреЗрдЬрдиреЗ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣рдорд╛рд░реЗ рдЕрдкрд▓реЛрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдбрд╛рд▓реЗрдВ:

 Uploader: #...  ,      upload: (options)-> options = $.extend method: 'POST' name: options.input && options.input.name , options @read(options).then (files)=>$.when.apply $, @send $.extend options, files:files
      
      







рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЗрдирдкреБрдЯ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ Uploader.send рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЗрд╖рд┐рдд рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрд╕реНрдердЧрд┐рдд рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рд╕рдореВрд╣реАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред



рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

  $('#some-file-input').change -> Uploader.upload(input: this, url: '/files/upload' ) .done -> #         alert "#{arguments.length} files uploaded" .fail -> #          alert "Some files were not uploaded" .progress -> #      (~ 50 ),    console.log arguments
      
      







рд╕рд╛рд░рд╛рдВрд╢




рд╕рдВрдкреВрд░реНрдг рдЕрдкрд▓реЛрдбрд░
 Senders = _makeForm: (options)-> $('<form>', method: options.method, enctype:'multipart/form-data' ).append(options.input.clone()) _sendData: (options, data, file)-> xhr = new XMLHttpRequest() dfd = $.Deferred() xhr.onload = xhr.onerror = ->dfd[@status == 200 && 'resolve' || 'reject'] @response, file if xhr.upload xhr.upload.onprogress = (e)->dfd.notify e, file else options.no_progress = true xhr.open options.method, options.url + '?name=' + (options.file_name || file.name), true xhr.responseType = 'text' xhr.send data dfd.promise() iframe: (options)-> return false unless options.input && options.input.value options.no_progress = true id = 'frame' + Math.random() $form = Senders._makeForm(options).attr target: id, action: options.url $('<iframe>', name: id ).appendTo($form).on 'load', -> try response = @contents() throw new Error unless response.length && response[0].firstChild dfd.resolve response, name: options.input.value catch e dfd.reject response, name: options.input.value $form.submit() (dfd = $.Deferred()).promise() formDataForm: (options) -> return false unless options.input && options.input.value && window.FormData form = options.input.form || Senders._makeForm(options).get 0 Senders._sendData options, new FormData(form), name: options.input.value formDataFile: (options)-> return false unless options.files && options.files.length && window.FormData options.files.map (f)-> formData = new FormData() formData.append options.name, f Senders._sendData $.extend(options, file_name:f.name), formData, f xhrFile : (options)-> return false unless options.files && options.files.length && window.ProgressEvent && window.FileReader $.map options.files, (file)-> Senders._sendData options, file, file Readers = input: (options)-> return false unless options.input.value $.Deferred().resolve([]).promise() file: (options)-> files = $.makeArray $(options.input).prop 'files' return false unless files.length if (files[0].name == undefined && files[0].fileName) # File normalization for Safari 4 and Firefox 3: $.each files, (index, file)-> file.name = file.fileName; file.size = file.fileSize; $.Deferred().resolve(files).promise() entry: (options)-> roots = $(options.input).prop('webkitEntries') || $(options.input).prop('entries') return false unless roots && roots.length > 0 readEntries = (entries, path='')-> $.when.apply($, $.map entries, (entry)-> dfd = $.Deferred() errorHandler = (e)-> e.entry = entry if e && !e.entry # Since $.when returns immediately if one # Deferred is rejected, we use resolve instead. # This allows valid files and invalid items # to be returned together in one set: dfd.resolve [e] resolveHandler = (file)-> # Workaround for Chrome bug #149735 file.relativePath = path dfd.resolve file if entry.isFile entry._file && resolveHandler(entry._file) || entry.file resolveHandler, errorHandler else if entry.isDirectory entry.createReader().readEntries((entries)-> readEntries(entries, path + entry.name + '/' ).done((files)->dfd.resolve files ).fail(errorHandler) , errorHandler) else # Return an empy list for file system items other than files or directories: dfd.resolve([]); dfd.promise() #we do need this pipe here bc we do resolve some files scoped ).pipe -> Array.prototype.concat.apply [],arguments readEntries(roots).promise() Uploader: _responsibilityChain: (options, chain, name = false)-> stream = false $.each chain, (i, func)=> if stream = func(options) #        Uploader #          @[name] = func if name false stream readers: [entry, file, input] read: (options)->@_responsibilityChain options, @readers, 'read' senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)->@_responsibilityChain options, @senders, 'send' upload: (options)-> options = $.extend method: 'POST' name: options.input && options.input.name , options @read(options).then (files)=>$.when.apply $, @send $.extend options, files:files
      
      









рдЗрдирдкреБрдЯ [рдЯрд╛рдЗрдк = рдлрд╝рд╛рдЗрд▓] рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЯреНрд░рд┐рдХ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ - рд╣рдо рдЗрдирдкреБрдЯ рдХреЛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ: рдХрдВрдЯреЗрдирд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдкрд░реЗ, рдФрд░ рдЗрд╕рдХреЗ рд▓реЗрдмрд▓ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░реЗрдВред



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛, рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдлрд╝рд╛рдЗрд▓-рдЕрдкрд▓реЛрдбрд░ рд╣реИред рдпрджрд┐ рдПрдХ рдирдпрд╛ рдЕрдкрд▓реЛрдб рддрдВрддреНрд░ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдкреНрд░реЗрд╖рдХреЛрдВ рдФрд░ рд╢рд┐рд░рд╛рдУрдВ рдХреА рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдкреЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди:

- рдПрдХ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ

- рдХреЛрдИ рдбрд╛рдЙрдирд▓реЛрдб рд░рджреНрдж рдХрд░рдиреЗ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ

- рдЧреНрд░рд╛рд╣рдХ рдХреА рдУрд░ рд╕реЗ рдЕрд╕рд╣рдЬ рдШрдЯрдирд╛рдУрдВ - рдореИрдВ рдЗрд╕ рдШрдЯрдирд╛ "рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб", "рдлрд╝рд╛рдЗрд▓ рддреНрд░реБрдЯрд┐" рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рдЧрддрд┐ рдХреА рдШрдЯрдирд╛ рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╣реИрдВ



рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ - рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрдорд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдлрд╛рдпрджреЗ)ред рдЗрд╕ рдкрд░, рдореБрдЭреЗ рдЕрдкрдиреА рдЫреБрдЯреНрдЯреА, рдмреАрдпрд░, рдмреИрд╢, рдкрдбрд╝реЛрд╕реА рд▓реЗрдиреЗ рджреЛред



рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп рдХреА рд╕реВрдЪреА:

1. jQuery- рдлрд╛рдЗрд▓-рдЕрдкрд▓реЛрдб рдкреНрд▓рдЧрдЗрди рдХреЛрдб - github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js

2. jQuery.Deferred рдкреНрд░рд▓реЗрдЦрди - api.jquery.com/category/deferred-object

3. рдкреБрд╕реНрддрдХ "рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди" рдлреНрд░реАрдореИрдиреЛрд╡ - www.ozon.ru/context/detail/id/20216992



All Articles