рдЕрд╡рдпрд╡ред рдЙрджрд╛рд╣рд░рдг

рдШрдЯрдХ рдиреЛрдЯреЛрдВ рдХреЗ рдКрдкрд░

рдбреНрд░реЙрдк рдбрд╛рдЙрди рд╕реВрдЪреА



рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдШрдЯрдХ рдмрдирд╛рдПрдВ, рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╕реВрдЪреАред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рдиреЛрдЯреЛрдВ рдореЗрдВ рдХреЛрдб рдореЗрдВ jQuery рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдВрдХрд░ (рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо) рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ рдлреЛрдХрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рддрд╣рдд рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдЫрд╡рд┐ рдкрд╛рда

рдирдореВрдирд╛ рдХреЛрдб https://github.com/mbykov/component-dropdown-example рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ test/example.html рдЦреЛрд▓реЗрдВ, input рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрдВрдХрд╛рд▓ рдШрдЯрдХ рдмрдирд╛рдПрдБ:

 $ component create dropdown-example repo (username/project): mbykov/component-dropdown-example description: simple dropdown example . . . 


рдШрдЯрдХреЛрдВ рдореЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 "dependencies": { "component/domify": "*", "component/each": "*", "component/classes": "*" }, 


рдФрд░ рдХрд░ $ make ред Makefile рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ (рдиреЛрдЯ рдореЗрдХрдлрд╛рдЗрд▓ рдмрдирд╛рдо рдЧреНрд░рдВрдЯ рдореЗрдВ рдореЗрдХрдлрд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ):

 build: components index.js dropdown.css @component build --dev components: component.json @component install --dev 


рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ component рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ component рд╕реНрдерд╛рдкрд┐рдд component build/build.js build/build.css . build/build.js build/build.css . build/build.js build/build.css ред (рдореИрдВрдиреЗ рдореВрд▓ dd-example.css рдХреЛ dropdown.css рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдореЗрдХрдлрд╛рдЗрд▓ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛)ред

рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдорд╛рдг



рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо test рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ example.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рд░ рд╣реИ

  <p><input type="text" id="anchor"><p> <script> var anchor = document.querySelector('#anchor'); var Dropdown = require('dd-example'); var dd = new Dropdown(anchor); </script> 


рдФрд░ рдлрд╝рд╛рдЗрд▓ index.js рдШрдЯрдХреЛрдВ рдореЗрдВ рд╣рдо рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 var domify = require('domify'); var classes = require('classes'); var each = require('each'); module.exports = Dropdown; function Dropdown(anchor) { console.log(anchor); return this; } 


рдЗрд╕реЗ return this рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдпрд╣реА рдорд┐рд▓рддрд╛ рд╣реИред

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

рдЖрдЗрдП dropdown рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рд╣реА рд▓рд┐рдЦреЗрдВред

 function Dropdown(anchor) { var _div = domify('<div class="dropdown-div"></div>'); var _list = domify('<ul class="dropdown-list"></ul>'); _div.appendChild(_list); this.list = _list; this.div = _div; this.anchor = anchor; anchor.parentNode.insertBefore(_div, anchor.nextSibling); anchor.focus(); return this; } 


рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рд╣рдо рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, _list рдФрд░ _list ред рдпрд╣ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП DOM рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рд╣рдореЗрдВ рдЕрдм рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ $ рд╕рд╛рдЗрди рдХрд┐рд╕реА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рд╛рдж рдХреА рдмрд╛рдд рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ.html рдореЗрдВ html рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА require('template') ред рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ this.list = _list рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рдФрд░ рдкреЗрдЬ рдкрд░ рдПрдХ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВред

 $ make 


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

  var self = this; anchor.onclick = function(e){ self.toggle(); classes(this.div).remove('hidden'); return false; } 


рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ

 Dropdown.prototype.render = function(values) { var self = this; values.each(function(value){ var added = domify('<li class="dropdown-line"></li>'); added.textContent = value; self.list.appendChild(added); }); return this; } 


рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде render рд╡рд┐рдзрд┐ рдореЗрдВ example.html рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ: var values = [' '...

  dd.render(values) 


рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдЕрдЧрд▓рд╛ рдШрдЯрдХ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ - .select ()ред

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╕реВрдЪреА рд▓рд╛рдЗрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдмрд╕ рдХрдВрд╕реЛрд▓ рд╣реЛрдЧрд╛ред)ред

 Dropdown.prototype.select = function(cb){ var self = this; this.list.onclick = function(e) { var value = e.target.textContent; anchor.value = value; self.hide(); cb(value); }; } 


рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ return this рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдВрдд рд╣реИред example.html ред .select рдореЗрдВ .select рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджреЗрдЦрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖



рдХрд╛рдлреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрддрд┐рдо рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ - рд╕реВрдЪреА рд▓рдВрдЧрд░ рдХреЗ рдиреАрдЪреЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реВрдЪреА рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ - рдпрд╣ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ:

  _div.style.left = getOffset(anchor).left +'px'; 


рдореИрдВрдиреЗ рдореИрдереНрдпреВ рдореБрд▓реЗрд░рд╛ рд╕реЗ рдЧреЗрдЯрдСрдлрд╕реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдореЗрд░реЗ "рд╡рдпрд╕реНрдХ" рдШрдЯрдХ рдХреЗ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдкреБрд░рд╛рдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛: component/dropdown , stagas/dropdown , bmcmahen/dropdown , matthewmueller/autocomplete ред рд╕рдЪ рд╣реИ, рд╡реЗ рд╕рднреА jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдирд╛ mbykov/dropdown рд▓рд┐рдЦрд╛ рд╣реИ - рдпрд╣ mbykov/dropdown рд╕реЗ рдкреНрд░рд╛рдкреНрдд json рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЕрдкрдиреА рдЦрд╝рд╛рд╕рд┐рдпрддреЗрдВ рд╣реИрдВред

рдЕрдм рдЖрдк рдЗрд╕ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд┐рддрдиреА рдмрд╛рд░ рдЪрд╛рд╣реЗрдВ, рдХрд┐рд╕реА рднреА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдПрдХ рдкреГрд╖реНрда рдкрд░ рдпрд╛ рдХрдИ рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдП

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


All Articles