HTML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрди

рдЬрдм рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреГрд╖реНрда рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧреНрд░рд╛рдлрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЕрдХреНрд╕рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдмрд╣рд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реА рдкрд╕рдВрдж рд╕рд╛рджреЗ HTML рд╕реЗ (рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛) рдПрдореНрдмреЗрдбреЗрдб рдПрд╕рд╡реАрдЬреА рдпрд╛ рдПрдХ рдлреНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреИрд▓реА рд╣реБрдИ рд╣реИред

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

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


рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреЗрдЬ рдкрд░ рд╣реИред



рдПрдХ HTML рдкреГрд╖реНрда, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ, рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдорд╛рд░реНрдХрдЕрдк рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдореЗрдВ рд╣реА рд╕рднреА рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред 'рдбреЗрдЯрд╛' рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рд▓рдЧрднрдЧ рд╣рд░ рдЪреАрдЬ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдкреГрд╖реНрда рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗ рд╕рдХреЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ "рдЬреИрд╕рд╛ рд╣реИ" рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╕рдордп рдлрд╛рдпрджреЗ рднреА рд╣реЛрддреЗ рд╣реИрдВ: рдЖрдк "рдЬреИрд╕рд╛ рд╣реИ" рдЯреБрдХрдбрд╝рд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕рдПрдордПрд▓рдЯреА рд╕реЗ рдЧреБрдЬрд░рдХрд░ рдПрдХреНрд╕рдПрдордПрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ "рдореВрд▓" рд╡реЗрдм рдлрд╝реЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдкреНрдд рдкреГрд╖реНрда рд╣реИ; рдпрд╣ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╢реЗрд▓реНрдл рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЦрд░реАрджрд╛рд░реА рдХреА рдЯреЛрдХрд░реА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

<ul id="store-shelf"> <li data-article="apple">Apple</li> <li data-article="milk">Milk</li> <li data-article="cacke">Cacke</li> <li data-topping="cherry" data-topping-article="cacke">Cherry Topping</li> <li data-topping="cream" data-topping-article="cacke">Cream Topping</li> </ul> <ul id="shop-cart"></ul> <input name="reset" type="button" value="Reset"/> <input name="submit" type="button" value="Submit"/> 


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

рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ



рдереЛрдбрд╝рд╛ jQuery рдпреВрдЖрдИ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╢реЗрд▓реНрдл рд╕реЗ рдЯреЛрдХрд░реА рддрдХ рдЖрдЗрдЯрдо рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

 $("#shop-cart").droppable({ accept: 'li[data-article]', activeClass: 'active', hoverClass: 'hover', drop: shopCartDropHandler }); $('#store-shelf li').draggable({ cursor: 'pointer', revert: true, stack: 'li' }); function shopCartDropHandler(event, ui) { var clone, counter, $this = $(this), article = ui.draggable.attr('data-article'), existingGoods = $this.children('[data-article="' + article + '"]:not(:has([data-topping]))'); if (existingGoods.length) { counter = existingGoods.find('input[name="quantity"]'); counter.val(parseInt(counter.val()) + 1); } else { counter = $('<input name="quantity" type="number" value="1" min="1"/>'); clone = ui.draggable.clone().css({left: 0, top: 0}).append(counter); clone.droppable({ accept: 'li[data-topping-article="' + article + '"]', activeClass: 'active', hoverClass: 'hover', drop: shopCartItemDropHandler }); $this.append(clone); } } function shopCartItemDropHandler(event, ui) { var span, $this = $(this), topping = ui.draggable.attr('data-topping'), toppingName = ui.draggable.text(), existingToppings = $this.find('span[data-topping="' + topping + '"]'); if (!existingToppings.length) { span = $('<span/>').attr('data-topping', topping).text(toppingName); $this.append(span); } } 


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

 <ul id="shop-cart" class="ui-droppable"> <li data-article="cacke">Cacke <input name="quantity" type="number" value="2" min="1"> <span data-topping="cherry">Cherry Topping</span> <span data-topping="cream">Cream Topping</span> </li> <li data-article="cacke">Cacke <input name="quantity" type="number" value="1" min="1"> <span data-topping="cherry">Cherry Topping</span> </li> <li data-article="milk">Milk <input name="quantity" type="number" value="2" min="1"> </li> <li data-article="apple">Apple <input name="quantity" type="number" value="1" min="1"> </li> </ul> 


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

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

 $('input[name="submit"]').click(function () { var result = {items: []}; shopCart.find('li[data-article]').each(function () { var $this = $(this), toppings = [], article = { id: $this.attr('data-article') }, quantity = $this.find('input[name="quantity"]').val(); $this.find('span[data-topping]').each(function () { toppings.push({ id: $(this).attr('data-topping') }); }); result.items.push({ article: article, toppings: toppings, quantity: parseInt(quantity) }); }); $.ajax('/shopping-cart/webresources/cart', { cache: false, contentType: 'application/json', data: JSON.stringify(result), dataType: 'json', type: 'POST' }); }); 


