Hello, habrovchane.
I want to share with you one technique of organizing code in the course of massive work with DOM elements. A few years ago, when there was no backbone and MVVC at all, we wrote good old javascript without frameworks: we created objects and forced them to dance on the page in a general dance. Such a practice, no doubt, still justifies itself, and the equipment, which will be discussed, is applicable to it.
My story is about the small 
PageObject.js library (current version v0.14, 2.6K) and how to use it to simplify your life.
This is not a jQuery plugin, although I am sure many will want to call it that way. This is just a function that uses selectors and some jQuery utilities to create convenience in reading and writing code. In fact, this is a simple jQuery utility.
')
The essence of technology
In creating objects that manipulate DOM elements and connecting them to a page, you can think of nothing new: create a constructor, first render a certain template in it, then parse its result into parts, “hang” the event handlers for these parts, program the rest of the logic and We build all this stuff into our application.
function Calculator() { if (this.constructor.name !== 'Calculator') { throw “No way, buddy!”; }  
PageObject.js helps with the first two steps.
 function Calculator() { if (this.constructor.name !== 'Calculator') { throw “No way, buddy!”; } var calc = this; $.turnToPageObject(calc, { template: $('#tmplCalculator').html(), containerClass: 'calc', context: { caption: "Calculator" }, selectors: { buttons: [ ':button', Calculator.getButtonName ], led: 'p' } });  
After the 
$.turnToPageObject function 
$.turnToPageObject (“turn into a page object”), the 
calc object will have the 
calc.DOM property, a namespace filled with DOM elements that correspond to the specified selectors, and 
calc.DOM.container will appear This part of an object that is easily embedded in an application is a container of everything.
Here you are, a full 
working example with a calculator . It remains for me to tell you more about all the features of the utility.
$ .turnToPageObject
The first argument must be an object that later has a 
DOM naming space filled with composite HTML elements. The second argument is options.
If you do not specify the 
container option, the container will be created (without it in any way), and it will be the same element as 
containerElement (by default, 
DIV ).
If you specify 
containerClass , the class will be assigned to the container.
If you specify a 
template , the 
template will be rendered and its result will be placed inside the container.
If you DO NOT specify a 
context , then the template will be rendered with an empty context 
{} .
template can be either a string or a function (integration with 
Jammit JST ).
When 
template is a function, it accepts only the context and must return a string.
When 
template is a string, the template is rendered using 
templateEngine , which will automatically configure itself to use the 
_.template templating engine if the 
underscore is present.
If your project does not have 
underscore , you need to configure 
templateEngine .
 
templateEngine takes two arguments — a template string and a context — and should also return a string.
If the 
hide option is specified, the container will be hidden, which is often convenient.
And most importantly - selectors. If you specify the 
selectors option (object), then the corresponding selectors found in the contents of the container HTML elements will be placed on the same keys in the 
DOM namespace. If the 
template option was specified, then selectors will search in the already rendered template.
If no element is found by the selector, there will be a cry.
If more than one element is found by the selector, there will also be an exception.
If it is nevertheless necessary for the selector to find and place more than one element in an array, you need to add 
[] (empty square brackets) to the value of the selector - this selection justifies itself.
If it is necessary that the multiple elements found are placed in an object (as in the example with a calculator), the value of the selector should be written as an array of two elements: the first element is the selector itself, and the second is the function that should be remove the key (for example, ID) for placing this element in the appropriate namespace.
It is worth noting that additional namespaces in selectors form namespaces with the same names inside the 
DOM property.
Perhaps that's all.
You can get a better understanding of what and how it works by reading the tests and looking at the source code on the githaba. Certainly also general documentation will be helpful.I would be glad if you find this technique and the above convention applicable in your projects. I will especially be glad to your wishes and ideas, I will be happy to answer questions.