Hi,
The following code:
<script language="javascript" type="text/javascript">
function lstbox(lstval) {
switch(lstval){
case "Amphipoda" :
document.getElementById("clas").add(new
Option("Gammaridae","Gammaridae"));
break
default : alert("Unknown");
}
}
</script>
Works in IE6 and Opera but not in Mozilla based browsers (NN &
Firefox), causing the following error:
Error: uncaught exception: [Exception... "Not enough arguments
[nsIDOMHTMLSelectElement.add]" nsresult: "0x80570001
(NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "JS frame ::
http://localhost/IndicatorsSp/Indicator_search.php?spl :: lstbox ::
line 58" data: no]
What arguments am missing? And is it possible to get it to work in all
browsers?
As an extra, I'd like to clear the listbox when a new switch statement
is triggered.
Many thanks
Dan
Dietmar Meier
Mar 7 2005, 11:55 AM
GD wrote:
QUOTE |
[Select].add(new Option("Gammaridae","Gammaridae")); [...] Error: uncaught exception: [Exception... "Not enough arguments [nsIDOMHTMLSelectElement.add]" [...] What arguments am missing?
|
http://www.w3.org/TR/2003/REC-DOM-Level-2-...tml#ID-14493106| Parameters
| element of type HTMLElement
| The element to add.
| before of type HTMLElement
| The element to insert before, or null for the tail of the list.
ciao, dhgm
Thanks for replying Dietmar,
Sorry to appear obtuse, but I don't understand how to implement the
solution in my code. My Javascript knowledge is limited.
Many thanks
GD
RobG
Mar 7 2005, 12:37 PM
GD wrote:
QUOTE |
Thanks for replying Dietmar,
Sorry to appear obtuse, but I don't understand how to implement the solution in my code. My Javascript knowledge is limited. Many thanks GD
|
Using "appendChild" instead of "add" will do the trick.
...
case "Amphipoda" :
document.getElementById("clas").appendChild(new
Option("Gammaridae","Gammaridae"));
break;
...
Also, ensure that the "clas" select element has an id="clas" as
well as a name="clas". IE treats them as synonymous, which is
incorrect.
In IE, getElementById('clas') will return a reference to a form
element with name='clas' even if it has no id - but not so in
Firefox.
For further info, 'name' and 'id' share the same namespace, so if
you want to use the same id and name, they must be on the same
element, but it is not compulsory for the name and id of a
particular element to be the same.
--
Rob.
Fred Oz
Mar 7 2005, 01:01 PM
GD wrote:
QUOTE |
Thanks for replying Dietmar,
Sorry to appear obtuse, but I don't understand how to implement the solution in my code. My Javascript knowledge is limited. Many thanks GD
|
In your example, use the 'add' method like this (works in IE and
Firefox):
case "Amphipoda" :
document.getElementById("clas").options.add(new
Option("Gammaridae","Gammaridae"));
break;
If you ant to add it at a certain position in the options
collection (say as the 3rd option) using clearer code:
var oOpt = new Option("Gammaridae","Gammaridae");
document.getElementById("clas").options.add(oOpt,2);
By not specifying a position, or using 'null', the option is
added to the end of the collection. So the appendChild method may
suit you better.
--
Fred
Michael Winter
Mar 7 2005, 01:02 PM
GD wrote:
QUOTE |
<script language="javascript" type="text/javascript"
|
The language attribute is deprecated and redundant. Don't bother with it.
[snip]
QUOTE |
document.getElementById("clas").add(new Option("Gammaridae","Gammaridae"));
|
If you're using the W3C DOM to manipulate the document tree, I
personally think it best to use it consistently; create the option
element with the createElement method, rather than the DOM 0 Option
constructor.
[snip]
QUOTE |
What arguments am missing?
|
The W3C DOM defines the HTMLSelectElement.add method as taking two
required arguments - both object references. The first argument you
know. The second specifies where to insert the new element in
precisely the same fashion as the Node.insertBefore method. However,
Microsoft (for whatever reason) do not implement the add method with
the same signature. The second argument is an optional number.
Obviously, these two approaches are incompatible. Whilst the Microsoft
model might be, in this case, better there is no reason why both the
proprietary and standard implementations couldn't be supported
simultaneously: Opera manages it.
QUOTE |
And is it possible to get it to work in all browsers?
|
A potential solution, though untested on Safari, Konqueror, and
earlier Mozilla version, is presented below:
function addOption(element, index, option) {var cN, o;
if('string' == typeof element) {
element = document.getElementById(element);
}
if('string' == typeof option) {
o = document.createElement('option');
o.text = option;
} else {o = option;}
if((cN = element.childNodes)) {
if(2 == element.add.length) {
element.add(
o,
((0 > index) || (cN.length == index)) ? null : cN[index]
);
} else {
element.add(o, index);
}
}
return o;
}
element - Either a reference to a SELECT element, or its id.
index - The position where the new element is to be inserted.
A value of -1 will append the new option.
option - This argument can either be a string representing the
text of the new option, or it can be a reference to
an OPTION element.
The function will return a reference to the new OPTION element. This
allows other properties, like value and selected, to be set once the
element has been added.
The function obviously needs some additional feature testing, and
perhaps a fallback for DOM 0 user agents. However, I think success
with browsers other than IE5.01+, Opera 7.54u1, and Firefox 1.0 needs
to be determined first.
QUOTE |
As an extra, I'd like to clear the listbox when a new switch statement is triggered.
|
I'm not quite sure what you mean there.
Mike
--
Michael Winter
Replace ".invalid" with ".uk" to reply by e-mail.
Michael Winter
Mar 7 2005, 01:14 PM
RobG wrote:
[snip]
QUOTE |
Using "appendChild" instead of "add" will do the trick.
|
It seems to fail with IE. Whilst a new OPTION element is given space
on the control, no text appears. Oddly enough, the associated value
can still be submitted. It would seem that IE attaches some special
significance to the add method.
See my post for an (insufficiently tested) alternative.
[snip]
QUOTE |
For further info, 'name' and 'id' share the same namespace,
|
This is true for certain elements, such as FORM and IMG. However, it
is not for form controls (INPUT, SELECT, etc.). In the latter case,
the scope of name attributes is limited to the containing form
(assuming there is one).
QUOTE |
If you want to use the same id and name, they must be on the same element, but it is not compulsory for the name and id of a particular element to be the same.
|
This is true for form controls, but not other elements. Elements such
as A or FORM which have a name and an id attribute /must/ share the
same value.
Elements Scope Identical attributes
INPUT, SELECT, Form No
TEXTAREA, BUTTON
A, APPLET, FORM, Document Yes
FRAME, IFRAME,
IMG, MAP
Mike
--
Michael Winter
Replace ".invalid" with ".uk" to reply by e-mail.
RobG
Mar 7 2005, 01:37 PM
Michael Winter wrote:
QUOTE |
RobG wrote:
[snip]
Using "appendChild" instead of "add" will do the trick.
It seems to fail with IE. Whilst a new OPTION element is given space on the control, no text appears. Oddly enough, the associated value can still be submitted. It would seem that IE attaches some special significance to the add method.
See my post for an (insufficiently tested) alternative.
|
Yes, I could have sworn I tested it in IE, guess I only did the
"add" version.
QUOTE |
[snip]
For further info, 'name' and 'id' share the same namespace,
This is true for certain elements, such as FORM and IMG. However, it is not for form controls (INPUT, SELECT, etc.). In the latter case, the scope of name attributes is limited to the containing form (assuming there is one).
If you want to use the same id and name, they must be on the same element, but it is not compulsory for the name and id of a particular element to be the same.
This is true for form controls, but not other elements. Elements such as A or FORM which have a name and an id attribute /must/ share the same value.
|
The vagaries of HTML - consistency? heaven forbid...
I think in future I'll just point to the relevant part of the
spec and be done with it :-p
--
Rob
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please
click here.