Microsoft poskytuje kvalitnú technickú podporu k svojim produktom, technik
z MS mi dokázal dať riešenie problému a chyba
s tlačidlom <button>
, ktorú obsahuje Internet
Explorer, sa dá pomocou JS opraviť.
Internet Explorer vždy odosiela vo formulári text, ktorý sa
zobrazuje ako popisok (label) tlačidla. V prípade tlačidla <button>
to predstavuje hodnota innerText
.
When the BUTTON element is submitted in a form, the innerText value is submitted.
Riešením je definovať atribút value
a pri odoslaní
formuláru zmeniť hodnotu innerText na hodnotu definovanú vo
value
. Tu však nastáva problém: IE nesprávne vyhodnotí vlastnosť
value
aj metódu getAttribute('value')
.
<html>
<body>
<form method="get" action="login.cgi" onsubmit="submit();">
<button type="submit" id="btnAction" name="action" value="login">Prihlásiť</button>
</form>
</body>
</html>
function submit() {
var e = document.getElementById('btnAction');
alert(e.value);
alert(e.innerText);
alert(e.getAttribute('value'));
}
Vyzerá to, akoby IE nedokázal vrátiť skutočnú, definovanú hodnotu
atribútu value
. Technická podpora Microsoftu mi však bola
schopná povedať, ako túto hodnotu získať:
var e = document.getElementById('btnAction');
alert(e.attributes['value'].value);
K atribútu treba pristupovať kolekciou attributes
, ktorá
vráti objekt attribute
,
čiže hodnotu atribútu získame pomocou vlastnosti value
.
funkia submit()
, opravujúca odosielanie dát, teda bude
vyzerať takto:
function submit() {
var e = document.getElementById('btnAction');
e.value = e.attributes['value'].value;
}
Toto riešenie má však menšiu chybičku krásy: IE zmení aj zobrazovaný
text tlačidla, potom odošle dáta na server a zobrazí novú stránku.
Chvíľu teda tlačidlo obsahuje zobrazenú hodnotu vlasnosti
value
. Ak niekto pozná riešenie, ako tomuto zabrániť,
poprosím ho zapísať to do komentárov.
Fred says:
Ještě jeden input hidden a přeposlat tu hodnotu. Nebudu zkoumat Texy, abych to sem poslal.
Prihlásiť
Jozef Izso says:
Skrytý input#hidden by sa dal tiež použiť: musel by mať rovnaké meno ako submit button, priradila by sa mu hodnota a submitu by sa názov odstránil, pretože na server by sa odoslal ten názov 2×.
Toto riešenie je možné ešte vylepšovať. Hlavne som chcel ukázať možnosť použitia kolekcie
attributes
.Róbert Polomský says:
Ďakujem za dobrý tip. Má to síce chybičku krásy: tlačítko sa tesne pred odoslaním na chvíľu viditeľne zmení na tlačítko s nastavenou hodnotou, ale je to najjednoduchšie a najčistejšie riešenie, aké som na nete našiel.
… a ešte detail: nepoužívajte meno funkcie submit(), ako je spomenuté v príklade, ale niečo iné. Napr. submitMe(). Ináč to jednoducho nepôjde