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).