Bicycle Hearing Listeners versus many Listeners

I'm doing some work with the program, which has a lot of clicks, but only need to click when they say that their parent was depressed and active. Now there are three ways, as I see it, that it was coming.

  • Many event handlers
  • Constantly create and destroy them
  • Do you have a top-level handler and read the event for a child even occurred (event.target)

The reason that three - not the most obvious choice for me - this is what the children of what I clicked, will event.target and object.parentNode , need to repeatedly run to see which item is actually available for the press; I heard that DOM api are expensive.

I am interested to know how expensive each method is relative to each other and what is accepted in something like that. The number of listeners is in the range of hundreds, this is a dynamic application with a modest mutation of the DOM.

EDIT: To clarify, this question concerns the DIV and attach them to the event handlers.

+4
source share
1 answer

If you use buttons or the like, you can turn them on and off. They usually have a different appearance, so the user may know what not to click on the disabled button.

If you do not use the button, you can add or remove a class with disabled. When an element is clicked, the listener can check its class, and if it has the class "disabled", do nothing. Otherwise, do what he does.

Adding and deleting class can also be used to change the appearance of the element, making it off (just like buttons and inputs change appearance when turned off).

Simple ones have / add / removeClass functions:

 var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } { var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } ^ | \\ s +)' + cName + '(\\ s + | $)'); var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } + cName); var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } { var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } ) { var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } ^ | \\ s +)' + cName + '(\\ s + | $)', 'g'); var util = {dom:{}}; util.trim = function(s) { return s.replace(/(^\s+)|(\s+$)/g,'').replace(/\s+/g,' '); } util.dom.hasClassName = function(el, cName) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)'); return el && re.test(el.className); } util.dom.addClassName = function(el, cName) { if (!util.dom.hasClassName(el, cName)) { el.className = util.trim(el.className + ' ' + cName); } } util.dom.removeClassName = function(el, cName) { if (util.dom.hasClassName(el, cName)) { var re = new RegExp('(^|\\s+)' + cName + '(\\s+|$)','g'); el.className = util.trim(el.className.replace(re, '')); } } 

A simple example:

 <script> function toggle(id) { var el = document.getElementById(id); if (!el) return; if (util.dom.hasClassName(el, 'disabled')) { util.dom.removeClassName(el, 'disabled') } else { util.dom.addClassName(el, 'disabled') } } function doStuff(el) { if (util.dom.hasClassName(el, 'disabled')) return; alert('I\'m alive!'); } </script> <button id="b0" onclick="doStuff(this);">button 0</button> <button onclick="toggle('b0')">change b0</button> ')) { <script> function toggle(id) { var el = document.getElementById(id); if (!el) return; if (util.dom.hasClassName(el, 'disabled')) { util.dom.removeClassName(el, 'disabled') } else { util.dom.addClassName(el, 'disabled') } } function doStuff(el) { if (util.dom.hasClassName(el, 'disabled')) return; alert('I\'m alive!'); } </script> <button id="b0" onclick="doStuff(this);">button 0</button> <button onclick="toggle('b0')">change b0</button> '!); <script> function toggle(id) { var el = document.getElementById(id); if (!el) return; if (util.dom.hasClassName(el, 'disabled')) { util.dom.removeClassName(el, 'disabled') } else { util.dom.addClassName(el, 'disabled') } } function doStuff(el) { if (util.dom.hasClassName(el, 'disabled')) return; alert('I\'m alive!'); } </script> <button id="b0" onclick="doStuff(this);">button 0</button> <button onclick="toggle('b0')">change b0</button> 

Alternatively, a disabled property can be set to true or false.

You can also maintain state independent of elements, so when you click an element, it knows what to do based on state if its child or parent elements (or something else).

+2
source

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


All Articles