webForumDet fria alternativet

MySelect.add - Blir fel i Explorer

7 svar · 593 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Hej,

Jag fyller ett par <select> listor dynamiskt med ajax.
Problemet är att det fungerar inte i Explorer 7, får "Typmatchningsfel".

Koden som skapas kan se ut såhär:

var level_x0 = document.createElement("option"); 
level_x0.value = 1; 
level_x0.className = "row-odd"; 
level_x0.appendChild(document.createTextNode("Nivå 1")); 
[b]selectMenu.add(level_x0,null); [/b]

var level_x1 = document.createElement("option"); 
level_x1.value = 2; 
level_x1.className = "row-even"; 
level_x1.appendChild(document.createTextNode("Nivå 2")); 
[b]selectMenu.add(level_x1,null); [/b]

var level_x2 = document.createElement("option"); 
level_x2.value = 3; 
level_x2.className = "row-odd"; 
level_x2.appendChild(document.createTextNode("Nivå 3 & 4")); 
[b]selectMenu.add(level_x2,null); [/b]

Det är de fetstilta raderna som blir fel.

Syntaxen för 'add' ska se ut såhär:

void add(in HTMLElement element, in HTMLElement before) raises(DOMException);

Koden som fyller listan ser ut såhär:

function createLevelList(index, predef_group)
{
	var selectMenu = getElemRefs("level_id");
	while (selectMenu.hasChildNodes()) {
		selectMenu.removeChild(selectMenu.firstChild);
	}
	try {
		[b]eval(ajax[index].response);[/b]
	} catch(err) {
		alert(err.description + "\n\n" + ajax[index].response);
	}
	getGroupList(document.forms['not_edit'].level_id, (predef_group ? predef_group : 0));
}

Funkar som sagt i Firefox..

Hur löser jag det här?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#2

Nu har jag gjort om lite så att output'en från Ajax ser ut såhär:

var level_x0 = document.createElement("option");
level_x0.value = 0;
level_x0.className = "row-even";
level_x0.appendChild(document.createTextNode("-- välj --"));
var level_x1 = document.createElement("option");
level_x1.value = 1;
level_x1.className = "row-even";
level_x1.appendChild(document.createTextNode("Nivå 1"));
var level_x2 = document.createElement("option");
level_x2.value = 2;
level_x2.className = "row-odd";
level_x2.appendChild(document.createTextNode("Nivå 2"));
var level_x3 = document.createElement("option");
level_x3.value = 3;
level_x3.className = "row-even";
level_x3.appendChild(document.createTextNode("Nivå 3 & 4"));
var elOptOld = selectMenu.options[selectMenu.selectedIndex];
try {
	selectMenu.add(level_x0, elOptOld);
	selectMenu.add(level_x1, elOptOld);
	selectMenu.add(level_x2, elOptOld);
	selectMenu.add(level_x3, elOptOld);

} catch(ex) {
	selectMenu.add(level_x0, selectMenu.selectedIndex);
	selectMenu.add(level_x1, selectMenu.selectedIndex);
	selectMenu.add(level_x2, selectMenu.selectedIndex);
	selectMenu.add(level_x3, selectMenu.selectedIndex);
}

Läste här att man var tvungen att köra en specialare med try..catch för att det skulle funka i Explorer. Problemet just nu är att det även lade av i Firefox, utan att jag får något felmeddelande.

Några förslag?

Peter SMedlem sedan dec. 20025 483 inlägg
#3

I stället för att säga select.add(option) så kan du testa:

selectMenu.options[selectMenu.options.length] = level_x0;
selectMenu.options[selectMenu.options.length] = level_x1;
...
selectMenu.options[selectMenu.options.length] = level_xN;
MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Nu ser min output ut såhär:

var level_x0 = document.createElement("option");
level_x0.value = 0;
level_x0.className = "row-even";
level_x0.appendChild(document.createTextNode("-- välj --"));
var level_x1 = document.createElement("option");
level_x1.value = 1;
level_x1.className = "row-even";
level_x1.appendChild(document.createTextNode("Nivå 1"));
var level_x2 = document.createElement("option");
level_x2.value = 2;
level_x2.className = "row-odd";
level_x2.appendChild(document.createTextNode("Nivå 2"));
var level_x3 = document.createElement("option");
level_x3.value = 3;
level_x3.className = "row-even";
level_x3.appendChild(document.createTextNode("Nivå 3 & 4"));
try {
   selectMenu.options[selectMenu.options.length] = level_x0;
   selectMenu.options[selectMenu.options.length] = level_x1;
   selectMenu.options[selectMenu.options.length] = level_x2; 
   selectMenu.options[selectMenu.options.length] = level_x3;

} catch(ex) {
   selectMenu.options[selectMenu.options.length] = level_x0;
   selectMenu.options[selectMenu.options.length] = level_x1;
   selectMenu.options[selectMenu.options.length] = level_x2;
   selectMenu.options[selectMenu.options.length] = level_x3;
}

Fungerar fint i Firefox fortfarande, men i Explorer får jag:

Objektet stöder inte egenskapen eller metoden.

Vad är fel?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#5

Det här är helt sinnessjukt, jag har tagit exemplet härifrån: http://www.mredkj.com/tutorials/tutorial005.html

Den sidan funkar både i Firefox och i Explorer, min kod är ju identiskt. Förstår inte det här..

Peter SMedlem sedan dec. 20025 483 inlägg
#6

Efter lite forskning visade det sig att följande gäller för Internet Explorer: antingen skriver man

var elm = document.createElement("option");
selectMenu.options.add(elm);
elm.innerHTML = "...";

...d.v.s. man anropar add() på options och sätter egenskaperna på elm efter att det add():ats.

Eller så skriver man så här (som också fungerar i ex. FF):

var elm = new Option("...");
selecMenu.options[selectMenu.options.length] = elm;
MickeA.comMedlem sedan feb. 20034 441 inlägg
#7

Okej, jag kan inte lösa det enligt ditt andra exempel, eftersom inte verkar gå att sätta t.ex. klassnamn på varje option jag lägger till.

Eller går det?
Annars får jag generera olika output beroende på webbläsare och det känns lite onödigt.
Hur kan det komma sig att det fungerar på länken jag hänvisar till ovan (http://www.mredkj.com/tutorials/tutorial005.html)?

Där sätter dom egenskaperna innan .add

MickeA.comMedlem sedan feb. 20034 441 inlägg
#8

Yes, har löst det...

Det här funkar:

var level_x0 = document.createElement("option");
level_x0.text = "-- välj --";
level_x0.value = 0;
level_x0.className = "row-even";
var level_x1 = document.createElement("option");
level_x1.value = 1;
level_x1.className = "row-even";
level_x1.text = "Nivå 1";
var level_x2 = document.createElement("option");
level_x2.value = 2;
level_x2.className = "row-odd";
level_x2.text = "Nivå 2";
var level_x3 = document.createElement("option");
level_x3.value = 3;
level_x3.className = "row-even";
level_x3.text = "Nivå 3 & 4";
try {
	selectMenu.add(level_x0, null);
selectMenu.add(level_x1, null);
selectMenu.add(level_x2, null);
selectMenu.add(level_x3, null);

	} catch(ex) {
		selectMenu.add(level_x0);
selectMenu.add(level_x1);
selectMenu.add(level_x2);
selectMenu.add(level_x3);

	}

Jag bytte ut .appendChild(document.createTextNode()); mot .text

136 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)