Closed Bug 203751 Opened 21 years ago Closed 21 years ago

setAttribute('selected', 'selected') on an option element does not give an option element with attribute&value pair selected="selected"

Categories

(Core :: DOM: Core & HTML, defect, P3)

x86
All
defect

Tracking

()

RESOLVED FIXED
Future

People

(Reporter: kumo, Unassigned)

References

Details

Attachments

(1 file)

User-Agent:       Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4a) Gecko/20030401
Build Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4a) Gecko/20030401

I'm working on a JavaScript class that uses the DOM to create forms on the fly
and discovered that I could not set the selected attribute of OPTION elements
within SELECTs to "selected" (considered XHTML best practice) or, in fact, to
any other value.

The simplest way of reproducing this phenom is to create an option element, set
the selected attribute, then check it :

var nodeOption = document.createElement('option');
nodeOption1.setAttribute('selected', 'selected');
alert('value of selected attribute : ' + nodeOption1.getAttribute('selected'));

nodeOption1.getAttribute('selected') returns only an empty string...

It's unlikely that I'll be running the form markup generated by my class through
a validator at any point, but I typically use the XHTML strict dtd, but it's
puzzling that I can create a nonsense attribute with name "foo" and set its
value to "bar", for example, but Moz won't allow me to set the selected
attribute to value "selected" (good news : checked/checked works for checkboxes
and radio buttons).

Reproducible: Always

Steps to Reproduce:
Brian,
Can you attach a simplified testcase showing the problem?
* The snippet below, I pasted in from a larger piece of code (hence the
nodeOption vs nodeOption1 .. ugh, sorry)
* here's the simplest testcase :

<a
href="http://test.lophty.com/mozilla_testcases/test_setAttribute_selected_selected.htm">http://test.lophty.com/mozilla_testcases/test_setAttribute_selected_selected.htm</a>
I think I'm having a similar problem. 
Browser: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624
Text Editor: Dreamweaver Ultra Dev. 

I've got code that creates a dropdown box. The resulting HTML looks like this: 

		<select NAME='level'>
		<option value = 1> Primary</option>
		<option value = 2> Primary/Intermediate</option>
		<option  selected value = 3> Intermediate</option>
	        <option value = 4> Intermediate/Adolescent</option>
		<option value = 5> Adolescent</option>
		</select> 

However, it doesn't display option number 3 as selected. It does render
correctly using IE.

I'm willing to be told that I'm doing something stupidly wrong. :)

Thanks!
Sorry for being late in responding.. here are my thoughts on this "bug":

getAttribute("selected") for an option element returns an empty string. This is
because StringToAttribute for option elements gives an empty value to the
selected and disabled attributes. This should be changed imho (unless it's for
backwards compat reasons). So setAttribute works fine but in fact getAttribute
doesn't return the correct string. There is another problem to StringToAttribute
as it stands: selected="false" doesn't work. (jst?)

To summarize, everything works apart from getAttribute because of
StringToAttribute in nsHTMLOptionElement.cpp
Confirming marking NEW. Puzzling for web devs so setting P3, tm future

BTW, is it just me or does .label not work in Mozilla? (for option elements)
Status: UNCONFIRMED → NEW
Ever confirmed: true
OS: Linux → All
Priority: -- → P3
Target Milestone: --- → Future
Blocks: 204000
I've encountered this issue with Moz 1.5/Windows -- both
HTMLOptionElement.selected and HTMLOptionElement.getAttribute("selected") appear
to return a value of null when used with options within a <select multiple>
element. I ran into this when trying to copy only the selected options in a
<select multiple> element.

In addition, there appear to be major issues with HTMLOptionElement.cloneNode(),
HTMLSelectElement.appendChild(), and HTMLSelectElement.removeChild() in
conjunction with <select multiple> using HTML 4.01 Trans. I've not yet tested
with XHTML doctype.

Example:

<form>
<table>
  <tr>
    <td>
      <select name="myselect" size="5" multiple>
        <option value="PHX">Phoenix</option>
        <option value="BRI">Brisbane</option>
        <option value="DFW">Dallas-Ft. Worth</option>
        <option value="CHI">Chicago</option>
        <option value="LAX">Los Angeles</option>
      </select>
    </td>
    <td id="forNewSelect"></td>
  </tr>
  <tr>
    <td colspan="2">
      <input type="button" value="Make Copy" 
             onclick="makeCopy(this.form.myselect);">
    </td>
  </tr>
</table>
</form>

<script type="text/javascript">

function makeCopy(selectObj)
{
  var copy = selectObj.cloneNode(true);
  copy.name += "_copy";

  var cOptions = copy.options;
  for(var i=0; i<cOptions.length; i++)
  {
    if(cOptions[i].selected)
      cOptions[i].removeAttribute("selected");
    else
      copy.removeChild(cOptions[i]);
  }

  var newSelectTd = document.getElementById("forNewSelect");
  newSelectTd.appendChild(copy); 
}
</script>

I have tried to do the same thing with numerous variations on the
collections/object references used, e.g.

var cOptions = copy.getElementsByTagName("option");

if(cOptions.item(i).getAttribute("selected") == "true") {...}
//  typeof cOptions[i].selected is reported as Boolean and not String, btw...

onclick="makeCopy(document.getElementsByName('myselect')[0]);"

etc.

If I'm making some horribly boneheaded mistake here, I'd appreciate knowing
about it.
I rewrote my test case from scratch and now it works fine. I also see that this
bug was for setting not getting this property, so my comment was misplaced in
any case.

Please disregard my previous comment, and accept my apologies. Feel free to
delete it if desired.
i don't agree that setAttribute works.

in the following example, getAttribute returns an empty string no matter 
whether 'selected' was set to 'true' or 'false', and moreover the select 
element selects the last option (here called 'test9'), instead of the fourth.

<select name="select" size="1">
</select>

<script type="text/javascript">
	var select = document.getElementsByName("select")[0];
	var option;
	var text;
	for (var i = 0; i < 10; i++) {
		option = document.createElement("option");
		text = document.createTextNode("test" + i);
		if (i == 3) {
			option.setAttribute("selected", true);
		}
		else {
			option.setAttribute("selected", false);
		}
		option.appendChild(text);
		select.appendChild(option);
		document.write("<br>, " + option.getAttribute("selected"));
	}
</script>

i also tried creating the attribute with document.createAttribute, then setting 
nodeValue = "true" and setting the attribute on the option elt with 
setAttributeNode, with the same results.

the same problem occurs in Netscape 6.2, btw.
sorry, i was rash, i tested on an old Mozilla, it's working on 1.6a...
Fixed by the checkin for bug 232706 
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Depends on: 232706
Component: DOM: Core → DOM: Core & HTML
QA Contact: desale → general
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: