MSIE a element button: riešenie

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.

0 thoughts on “MSIE a element button: riešenie

  • Ještě jeden input hidden a přeposlat tu hodnotu. Nebudu zkoumat Texy, abych to sem poslal.

    Prihlásiť

  • 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 ;)

Comments are closed.