.setAttribute("disabled", false); changes editable attribute to false

JavascriptFirefoxFirefox AddonXul

Javascript Problem Overview


I want to have textboxes related to radiobuttons. Therefore each radio button should enable it's textbox and disable the others. However when I set the disabled attribute of textbox to true, it changes the editable attribute too. I tried setting editable attribute true again but it did not work.

This was what I tried:

JS function:

function enable(id)
{
	var eleman = document.getElementById(id);
    eleman.setAttribute("disabled", false);
    eleman.setAttribute("editable", true);
}

XUL elements:

<radio id="pno" label="123" onclick="enable('ad')" />
<textbox id="ad" editable="true"  disabled="true" flex="1" emptytext="asd" onkeypress="asd(event)" tooltiptext="" >

Javascript Solutions


Solution 1 - Javascript

A disabled element is, (self-explaining) disabled and thereby logically not editable, so:

> set the disabled attribute [...] changes the editable attribute too

Is an intended and well-defined behaviour.

The real problem here seems to be you're trying to set disabled to false via setAttribute() which doesn't do what you're expecting. an element is disabled if the disabled-attribute is set, independent of it's value (so, disabled="true", disabled="disabled" and disabled="false" all do the same: the element gets disabled). you should instead remove the complete attribute:

element.removeAttribute("disabled");

or set that property directly:

element.disabled = false;

Solution 2 - Javascript

Just set the property directly: .

eleman.disabled = false;

Solution 3 - Javascript

Using method set and remove attribute

function radioButton(o) {

  var text = document.querySelector("textarea");

  if (o.value == "on") {
    text.removeAttribute("disabled", "");
    text.setAttribute("enabled", "");
  } else {
    text.removeAttribute("enabled", "");
    text.setAttribute("disabled", "");
  }
  
}

<input type="radio" name="radioButton" value="on" onclick = "radioButton(this)" />Enable
<input type="radio" name="radioButton" value="off" onclick = "radioButton(this)" />Disabled<hr/>

<textarea disabled ></textarea>

Solution 4 - Javascript

Try doing this instead:

function enable(id)
{
    var eleman = document.getElementById(id);
    eleman.removeAttribute("disabled");        
}

To enable an element you have to remove the disabled attribute. Setting it to false still means it is disabled.

http://jsfiddle.net/SRK2c/

Solution 5 - Javascript

the disabled attributes value is actally not considered.. usually if you have noticed the attribute is set as disabled="disabled" the "disabled" here is not necessary persay.. thus the best thing to do is to remove the attribute.

element.removeAttribute("disabled");     

also you could do

element.disabled=false;

Solution 6 - Javascript

just replace 'myselect' with your id

to disable->

document.getElementById("mySelect").disabled = true;  

to enable->

document.getElementById("mySelect").disabled = false; 

Solution 7 - Javascript

An update in 2022.

There is another method toggleAttribute() more specific to this use case if you don't need to consider IE11 and other legacy browsers.

element.toggleAttribute("disabled");

switches between <input value="text" disabled /> and <input value="text" />, and moreover,

element.toggleAttribute("disabled", true);

sets <input value="text" disabled /> explicitly, no matter what state the element was; similarly,

element.toggleAttribute("disabled", false);

sets <input value="text" /> explicitly.

Solution 8 - Javascript

There you go,

<div immutable='id,class' id='abc' class='xyz'></div>
<h1 immutable='onclick' onclick='alert()'>HI</h1>
<p immutable='id' subtree>
   <!-- now childs id are immutable too -->
   <span id='xyz'>HELLO</span>
</p>

</script>
   const mutationHandler = entries => {
    entries.forEach(entry => {
        if (entry.type !== 'attributes') return;
        mutationObserver.disconnect()
        entry.target.setAttribute(entry.attributeName, entry.oldValue)
        observe()
    })
}

const mutationObserver = new MutationObserver(mutationHandler)

const observe = () => {
    let items = document.querySelectorAll('[immutable]');
    items.forEach(item => {
        let subtreeEnabled = item.getAttribute('subtree') != null

        let immutableAttr = item.getAttribute('immutable')
        let captureAttrs = immutableAttr.split(',');
        captureAttrs.push('immutable')
        captureAttrs.push('subtree')
        
        mutationObserver.observe(item, {
            subtree: subtreeEnabled,
            attributes: true,
            attributeOldValue: true,
            attributeFilter: captureAttrs
        })
    })
}
observe()
</script>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGhokunView Question on Stackoverflow
Solution 1 - JavascriptoeziView Answer on Stackoverflow
Solution 2 - JavascriptRobGView Answer on Stackoverflow
Solution 3 - JavascriptanteloveView Answer on Stackoverflow
Solution 4 - JavascriptRichard DaltonView Answer on Stackoverflow
Solution 5 - JavascriptBaz1ngaView Answer on Stackoverflow
Solution 6 - Javascriptuser7652403View Answer on Stackoverflow
Solution 7 - JavascriptEvi SongView Answer on Stackoverflow
Solution 8 - JavascriptVivek sharmaView Answer on Stackoverflow