рд╕рд░реНрд╡рд░ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдорд╛рдВрдЧ рдкрд░ рдмрдЪрдд рдФрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреНрд▓рд╛рд╕рдлрд╝рд┐рд╢ рдФрд░ рдЬрд░реНрд╕реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ, рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ JSON рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ REST рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ POST рдЕрдиреБрд░реЛрдз рдкрд░ рдЯреЛрдХрд░реА рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ рдФрд░ GET рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рдЦрд░реАрджрд╛рд░реА рдХреА рд╕реВрдЪреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред рдПрдХ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╢реЗрд▓реНрдл рдкрд░ рдЙрдкрд▓рдмреНрдз рдЙрддреНрдкрд╛рджреЛрдВ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рдЕрдиреНрдп рднрдВрдбрд╛рд░рдг рддрдВрддреНрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗрдЧрд╛ред

 @Path("cart") @Singleton @ApplicationScoped public class ShoppingResource { @Inject private Storage storage; @GET @Produces(MediaType.APPLICATION_JSON) public ShoppingCart get() { eturn storage.getShoppingCart(); } @POST @Consumes(MediaType.APPLICATION_JSON) public void post(ShoppingCart shoppingCart) { storage.setShoppingCart(shoppingCart);} } @Named @Singleton @ApplicationScoped public class Storage { private final Map<String, Article> articles = new HashMap<>(); private final Map<String, Topping> toppings = new HashMap<>(); private ShoppingCart shoppingCart; @PostConstruct public void init() { Article cacke = new Article("cacke", "Cacke"); putArticles(cacke, new Article("milk", "Milk"), new Article("apple", "Apple")); putToppings( new Topping("cream", "Cream Topping", cacke), new Topping("cherry", "Cherry Topping", cacke)); } private void putArticles(Article... articles) { for (Article article : articles) { his.articles.put(article.getId(), article); } } private void putToppings(Topping... toppings) { for (Topping topping : toppings) { this.toppings.put(topping.getId(), topping); } } @PreDestroy public void clear() { articles.clear(); toppings.clear(); } public Collection<Article> getArticles() { return articles.values(); } public Collection<Topping> getToppings() { return toppings.values(); } public ShoppingCart getShoppingCart() { return shoppingCart; } public void setShoppingCart(ShoppingCart shoppingCart) { ensureConsistence(shoppingCart); this.shoppingCart = shoppingCart; } private void ensureConsistence(ShoppingCart cart) { /*  тАЬтАЭ     тАЬтАЭ   */ } } 


рд╣рдореЗрдВ рдЯреЛрдХрд░реА рдХреЗ рдХреНрд░рдордмрджреНрдз рджреГрд╢реНрдп рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рднреА рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рд░ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ JSON рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕реЗ рд╕рд╛рдорд╛рди, рд╡рд┐рдХрд▓реНрдк, рдФрд░ рдХрд╛рд░реНрдЯ рдЖрдЗрдЯрдо рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

 @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public abstract class JsonProvider<T> implements MessageBodyReader<T>, MessageBodyWriter<T> { private static final Logger LOGGER = Logger.getLogger(JsonProvider.class.getName()); private final ConcurrentMap<T, byte[]> serializedMap = new ConcurrentHashMap<>(); private final ObjectMapper mapper = new ObjectMapper(); protected final ObjectMapper getMapper() { return mapper; } protected abstract Class<T> getType(); // Reader Implementation @Override public final boolean isReadable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) { return mt.equals(MediaType.APPLICATION_JSON_TYPE) && getMapper().canDeserialize(getJavaType()) && getType().isAssignableFrom(type); } private JavaType getJavaType() { return TypeFactory.fromClass(getType()); } @Override public T readFrom(Class<T> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, String> mm, InputStream in) throws IOException, WebApplicationException { return (T) getMapper().readValue(in, getClass()); } // Writer Implementation @Override public final boolean isWriteable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) { return mt.equals(MediaType.APPLICATION_JSON_TYPE) && getMapper().canSerialize(getType()) && getType().isAssignableFrom(type); } @Override public final long getSize(T t, Class<?> type, Type type1, Annotation[] antns, MediaType mt) { byte[] result = new byte[0]; try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); getMapper().writeValue(stream, t); result = stream.toByteArray(); serializedMap.put(t, result); } catch (IOException ex) { LOGGER.log(Level.SEVERE, null, ex); } return result.length; } @Override public final void writeTo(T t, Class<?> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, Object> mm, OutputStream out) throws IOException, WebApplicationException { if (serializedMap.containsKey(t)) { byte[] data = serializedMap.remove(t); out.write(data); } out.flush(); } } 


рдЕрдм, рдЯреЛрдХрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, DOM рд╕реЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ, рдФрд░ рдкреЗрдЬ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рдмрд╕ рдЖрд╡рд╢реНрдпрдХ HTML рдЯреБрдХрдбрд╝реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

 <ul id="store-shelf"> <c:forEach var="article" items="#{storage.articles}"> <li data-article="${article.id}">${article.name}</li> </c:forEach> <c:forEach var="topping" items="#{storage.toppings}"> <li data-topping="${topping.id}" data-topping-article="${topping.article.id}">${topping.name}</li> </c:forEach> </ul> <ul id="shop-cart"> <c:forEach var="item" items="#{storage.shoppingCart.items}"> <li data-article="${item.article.id}">${item.article.name} <c:forEach var="topping" items="${item.toppings}"> <span data-topping="${topping.id}">${topping.name}</span> </c:forEach> <input name="quantity" type="number" value="${item.quantity}" min="1"/> </li> </c:forEach> </ul> 


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

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

Source: https://habr.com/ru/post/In169577/


All Articles